From 027cbaf9f99beca000ee3a3e9fe58f49e6c2f77d Mon Sep 17 00:00:00 2001 From: "press0@gmail.com" Date: Sat, 8 Oct 2022 21:41:57 -0500 Subject: [PATCH 001/592] simplify with comparingByValue() --- .../java/com/baeldung/map/mapmax/MapMax.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java index 8c33c857ee..99b57b398a 100644 --- a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java +++ b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java @@ -1,7 +1,11 @@ package com.baeldung.map.mapmax; -import java.util.*; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; import java.util.Map.Entry; +import java.util.Optional; public class MapMax { @@ -34,15 +38,14 @@ public class MapMax { public > V maxUsingCollectionsMaxAndLambda(Map map) { - Entry maxEntry = Collections.max(map.entrySet(), (Entry e1, Entry e2) -> e1.getValue() - .compareTo(e2.getValue())); + Entry maxEntry = Collections.max(map.entrySet(), Entry.comparingByValue()); return maxEntry.getValue(); } public > V maxUsingCollectionsMaxAndMethodReference(Map map) { - Entry maxEntry = Collections.max(map.entrySet(), Comparator.comparing(Map.Entry::getValue)); + Entry maxEntry = Collections.max(map.entrySet(), Entry.comparingByValue()); return maxEntry.getValue(); } @@ -51,8 +54,7 @@ public class MapMax { Optional> maxEntry = map.entrySet() .stream() - .max((Entry e1, Entry e2) -> e1.getValue() - .compareTo(e2.getValue())); + .max(Entry.comparingByValue()); return maxEntry.get() .getValue(); @@ -62,7 +64,7 @@ public class MapMax { Optional> maxEntry = map.entrySet() .stream() - .max(Comparator.comparing(Map.Entry::getValue)); + .max(Entry.comparingByValue()); return maxEntry.get() .getValue(); From 1ad0c04839f6cf94154c359bd5f74b69ed45d711 Mon Sep 17 00:00:00 2001 From: "press0@gmail.com" Date: Sat, 8 Oct 2022 22:13:18 -0500 Subject: [PATCH 002/592] simplify with comparingByValue() --- .../src/main/java/com/baeldung/map/mapmax/MapMax.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java index 99b57b398a..11443865c7 100644 --- a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java +++ b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java @@ -1,7 +1,6 @@ package com.baeldung.map.mapmax; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -26,12 +25,7 @@ public class MapMax { public > V maxUsingCollectionsMax(Map map) { - Entry maxEntry = Collections.max(map.entrySet(), new Comparator>() { - public int compare(Entry e1, Entry e2) { - return e1.getValue() - .compareTo(e2.getValue()); - } - }); + Entry maxEntry = Collections.max(map.entrySet(), Entry.comparingByValue()); return maxEntry.getValue(); } @@ -72,7 +66,7 @@ public class MapMax { public static void main(String[] args) { - Map map = new HashMap(); + Map map = new HashMap<>(); map.put(1, 3); map.put(2, 4); From 5eab831bb568a895ce056a627079be30cda5e6a7 Mon Sep 17 00:00:00 2001 From: "press0@gmail.com" Date: Sat, 8 Oct 2022 22:30:21 -0500 Subject: [PATCH 003/592] . --- .../java/com/baeldung/map/mapmax/MapMax.java | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java index 11443865c7..36b839ad5f 100644 --- a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java +++ b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java @@ -1,6 +1,7 @@ package com.baeldung.map.mapmax; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -25,48 +26,48 @@ public class MapMax { public > V maxUsingCollectionsMax(Map map) { - Entry maxEntry = Collections.max(map.entrySet(), Entry.comparingByValue()); - + Entry maxEntry = Collections.max(map.entrySet(), new Comparator>() { + public int compare(Entry e1, Entry e2) { + return e1.getValue() + .compareTo(e2.getValue()); + } + }); return maxEntry.getValue(); } public > V maxUsingCollectionsMaxAndLambda(Map map) { - - Entry maxEntry = Collections.max(map.entrySet(), Entry.comparingByValue()); - + Entry maxEntry = Collections.max(map.entrySet(), (Entry e1, Entry e2) -> e1.getValue() + .compareTo(e2.getValue())); return maxEntry.getValue(); } public > V maxUsingCollectionsMaxAndMethodReference(Map map) { - Entry maxEntry = Collections.max(map.entrySet(), Entry.comparingByValue()); + Entry maxEntry = Collections.max(map.entrySet(), Comparator.comparing(Map.Entry::getValue)); return maxEntry.getValue(); } public > V maxUsingStreamAndLambda(Map map) { - Optional> maxEntry = map.entrySet() - .stream() - .max(Entry.comparingByValue()); + .stream() + .max((Entry e1, Entry e2) -> e1.getValue() + .compareTo(e2.getValue())); - return maxEntry.get() - .getValue(); + return maxEntry.get().getValue(); } public > V maxUsingStreamAndMethodReference(Map map) { - Optional> maxEntry = map.entrySet() - .stream() - .max(Entry.comparingByValue()); - + .stream() + .max(Comparator.comparing(Map.Entry::getValue)); return maxEntry.get() - .getValue(); + .getValue(); } public static void main(String[] args) { - Map map = new HashMap<>(); + Map map = new HashMap(); map.put(1, 3); map.put(2, 4); From 083b1b42d728cc65df5149fceff77e1496b17c70 Mon Sep 17 00:00:00 2001 From: Amar Wadhwani Date: Fri, 14 Oct 2022 20:16:00 +0530 Subject: [PATCH 004/592] BAEL-5715 Updated Code --- .../baeldung/postman/PostmanUploadDemo.java | 15 +++++++ .../controller/PostmanUploadController.java | 24 +++++++++++ .../baeldung/postman/model/JsonRequest.java | 30 +++++++++++++ .../PostmanUploadControllerTest.java | 43 +++++++++++++++++++ 4 files changed, 112 insertions(+) create mode 100644 spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/postman/PostmanUploadDemo.java create mode 100644 spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/postman/controller/PostmanUploadController.java create mode 100644 spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/postman/model/JsonRequest.java create mode 100644 spring-boot-modules/spring-boot-mvc-4/src/test/java/com/baeldung/postman/controller/PostmanUploadControllerTest.java diff --git a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/postman/PostmanUploadDemo.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/postman/PostmanUploadDemo.java new file mode 100644 index 0000000000..b3721fefe4 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/postman/PostmanUploadDemo.java @@ -0,0 +1,15 @@ +package com.baeldung.postman; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +@SpringBootApplication +@EnableWebMvc +public class PostmanUploadDemo { + + public static void main(String[] args) { + SpringApplication.run(PostmanUploadDemo.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/postman/controller/PostmanUploadController.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/postman/controller/PostmanUploadController.java new file mode 100644 index 0000000000..3ee5cf28e5 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/postman/controller/PostmanUploadController.java @@ -0,0 +1,24 @@ +package com.baeldung.postman.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import com.baeldung.postman.model.JsonRequest; + +@Controller +public class PostmanUploadController { + + @PostMapping("/uploadFile") + public ResponseEntity handleFileUpload(@RequestParam("file") MultipartFile file){ + return ResponseEntity.ok().body("file received successfully"); + } + + @PostMapping("/uploadJson") + public ResponseEntity handleJsonInput(@RequestBody JsonRequest json){ + return ResponseEntity.ok().body(json.getId()+json.getName()); + } +} diff --git a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/postman/model/JsonRequest.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/postman/model/JsonRequest.java new file mode 100644 index 0000000000..326f32c30b --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/postman/model/JsonRequest.java @@ -0,0 +1,30 @@ +package com.baeldung.postman.model; + +public class JsonRequest { + int id; + String name; + + public JsonRequest() { + } + + public JsonRequest(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/spring-boot-modules/spring-boot-mvc-4/src/test/java/com/baeldung/postman/controller/PostmanUploadControllerTest.java b/spring-boot-modules/spring-boot-mvc-4/src/test/java/com/baeldung/postman/controller/PostmanUploadControllerTest.java new file mode 100644 index 0000000000..bf010f50e8 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-4/src/test/java/com/baeldung/postman/controller/PostmanUploadControllerTest.java @@ -0,0 +1,43 @@ +package com.baeldung.postman.controller; + +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.http.MediaType; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import com.baeldung.postman.PostmanUploadDemo; +import com.baeldung.postman.model.JsonRequest; +import com.fasterxml.jackson.databind.ObjectMapper; + +@SpringBootTest(classes = PostmanUploadDemo.class) +@AutoConfigureMockMvc +public class PostmanUploadControllerTest { + @Autowired + private MockMvc mockMvc; + + @Test + public void givenJson_whenUploaded_thenSuccessReturned() throws Exception { + JsonRequest request = new JsonRequest(1, "John Doe"); + this.mockMvc.perform(MockMvcRequestBuilders.post("/uploadJson") + .contentType(MediaType.APPLICATION_JSON) + .content(new ObjectMapper().writeValueAsString(request))) + .andExpect(status().isOk()) + .andExpect(content().string("1John Doe")); + } + + @Test + public void givenFile_whenUploaded_thenSuccessReturned() throws Exception { + MockMultipartFile request = new MockMultipartFile("dummy", "{\"key\": \"value\"}".getBytes()); + this.mockMvc.perform(MockMvcRequestBuilders.multipart("/uploadFile") + .file("file", request.getBytes())) + .andExpect(status().isOk()) + .andExpect(content().string("file received successfully")); + } +} From f40f203e9eb6f4a4d8a505c7bfdfc6c4dde412eb Mon Sep 17 00:00:00 2001 From: Amar Wadhwani Date: Fri, 14 Oct 2022 20:43:54 +0530 Subject: [PATCH 005/592] BAEL-5715 Updated Code --- ...ControllerTest.java => PostmanUploadControllerUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-boot-modules/spring-boot-mvc-4/src/test/java/com/baeldung/postman/controller/{PostmanUploadControllerTest.java => PostmanUploadControllerUnitTest.java} (97%) diff --git a/spring-boot-modules/spring-boot-mvc-4/src/test/java/com/baeldung/postman/controller/PostmanUploadControllerTest.java b/spring-boot-modules/spring-boot-mvc-4/src/test/java/com/baeldung/postman/controller/PostmanUploadControllerUnitTest.java similarity index 97% rename from spring-boot-modules/spring-boot-mvc-4/src/test/java/com/baeldung/postman/controller/PostmanUploadControllerTest.java rename to spring-boot-modules/spring-boot-mvc-4/src/test/java/com/baeldung/postman/controller/PostmanUploadControllerUnitTest.java index bf010f50e8..1049d2ec0d 100644 --- a/spring-boot-modules/spring-boot-mvc-4/src/test/java/com/baeldung/postman/controller/PostmanUploadControllerTest.java +++ b/spring-boot-modules/spring-boot-mvc-4/src/test/java/com/baeldung/postman/controller/PostmanUploadControllerUnitTest.java @@ -18,7 +18,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; @SpringBootTest(classes = PostmanUploadDemo.class) @AutoConfigureMockMvc -public class PostmanUploadControllerTest { +public class PostmanUploadControllerUnitTest { @Autowired private MockMvc mockMvc; From 0c61184a4f6de1a39aa73c5d7a5734b739e549a8 Mon Sep 17 00:00:00 2001 From: Amar Wadhwani Date: Sat, 15 Oct 2022 11:04:57 +0530 Subject: [PATCH 006/592] BAEL-5715 Updated Code Formatting --- .../postman/controller/PostmanUploadController.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/postman/controller/PostmanUploadController.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/postman/controller/PostmanUploadController.java index 3ee5cf28e5..ac19110318 100644 --- a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/postman/controller/PostmanUploadController.java +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/postman/controller/PostmanUploadController.java @@ -13,12 +13,14 @@ import com.baeldung.postman.model.JsonRequest; public class PostmanUploadController { @PostMapping("/uploadFile") - public ResponseEntity handleFileUpload(@RequestParam("file") MultipartFile file){ - return ResponseEntity.ok().body("file received successfully"); + public ResponseEntity handleFileUpload(@RequestParam("file") MultipartFile file) { + return ResponseEntity.ok() + .body("file received successfully"); } @PostMapping("/uploadJson") - public ResponseEntity handleJsonInput(@RequestBody JsonRequest json){ - return ResponseEntity.ok().body(json.getId()+json.getName()); + public ResponseEntity handleJsonInput(@RequestBody JsonRequest json) { + return ResponseEntity.ok() + .body(json.getId() + json.getName()); } } From c1f5e966409e6954ad5b23d0f1e02b3a45251326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Pav=C3=B3n?= <55098325+FranPavon@users.noreply.github.com> Date: Wed, 19 Oct 2022 18:05:13 -0300 Subject: [PATCH 007/592] Update StatePatternUnitTest.java assertThat is now deprecated. New solution is assertTrue. --- .../com/baeldung/state/StatePatternUnitTest.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/patterns-modules/design-patterns-behavioral/src/test/java/com/baeldung/state/StatePatternUnitTest.java b/patterns-modules/design-patterns-behavioral/src/test/java/com/baeldung/state/StatePatternUnitTest.java index 731974f92b..98babf0ccd 100644 --- a/patterns-modules/design-patterns-behavioral/src/test/java/com/baeldung/state/StatePatternUnitTest.java +++ b/patterns-modules/design-patterns-behavioral/src/test/java/com/baeldung/state/StatePatternUnitTest.java @@ -1,11 +1,9 @@ package com.baeldung.state; import com.baeldung.state.Package; +import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.Assert.assertThat; -import static org.hamcrest.CoreMatchers.instanceOf; - -import org.junit.Test; +import org.junit.jupiter.api.Test; public class StatePatternUnitTest { @@ -13,13 +11,13 @@ public class StatePatternUnitTest { public void givenNewPackage_whenPackageReceived_thenStateReceived() { Package pkg = new Package(); - assertThat(pkg.getState(), instanceOf(OrderedState.class)); + assertTrue(pkg.getState() instanceof OrderedState); pkg.nextState(); - assertThat(pkg.getState(), instanceOf(DeliveredState.class)); + assertTrue(pkg.getState() instanceof DeliveredState); pkg.nextState(); - assertThat(pkg.getState(), instanceOf(ReceivedState.class)); + assertTrue(pkg.getState() instanceof ReceivedState); } @Test @@ -28,6 +26,6 @@ public class StatePatternUnitTest { pkg.setState(new DeliveredState()); pkg.previousState(); - assertThat(pkg.getState(), instanceOf(OrderedState.class)); + assertTrue(pkg.getState() instanceof OrderedState); } } From 57b666b08564ec71799ff5c1e7e8b8ea5fa31f70 Mon Sep 17 00:00:00 2001 From: "press0@gmail.com" Date: Tue, 8 Nov 2022 07:32:12 -0600 Subject: [PATCH 008/592] fix logger class ref --- .../RunnableCompletionCheckerWithThreadPoolExecutor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/donerunnables/RunnableCompletionCheckerWithThreadPoolExecutor.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/donerunnables/RunnableCompletionCheckerWithThreadPoolExecutor.java index 17a13a1c19..aba75c5a3d 100644 --- a/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/donerunnables/RunnableCompletionCheckerWithThreadPoolExecutor.java +++ b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/donerunnables/RunnableCompletionCheckerWithThreadPoolExecutor.java @@ -12,7 +12,7 @@ import org.slf4j.LoggerFactory; public class RunnableCompletionCheckerWithThreadPoolExecutor { - private static final Logger LOGGER = LoggerFactory.getLogger(RunnableCompletionCheckerWithCompletableFuture.class); + private static final Logger LOGGER = LoggerFactory.getLogger(RunnableCompletionCheckerWithThreadPoolExecutor.class); private static final int NUMBER_OF_RUNNABLES = 5; private static final int PAUSE_MILLIS = 1000; private static final int NUMBER_OF_THREADS = 5; From 7d1c17443b366fb57e18eb3a19dffe14af8ffc0c Mon Sep 17 00:00:00 2001 From: "press0@gmail.com" Date: Tue, 8 Nov 2022 07:49:28 -0600 Subject: [PATCH 009/592] revert MapMax --- .../java/com/baeldung/map/mapmax/MapMax.java | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java index 36b839ad5f..8c33c857ee 100644 --- a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java +++ b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java @@ -1,11 +1,7 @@ package com.baeldung.map.mapmax; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Optional; public class MapMax { @@ -29,15 +25,18 @@ public class MapMax { Entry maxEntry = Collections.max(map.entrySet(), new Comparator>() { public int compare(Entry e1, Entry e2) { return e1.getValue() - .compareTo(e2.getValue()); + .compareTo(e2.getValue()); } }); + return maxEntry.getValue(); } public > V maxUsingCollectionsMaxAndLambda(Map map) { + Entry maxEntry = Collections.max(map.entrySet(), (Entry e1, Entry e2) -> e1.getValue() - .compareTo(e2.getValue())); + .compareTo(e2.getValue())); + return maxEntry.getValue(); } @@ -49,20 +48,24 @@ public class MapMax { } public > V maxUsingStreamAndLambda(Map map) { + Optional> maxEntry = map.entrySet() - .stream() - .max((Entry e1, Entry e2) -> e1.getValue() + .stream() + .max((Entry e1, Entry e2) -> e1.getValue() .compareTo(e2.getValue())); - return maxEntry.get().getValue(); + return maxEntry.get() + .getValue(); } public > V maxUsingStreamAndMethodReference(Map map) { + Optional> maxEntry = map.entrySet() - .stream() - .max(Comparator.comparing(Map.Entry::getValue)); + .stream() + .max(Comparator.comparing(Map.Entry::getValue)); + return maxEntry.get() - .getValue(); + .getValue(); } public static void main(String[] args) { From 576f9c9eafa17e9f3bb13e2c85d2ef4516620a3c Mon Sep 17 00:00:00 2001 From: exaucae Date: Fri, 11 Nov 2022 23:43:57 +0000 Subject: [PATCH 010/592] feat: print hello world with Java down calling C --- java-panama/pom.xml | 46 +++++++++++++++++++ .../com/baeldung/java/panama/HelloWorld.java | 42 +++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 java-panama/pom.xml create mode 100644 java-panama/src/main/java/com/baeldung/java/panama/HelloWorld.java diff --git a/java-panama/pom.xml b/java-panama/pom.xml new file mode 100644 index 0000000000..ad711d0718 --- /dev/null +++ b/java-panama/pom.xml @@ -0,0 +1,46 @@ + + 4.0.0 + + com.baeldung.java.panama + java-panama + 1.0-SNAPSHOT + jar + + java-panama + https://maven.apache.org + + + UTF-8 + 19 + 19 + 3.10.1 + + + + + org.junit.jupiter + junit-jupiter + 5.9.0 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + --add-opens=java.base/java.lang.foreign=ALL-UNNAMED + --enable-preview + + + + + + diff --git a/java-panama/src/main/java/com/baeldung/java/panama/HelloWorld.java b/java-panama/src/main/java/com/baeldung/java/panama/HelloWorld.java new file mode 100644 index 0000000000..060a8552ef --- /dev/null +++ b/java-panama/src/main/java/com/baeldung/java/panama/HelloWorld.java @@ -0,0 +1,42 @@ +package com.baeldung.java.panama; + +import java.lang.foreign.*; +import java.lang.invoke.MethodHandle; +import java.util.Objects; + +import static java.lang.foreign.ValueLayout.ADDRESS; +import static java.lang.foreign.ValueLayout.JAVA_INT; + + +public class HelloWorld { + + public static void main(String[] args) throws Throwable { + + String symbolName = "printf"; + String greetings = "Hello World from Project Panama Baeldung Article"; + + Linker nativeLinker = Linker.nativeLinker(); + SymbolLookup stdlibLookup = nativeLinker.defaultLookup(); + SymbolLookup loaderLookup = SymbolLookup.loaderLookup(); + + FunctionDescriptor functionDescriptor = FunctionDescriptor.of( + JAVA_INT.withBitAlignment(32), + ADDRESS.withBitAlignment(64) + ); + + MethodHandle methodHandle = + loaderLookup.lookup(symbolName) + .or(() -> stdlibLookup.lookup(symbolName)) + .map( + symbolAddress -> nativeLinker.downcallHandle(symbolAddress, functionDescriptor) + ).orElse(null); + + + Objects.requireNonNull(methodHandle); + + try (MemorySession memorySession = MemorySession.openConfined()) { + MemorySegment nativeGreetings = memorySession.allocateUtf8String(greetings + "\n"); + methodHandle.invoke(nativeGreetings); + } + } +} From 7e1a06e2e6af2410674f0b3cb90dfdbc7172a2fb Mon Sep 17 00:00:00 2001 From: exaucae Date: Sat, 12 Nov 2022 00:21:08 +0000 Subject: [PATCH 011/592] refactor: curate hello world sample Remove noisy bits --- .../com/baeldung/java/panama/HelloWorld.java | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/java-panama/src/main/java/com/baeldung/java/panama/HelloWorld.java b/java-panama/src/main/java/com/baeldung/java/panama/HelloWorld.java index 060a8552ef..79c57cdbc4 100644 --- a/java-panama/src/main/java/com/baeldung/java/panama/HelloWorld.java +++ b/java-panama/src/main/java/com/baeldung/java/panama/HelloWorld.java @@ -13,30 +13,25 @@ public class HelloWorld { public static void main(String[] args) throws Throwable { String symbolName = "printf"; - String greetings = "Hello World from Project Panama Baeldung Article"; + String greeting = "Hello World from Project Panama Baeldung Article"; Linker nativeLinker = Linker.nativeLinker(); SymbolLookup stdlibLookup = nativeLinker.defaultLookup(); SymbolLookup loaderLookup = SymbolLookup.loaderLookup(); - FunctionDescriptor functionDescriptor = FunctionDescriptor.of( - JAVA_INT.withBitAlignment(32), - ADDRESS.withBitAlignment(64) - ); + FunctionDescriptor descriptor = FunctionDescriptor.of(JAVA_INT, ADDRESS); - MethodHandle methodHandle = - loaderLookup.lookup(symbolName) - .or(() -> stdlibLookup.lookup(symbolName)) - .map( - symbolAddress -> nativeLinker.downcallHandle(symbolAddress, functionDescriptor) - ).orElse(null); + MethodHandle methodHandle = loaderLookup.lookup(symbolName) + .or(() -> stdlibLookup.lookup(symbolName)) + .map(symbolSegment -> nativeLinker.downcallHandle(symbolSegment, descriptor)) + .orElse(null); Objects.requireNonNull(methodHandle); try (MemorySession memorySession = MemorySession.openConfined()) { - MemorySegment nativeGreetings = memorySession.allocateUtf8String(greetings + "\n"); - methodHandle.invoke(nativeGreetings); + MemorySegment greetingSegment = memorySession.allocateUtf8String(greeting); + methodHandle.invoke(greetingSegment); } } } From bf057db224a8dc35a5e8a79a34728c1f39d3c270 Mon Sep 17 00:00:00 2001 From: Ehsan Sasanianno Date: Sat, 19 Nov 2022 17:11:59 +0100 Subject: [PATCH 012/592] update bucket4j version in spring-boot-libraries --- spring-boot-modules/spring-boot-libraries/pom.xml | 4 ++-- .../bucket4japp/service/PricingPlanService.java | 3 +-- .../bucket4japp/Bucket4jUsageUnitTest.java | 15 +++++++-------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/spring-boot-modules/spring-boot-libraries/pom.xml b/spring-boot-modules/spring-boot-libraries/pom.xml index 7ac7043abc..d8ca53f013 100644 --- a/spring-boot-modules/spring-boot-libraries/pom.xml +++ b/spring-boot-modules/spring-boot-libraries/pom.xml @@ -226,8 +226,8 @@ 2.1 2.6.0 3.3.0 - 4.10.0 - 0.2.0 + 7.6.0 + 0.7.0 2.8.2 diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlanService.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlanService.java index 7d8a718601..c4f7747171 100644 --- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlanService.java +++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/ratelimiting/bucket4japp/service/PricingPlanService.java @@ -7,7 +7,6 @@ import org.springframework.stereotype.Service; import io.github.bucket4j.Bandwidth; import io.github.bucket4j.Bucket; -import io.github.bucket4j.Bucket4j; @Service public class PricingPlanService { @@ -24,7 +23,7 @@ public class PricingPlanService { } private Bucket bucket(Bandwidth limit) { - return Bucket4j.builder() + return Bucket.builder() .addLimit(limit) .build(); } diff --git a/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jUsageUnitTest.java b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jUsageUnitTest.java index fbf63ba403..8b9fba6dd3 100644 --- a/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jUsageUnitTest.java +++ b/spring-boot-modules/spring-boot-libraries/src/test/java/com/baeldung/ratelimiting/bucket4japp/Bucket4jUsageUnitTest.java @@ -1,7 +1,7 @@ package com.baeldung.ratelimiting.bucket4japp; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.time.Duration; import java.util.concurrent.CountDownLatch; @@ -13,7 +13,6 @@ import org.junit.jupiter.api.Test; import io.github.bucket4j.Bandwidth; import io.github.bucket4j.Bucket; -import io.github.bucket4j.Bucket4j; import io.github.bucket4j.Refill; public class Bucket4jUsageUnitTest { @@ -22,7 +21,7 @@ public class Bucket4jUsageUnitTest { public void givenBucketLimit_whenExceedLimit_thenConsumeReturnsFalse() { Refill refill = Refill.intervally(10, Duration.ofMinutes(1)); Bandwidth limit = Bandwidth.classic(10, refill); - Bucket bucket = Bucket4j.builder() + Bucket bucket = Bucket.builder() .addLimit(limit) .build(); @@ -34,7 +33,7 @@ public class Bucket4jUsageUnitTest { @Test public void givenMultipletLimits_whenExceedSmallerLimit_thenConsumeReturnsFalse() { - Bucket bucket = Bucket4j.builder() + Bucket bucket = Bucket.builder() .addLimit(Bandwidth.classic(10, Refill.intervally(10, Duration.ofMinutes(1)))) .addLimit(Bandwidth.classic(5, Refill.intervally(5, Duration.ofSeconds(20)))) .build(); @@ -49,7 +48,7 @@ public class Bucket4jUsageUnitTest { public void givenBucketLimit_whenThrottleRequests_thenConsumeReturnsTrue() throws InterruptedException { Refill refill = Refill.intervally(1, Duration.ofSeconds(2)); Bandwidth limit = Bandwidth.classic(1, refill); - Bucket bucket = Bucket4j.builder() + Bucket bucket = Bucket.builder() .addLimit(limit) .build(); @@ -65,8 +64,8 @@ public class Bucket4jUsageUnitTest { static class AssertTryConsume implements Runnable { - private Bucket bucket; - private CountDownLatch latch; + private final Bucket bucket; + private final CountDownLatch latch; AssertTryConsume(Bucket bucket, CountDownLatch latch) { this.bucket = bucket; From 3c57c4d5663bcdf376a0892910dfabb6db1d9543 Mon Sep 17 00:00:00 2001 From: Ssam Date: Sun, 20 Nov 2022 12:15:45 +0000 Subject: [PATCH 013/592] move article files to new module --- core-java-modules/core-java-jvm-2/README.md | 3 +-- .../resource/ClassGetResourceExample.java | 19 --------------- .../ClassLoaderGetResourceExample.java | 21 ----------------- .../com/baeldung/resource/example.txt | 1 - .../resource/ClassGetResourceUnitTest.java | 21 ----------------- .../ClassLoaderGetResourceUnitTest.java | 23 ------------------- core-java-modules/pom.xml | 1 + 7 files changed, 2 insertions(+), 87 deletions(-) delete mode 100644 core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/resource/ClassGetResourceExample.java delete mode 100644 core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/resource/ClassLoaderGetResourceExample.java delete mode 100644 core-java-modules/core-java-jvm-2/src/main/resources/com/baeldung/resource/example.txt delete mode 100644 core-java-modules/core-java-jvm-2/src/test/java/com/baeldung/resource/ClassGetResourceUnitTest.java delete mode 100644 core-java-modules/core-java-jvm-2/src/test/java/com/baeldung/resource/ClassLoaderGetResourceUnitTest.java diff --git a/core-java-modules/core-java-jvm-2/README.md b/core-java-modules/core-java-jvm-2/README.md index 1313a1ce48..b00618a751 100644 --- a/core-java-modules/core-java-jvm-2/README.md +++ b/core-java-modules/core-java-jvm-2/README.md @@ -14,5 +14,4 @@ This module contains articles about working with the Java Virtual Machine (JVM). - [An Introduction to the Constant Pool in the JVM](https://www.baeldung.com/jvm-constant-pool) - [List All the Classes Loaded in the JVM](https://www.baeldung.com/jvm-list-all-classes-loaded) - [Static Fields and Garbage Collection](https://www.baeldung.com/java-static-fields-gc) -- [Difference Between Class.getResource() and ClassLoader.getResource()](https://www.baeldung.com/java-class-vs-classloader-getresource) -- More articles: [[<-- prev]](/core-java-modules/core-java-jvm) +- More articles: [[<-- prev]](/core-java-modules/core-java-jvm) [[next -->]](/core-java-modules/core-java-jvm-3) diff --git a/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/resource/ClassGetResourceExample.java b/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/resource/ClassGetResourceExample.java deleted file mode 100644 index d843be1c43..0000000000 --- a/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/resource/ClassGetResourceExample.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.resource; - -import java.net.URL; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ClassGetResourceExample { - - private static Logger logger = LoggerFactory.getLogger(ClassGetResourceExample.class); - - public static void main(String[] args) { - URL resourceAbsolutePath = ClassGetResourceExample.class.getResource("/com/baeldung/resource/example.txt"); - logger.info("Resource with absolute path = {}", resourceAbsolutePath); - - URL resourceRelativePath = ClassGetResourceExample.class.getResource("example.txt"); - logger.info("Resource with relative path = {}", resourceRelativePath); - } -} \ No newline at end of file diff --git a/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/resource/ClassLoaderGetResourceExample.java b/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/resource/ClassLoaderGetResourceExample.java deleted file mode 100644 index e6ad06bd05..0000000000 --- a/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/resource/ClassLoaderGetResourceExample.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.resource; - -import java.net.URL; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ClassLoaderGetResourceExample { - - private static Logger logger = LoggerFactory.getLogger(ClassLoaderGetResourceExample.class); - - public static void main(String[] args) { - URL resourceAbsolutePath = ClassLoaderGetResourceExample.class.getClassLoader() - .getResource("com/baeldung/resource/example.txt"); - logger.info("Resource with absolute path = {}", resourceAbsolutePath); - - URL resourceRelativePath = ClassLoaderGetResourceExample.class.getClassLoader() - .getResource("example.txt"); - logger.info("Resource with relative path = {}", resourceRelativePath); - } -} diff --git a/core-java-modules/core-java-jvm-2/src/main/resources/com/baeldung/resource/example.txt b/core-java-modules/core-java-jvm-2/src/main/resources/com/baeldung/resource/example.txt deleted file mode 100644 index 61641e23e2..0000000000 --- a/core-java-modules/core-java-jvm-2/src/main/resources/com/baeldung/resource/example.txt +++ /dev/null @@ -1 +0,0 @@ -Baeldung \ No newline at end of file diff --git a/core-java-modules/core-java-jvm-2/src/test/java/com/baeldung/resource/ClassGetResourceUnitTest.java b/core-java-modules/core-java-jvm-2/src/test/java/com/baeldung/resource/ClassGetResourceUnitTest.java deleted file mode 100644 index fb0c88f4bb..0000000000 --- a/core-java-modules/core-java-jvm-2/src/test/java/com/baeldung/resource/ClassGetResourceUnitTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.resource; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.net.URL; - -class ClassGetResourceUnitTest { - - @Test - void givenRelativeResourcePath_whenGetResource_thenReturnResource() { - URL resourceRelativePath = ClassGetResourceExample.class.getResource("example.txt"); - Assertions.assertNotNull(resourceRelativePath); - } - - @Test - void givenAbsoluteResourcePath_whenGetResource_thenReturnResource() { - URL resourceAbsolutePath = ClassGetResourceExample.class.getResource("/com/baeldung/resource/example.txt"); - Assertions.assertNotNull(resourceAbsolutePath); - } -} diff --git a/core-java-modules/core-java-jvm-2/src/test/java/com/baeldung/resource/ClassLoaderGetResourceUnitTest.java b/core-java-modules/core-java-jvm-2/src/test/java/com/baeldung/resource/ClassLoaderGetResourceUnitTest.java deleted file mode 100644 index 54025c5404..0000000000 --- a/core-java-modules/core-java-jvm-2/src/test/java/com/baeldung/resource/ClassLoaderGetResourceUnitTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.resource; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.net.URL; - -class ClassLoaderGetResourceUnitTest { - - @Test - void givenRelativeResourcePath_whenGetResource_thenReturnNull() { - URL resourceRelativePath = ClassLoaderGetResourceExample.class.getClassLoader() - .getResource("example.txt"); - Assertions.assertNull(resourceRelativePath); - } - - @Test - void givenAbsoluteResourcePath_whenGetResource_thenReturnResource() { - URL resourceAbsolutePath = ClassLoaderGetResourceExample.class.getClassLoader() - .getResource("com/baeldung/resource/example.txt"); - Assertions.assertNotNull(resourceAbsolutePath); - } -} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 74bf4c662c..dfe9b46021 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -74,6 +74,7 @@ core-java-jndi core-java-jvm core-java-jvm-2 + core-java-jvm-3 core-java-lambdas core-java-lang core-java-lang-2 From 5e08af14a1b96d22116ea3ed7cdb64deb41cf213 Mon Sep 17 00:00:00 2001 From: Ssam Date: Sun, 20 Nov 2022 12:17:56 +0000 Subject: [PATCH 014/592] Include new module --- core-java-modules/core-java-jvm-3/README.md | 8 +++++++ core-java-modules/core-java-jvm-3/pom.xml | 21 +++++++++++++++++ .../resource/ClassGetResourceExample.java | 19 +++++++++++++++ .../ClassLoaderGetResourceExample.java | 21 +++++++++++++++++ .../com/baeldung/resource/example.txt | 1 + .../resource/ClassGetResourceUnitTest.java | 21 +++++++++++++++++ .../ClassLoaderGetResourceUnitTest.java | 23 +++++++++++++++++++ 7 files changed, 114 insertions(+) create mode 100644 core-java-modules/core-java-jvm-3/README.md create mode 100644 core-java-modules/core-java-jvm-3/pom.xml create mode 100644 core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/resource/ClassGetResourceExample.java create mode 100644 core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/resource/ClassLoaderGetResourceExample.java create mode 100644 core-java-modules/core-java-jvm-3/src/resources/com/baeldung/resource/example.txt create mode 100644 core-java-modules/core-java-jvm-3/test/java/com/baeldung/resource/ClassGetResourceUnitTest.java create mode 100644 core-java-modules/core-java-jvm-3/test/java/com/baeldung/resource/ClassLoaderGetResourceUnitTest.java diff --git a/core-java-modules/core-java-jvm-3/README.md b/core-java-modules/core-java-jvm-3/README.md new file mode 100644 index 0000000000..5c694edaa0 --- /dev/null +++ b/core-java-modules/core-java-jvm-3/README.md @@ -0,0 +1,8 @@ +## Core Java JVM Cookbooks and Examples + +This module contains articles about working with the Java Virtual Machine (JVM). + +### Relevant Articles: + +- [Difference Between Class.getResource() and ClassLoader.getResource()](https://www.baeldung.com/java-class-vs-classloader-getresource) +- More articles: [[<-- prev]](/core-java-modules/core-java-jvm-2) diff --git a/core-java-modules/core-java-jvm-3/pom.xml b/core-java-modules/core-java-jvm-3/pom.xml new file mode 100644 index 0000000000..86c3799c09 --- /dev/null +++ b/core-java-modules/core-java-jvm-3/pom.xml @@ -0,0 +1,21 @@ + + + 4.0.0 + core-java-jvm-3 + 0.1.0-SNAPSHOT + core-java-jvm-3 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/resource/ClassGetResourceExample.java b/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/resource/ClassGetResourceExample.java new file mode 100644 index 0000000000..d843be1c43 --- /dev/null +++ b/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/resource/ClassGetResourceExample.java @@ -0,0 +1,19 @@ +package com.baeldung.resource; + +import java.net.URL; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ClassGetResourceExample { + + private static Logger logger = LoggerFactory.getLogger(ClassGetResourceExample.class); + + public static void main(String[] args) { + URL resourceAbsolutePath = ClassGetResourceExample.class.getResource("/com/baeldung/resource/example.txt"); + logger.info("Resource with absolute path = {}", resourceAbsolutePath); + + URL resourceRelativePath = ClassGetResourceExample.class.getResource("example.txt"); + logger.info("Resource with relative path = {}", resourceRelativePath); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/resource/ClassLoaderGetResourceExample.java b/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/resource/ClassLoaderGetResourceExample.java new file mode 100644 index 0000000000..e6ad06bd05 --- /dev/null +++ b/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/resource/ClassLoaderGetResourceExample.java @@ -0,0 +1,21 @@ +package com.baeldung.resource; + +import java.net.URL; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ClassLoaderGetResourceExample { + + private static Logger logger = LoggerFactory.getLogger(ClassLoaderGetResourceExample.class); + + public static void main(String[] args) { + URL resourceAbsolutePath = ClassLoaderGetResourceExample.class.getClassLoader() + .getResource("com/baeldung/resource/example.txt"); + logger.info("Resource with absolute path = {}", resourceAbsolutePath); + + URL resourceRelativePath = ClassLoaderGetResourceExample.class.getClassLoader() + .getResource("example.txt"); + logger.info("Resource with relative path = {}", resourceRelativePath); + } +} diff --git a/core-java-modules/core-java-jvm-3/src/resources/com/baeldung/resource/example.txt b/core-java-modules/core-java-jvm-3/src/resources/com/baeldung/resource/example.txt new file mode 100644 index 0000000000..61641e23e2 --- /dev/null +++ b/core-java-modules/core-java-jvm-3/src/resources/com/baeldung/resource/example.txt @@ -0,0 +1 @@ +Baeldung \ No newline at end of file diff --git a/core-java-modules/core-java-jvm-3/test/java/com/baeldung/resource/ClassGetResourceUnitTest.java b/core-java-modules/core-java-jvm-3/test/java/com/baeldung/resource/ClassGetResourceUnitTest.java new file mode 100644 index 0000000000..fb0c88f4bb --- /dev/null +++ b/core-java-modules/core-java-jvm-3/test/java/com/baeldung/resource/ClassGetResourceUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.resource; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.net.URL; + +class ClassGetResourceUnitTest { + + @Test + void givenRelativeResourcePath_whenGetResource_thenReturnResource() { + URL resourceRelativePath = ClassGetResourceExample.class.getResource("example.txt"); + Assertions.assertNotNull(resourceRelativePath); + } + + @Test + void givenAbsoluteResourcePath_whenGetResource_thenReturnResource() { + URL resourceAbsolutePath = ClassGetResourceExample.class.getResource("/com/baeldung/resource/example.txt"); + Assertions.assertNotNull(resourceAbsolutePath); + } +} diff --git a/core-java-modules/core-java-jvm-3/test/java/com/baeldung/resource/ClassLoaderGetResourceUnitTest.java b/core-java-modules/core-java-jvm-3/test/java/com/baeldung/resource/ClassLoaderGetResourceUnitTest.java new file mode 100644 index 0000000000..54025c5404 --- /dev/null +++ b/core-java-modules/core-java-jvm-3/test/java/com/baeldung/resource/ClassLoaderGetResourceUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.resource; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.net.URL; + +class ClassLoaderGetResourceUnitTest { + + @Test + void givenRelativeResourcePath_whenGetResource_thenReturnNull() { + URL resourceRelativePath = ClassLoaderGetResourceExample.class.getClassLoader() + .getResource("example.txt"); + Assertions.assertNull(resourceRelativePath); + } + + @Test + void givenAbsoluteResourcePath_whenGetResource_thenReturnResource() { + URL resourceAbsolutePath = ClassLoaderGetResourceExample.class.getClassLoader() + .getResource("com/baeldung/resource/example.txt"); + Assertions.assertNotNull(resourceAbsolutePath); + } +} From 6746ddc7ea21009718aeb7301f8412ca88292eb8 Mon Sep 17 00:00:00 2001 From: "thibault.faure" Date: Sun, 20 Nov 2022 17:47:16 +0100 Subject: [PATCH 015/592] BAEL-5849 Code for the improvement of the article Custom deserializer for a generic type jackson --- .../deserialization/ItemWithWrappedUser.java | 31 +++++++++++++ .../com/baeldung/deserialization/Wrapper.java | 15 ++++++ .../deserialization/WrapperDeserializer.java | 30 ++++++++++++ .../CustomDeserializationUnitTest.java | 46 +++++++++++++------ 4 files changed, 109 insertions(+), 13 deletions(-) create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemWithWrappedUser.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/Wrapper.java create mode 100644 jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/WrapperDeserializer.java diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemWithWrappedUser.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemWithWrappedUser.java new file mode 100644 index 0000000000..827d7dd768 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/ItemWithWrappedUser.java @@ -0,0 +1,31 @@ +package com.baeldung.deserialization; + +public class ItemWithWrappedUser { + + public int id; + public String itemName; + public Wrapper owner; + + public ItemWithWrappedUser() { + super(); + } + + public ItemWithWrappedUser(final int id, final String itemName, final Wrapper owner) { + this.id = id; + this.itemName = itemName; + this.owner = owner; + } + + public int getId() { + return id; + } + + public String getItemName() { + return itemName; + } + + public Wrapper getOwner() { + return owner; + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/Wrapper.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/Wrapper.java new file mode 100644 index 0000000000..a9baa52277 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/Wrapper.java @@ -0,0 +1,15 @@ +package com.baeldung.deserialization; + +public class Wrapper { + + T value; + + public T getValue() { + return value; + } + + public void setValue(T value) { + this.value = value; + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/WrapperDeserializer.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/WrapperDeserializer.java new file mode 100644 index 0000000000..e6a4bea0d6 --- /dev/null +++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/deserialization/WrapperDeserializer.java @@ -0,0 +1,30 @@ +package com.baeldung.deserialization; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.deser.ContextualDeserializer; + +public class WrapperDeserializer extends JsonDeserializer> implements ContextualDeserializer { + + private JavaType type; + + @Override + public JsonDeserializer createContextual(DeserializationContext ctxt, BeanProperty property) { + this.type = property.getType() + .containedType(0); + return this; + } + + @Override + public Wrapper deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { + Wrapper wrapper = new Wrapper<>(); + wrapper.setValue(deserializationContext.readValue(jsonParser, type)); + return wrapper; + } + +} diff --git a/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/deserialization/CustomDeserializationUnitTest.java b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/deserialization/CustomDeserializationUnitTest.java index 17016149a2..b32121dbed 100644 --- a/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/deserialization/CustomDeserializationUnitTest.java +++ b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/deserialization/CustomDeserializationUnitTest.java @@ -1,23 +1,24 @@ package com.baeldung.deserialization; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.module.SimpleModule; -import org.junit.Test; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; import java.io.IOException; import java.time.ZoneId; import java.time.ZonedDateTime; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.notNullValue; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.module.SimpleModule; public class CustomDeserializationUnitTest { @@ -78,4 +79,23 @@ public class CustomDeserializationUnitTest { assertThat(restored, is(now)); } + @Test + public void whenDeserialisingItemWithWrappedUser_ThenWrappedUserIsCorrectlyParsed() throws JsonProcessingException { + final String json = "{\"id\":1,\"itemName\":\"theItem\",\"owner\":{\"id\":2,\"name\":\"theUser\"}}"; + + SimpleModule module = new SimpleModule().addDeserializer(Wrapper.class, new WrapperDeserializer()); + + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.registerModule(module); + + final ItemWithWrappedUser readValue = objectMapper.readValue(json, ItemWithWrappedUser.class); + + assertEquals(2, readValue.getOwner() + .getValue() + .getId()); + assertEquals("theUser", readValue.getOwner() + .getValue() + .getName()); + } + } From 398e32e75a90cfb12a7ea973da3cb98064413ade Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 24 Nov 2022 20:19:58 +0530 Subject: [PATCH 016/592] JAVA-15787 Created new di-modules and server-modules - Moved spring-freemarker to spring-web-modules --- {cdi => di-modules/cdi}/README.md | 0 {cdi => di-modules/cdi}/pom.xml | 3 +-- .../application/BootstrappingApplication.java | 0 .../cdi2observers/events/ExampleEvent.java | 0 .../events/ExampleEventSource.java | 0 .../AnotherExampleEventObserver.java | 0 .../observers/ExampleEventObserver.java | 0 .../cdi2observers/services/TextService.java | 0 .../application/FileApplication.java | 0 .../factories/TimeLoggerFactory.java | 0 .../imagefileeditors/GifFileEditor.java | 0 .../imagefileeditors/ImageFileEditor.java | 0 .../imagefileeditors/JpgFileEditor.java | 0 .../imagefileeditors/PngFileEditor.java | 0 .../imageprocessors/ImageFileProcessor.java | 0 .../loggers/TimeLogger.java | 0 .../qualifiers/GifFileEditorQualifier.java | 0 .../qualifiers/JpgFileEditorQualifier.java | 0 .../qualifiers/PngFileEditorQualifier.java | 0 .../com/baeldung/interceptor/Audited.java | 0 .../interceptor/AuditedInterceptor.java | 0 .../com/baeldung/service/SuperService.java | 0 .../spring/aspect/SpringTestAspect.java | 0 .../spring/configuration/AppConfig.java | 0 .../spring/service/SpringSuperService.java | 0 .../src/main/resources/META-INF/beans.xml | 0 .../cdi}/src/main/resources/logback.xml | 0 .../test/InterceptorIntegrationTest.java | 0 .../SpringInterceptorIntegrationTest.java | 0 .../tests/TextServiceUnitTest.java | 0 .../GifFileEditorUnitTest.java | 0 .../ImageProcessorUnitTest.java | 0 .../JpgFileEditorUnitTest.java | 0 .../PngFileEditorUnitTest.java | 0 .../TimeLoggerFactoryUnitTest.java | 0 .../TimeLoggerUnitTest.java | 0 {dagger => di-modules/dagger}/README.md | 0 {dagger => di-modules/dagger}/pom.xml | 4 ++-- .../java/com/baeldung/dagger/intro/Brand.java | 0 .../java/com/baeldung/dagger/intro/Car.java | 0 .../com/baeldung/dagger/intro/Engine.java | 0 .../dagger/intro/VehiclesComponent.java | 0 .../baeldung/dagger/intro/VehiclesModule.java | 0 .../dagger}/src/main/resources/logback.xml | 0 .../baeldung/dagger/intro/DaggerUnitTest.java | 0 .../flyway-cdi-extension}/README.md | 0 .../flyway-cdi-extension}/pom.xml | 5 ++-- .../cdi/extension/FlywayExtension.java | 0 .../baeldung/cdi/extension/FlywayType.java | 0 .../com/baeldung/cdi/extension/MainApp.java | 0 .../src/main/resources/META-INF/beans.xml | 0 .../javax.enterprise.inject.spi.Extension | 0 .../db/migration/V1__Create_person_table.sql | 0 .../resources/db/migration/V2__Add_people.sql | 0 {guice => di-modules/guice}/README.md | 0 {guice => di-modules/guice}/pom.xml | 5 ++-- .../java/com/baeldung/examples/RunGuice.java | 0 .../com/baeldung/examples/common/Account.java | 0 .../examples/common/AccountService.java | 0 .../examples/common/AccountServiceImpl.java | 0 .../examples/common/AudioBookService.java | 0 .../examples/common/AudioBookServiceImpl.java | 0 .../examples/common/AuthorService.java | 0 .../examples/common/AuthorServiceImpl.java | 0 .../baeldung/examples/common/BookService.java | 0 .../examples/common/BookServiceImpl.java | 0 .../baeldung/examples/common/PersonDao.java | 0 .../examples/common/PersonDaoImpl.java | 0 .../examples/guice/Communication.java | 0 .../examples/guice/CommunicationMode.java | 0 .../examples/guice/DefaultCommunicator.java | 0 .../guice/EmailCommunicationMode.java | 0 .../java/com/baeldung/examples/guice/Foo.java | 0 .../baeldung/examples/guice/FooProcessor.java | 0 .../examples/guice/GuicePersonService.java | 0 .../examples/guice/GuiceUserService.java | 0 .../examples/guice/IMCommunicationMode.java | 0 .../com/baeldung/examples/guice/Person.java | 0 .../examples/guice/SMSCommunicationMode.java | 0 .../examples/guice/aop/MessageLogger.java | 0 .../guice/aop/MessageSentLoggable.java | 0 .../examples/guice/binding/AOPModule.java | 0 .../examples/guice/binding/BasicModule.java | 0 .../guice/constant/CommunicationModel.java | 0 .../examples/guice/marker/Communicator.java | 0 .../examples/guice/modules/BasicModule.java | 0 .../examples/guice/modules/GuiceModule.java | 0 .../guice}/src/main/resources/logback.xml | 0 .../com/baeldung/examples/GuiceUnitTest.java | 0 di-modules/pom.xml | 22 +++++++++++++++++ pom.xml | 24 ++++--------------- .../apache-tomcat}/pom.xml | 7 ++---- .../apache-tomcat}/sso/.dockerignore | 0 .../apache-tomcat}/sso/README.md | 0 .../apache-tomcat}/sso/docker-compose.yml | 0 .../apache-tomcat}/sso/pom.xml | 0 .../sso/res/conf/catalina.policy | 0 .../sso/res/conf/catalina.properties | 0 .../apache-tomcat}/sso/res/conf/context.xml | 0 .../sso/res/conf/jaspic-providers.xml | 0 .../sso/res/conf/jaspic-providers.xsd | 0 .../sso/res/conf/logging.properties | 0 .../apache-tomcat}/sso/res/conf/server.xml | 0 .../sso/res/conf/tomcat-users.xml | 0 .../sso/res/conf/tomcat-users.xsd | 0 .../apache-tomcat}/sso/res/conf/web.xml | 0 .../sso/webapps/ping/WEB-INF/web.xml | 0 .../sso/webapps/ping/index.html | 0 .../sso/webapps/ping/logging.html | 0 .../sso/webapps/ping/logging_error.html | 0 .../sso/webapps/ping/private/index.html | 0 .../sso/webapps/pong/WEB-INF/web.xml | 0 .../sso/webapps/pong/index.html | 0 .../sso/webapps/pong/private/index.html | 0 {netty => server-modules/netty}/README.md | 0 {netty => server-modules/netty}/pom.xml | 5 ++-- .../http/server/CustomHttpServerHandler.java | 0 .../com/baeldung/http/server/HttpServer.java | 0 .../baeldung/http/server/RequestUtils.java | 0 .../com/baeldung/netty/http2/Http2Util.java | 0 .../http2/client/Http2ClientInitializer.java | 0 .../client/Http2ClientResponseHandler.java | 0 .../http2/client/Http2SettingsHandler.java | 0 .../netty/http2/server/Http2Server.java | 0 .../server/Http2ServerResponseHandler.java | 0 .../netty}/src/main/resources/logback.xml | 0 .../http/server/HttpServerLiveTest.java | 0 .../http/server/ResponseAggregator.java | 0 .../baeldung/netty/Http2ClientLiveTest.java | 0 server-modules/pom.xml | 22 +++++++++++++++++ .../undertow}/README.md | 0 {undertow => server-modules/undertow}/pom.xml | 6 ++--- .../com/baeldung/undertow/SimpleServer.java | 0 .../com/baeldung/undertow/ftp/FileServer.java | 0 .../secure/CustomIdentityManager.java | 0 .../undertow/secure/SecureServer.java | 0 .../undertow/socket/SocketServer.java | 0 .../undertow}/src/main/resources/logback.xml | 0 {wildfly => server-modules/wildfly}/README.md | 0 {wildfly => server-modules/wildfly}/pom.xml | 0 .../src/main/java/hello/Application.java | 0 .../src/main/java/hello/HelloController.java | 0 spring-web-modules/pom.xml | 3 ++- .../spring-freemarker}/.gitignore | 0 .../spring-freemarker}/README.md | 0 .../spring-freemarker}/pom.xml | 0 .../freemarker/config/SpringWebConfig.java | 0 .../freemarker/config/WebConfiguration.java | 0 .../controller/SpringController.java | 0 .../freemarker/method/LastCharMethod.java | 0 .../com/baeldung/freemarker/model/Car.java | 0 .../src/main/resources/logback.xml | 0 .../main/webapp/WEB-INF/views/ftl/commons.ftl | 0 .../main/webapp/WEB-INF/views/ftl/index.ftl | 0 .../src/main/webapp/WEB-INF/web.xml | 0 .../java/com/baeldung/SpringContextTest.java | 0 156 files changed, 63 insertions(+), 43 deletions(-) rename {cdi => di-modules/cdi}/README.md (100%) rename {cdi => di-modules/cdi}/pom.xml (97%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/cdi2observers/services/TextService.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/dependencyinjection/application/FileApplication.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/dependencyinjection/factories/TimeLoggerFactory.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/GifFileEditor.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/ImageFileEditor.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/JpgFileEditor.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/PngFileEditor.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/dependencyinjection/imageprocessors/ImageFileProcessor.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/dependencyinjection/loggers/TimeLogger.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/dependencyinjection/qualifiers/GifFileEditorQualifier.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/dependencyinjection/qualifiers/JpgFileEditorQualifier.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/dependencyinjection/qualifiers/PngFileEditorQualifier.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/interceptor/Audited.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/interceptor/AuditedInterceptor.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/service/SuperService.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/spring/aspect/SpringTestAspect.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/spring/configuration/AppConfig.java (100%) rename {cdi => di-modules/cdi}/src/main/java/com/baeldung/spring/service/SpringSuperService.java (100%) rename {cdi => di-modules/cdi}/src/main/resources/META-INF/beans.xml (100%) rename {cdi => di-modules/cdi}/src/main/resources/logback.xml (100%) rename {cdi => di-modules/cdi}/src/test/java/com/baeldung/test/InterceptorIntegrationTest.java (100%) rename {cdi => di-modules/cdi}/src/test/java/com/baeldung/test/SpringInterceptorIntegrationTest.java (100%) rename {cdi => di-modules/cdi}/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java (100%) rename {cdi => di-modules/cdi}/src/test/java/com/baeldung/test/dependencyinjection/GifFileEditorUnitTest.java (100%) rename {cdi => di-modules/cdi}/src/test/java/com/baeldung/test/dependencyinjection/ImageProcessorUnitTest.java (100%) rename {cdi => di-modules/cdi}/src/test/java/com/baeldung/test/dependencyinjection/JpgFileEditorUnitTest.java (100%) rename {cdi => di-modules/cdi}/src/test/java/com/baeldung/test/dependencyinjection/PngFileEditorUnitTest.java (100%) rename {cdi => di-modules/cdi}/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java (100%) rename {cdi => di-modules/cdi}/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerUnitTest.java (100%) rename {dagger => di-modules/dagger}/README.md (100%) rename {dagger => di-modules/dagger}/pom.xml (96%) rename {dagger => di-modules/dagger}/src/main/java/com/baeldung/dagger/intro/Brand.java (100%) rename {dagger => di-modules/dagger}/src/main/java/com/baeldung/dagger/intro/Car.java (100%) rename {dagger => di-modules/dagger}/src/main/java/com/baeldung/dagger/intro/Engine.java (100%) rename {dagger => di-modules/dagger}/src/main/java/com/baeldung/dagger/intro/VehiclesComponent.java (100%) rename {dagger => di-modules/dagger}/src/main/java/com/baeldung/dagger/intro/VehiclesModule.java (100%) rename {dagger => di-modules/dagger}/src/main/resources/logback.xml (100%) rename {dagger => di-modules/dagger}/src/test/java/com/baeldung/dagger/intro/DaggerUnitTest.java (100%) rename {flyway-cdi-extension => di-modules/flyway-cdi-extension}/README.md (100%) rename {flyway-cdi-extension => di-modules/flyway-cdi-extension}/pom.xml (95%) rename {flyway-cdi-extension => di-modules/flyway-cdi-extension}/src/main/java/com/baeldung/cdi/extension/FlywayExtension.java (100%) rename {flyway-cdi-extension => di-modules/flyway-cdi-extension}/src/main/java/com/baeldung/cdi/extension/FlywayType.java (100%) rename {flyway-cdi-extension => di-modules/flyway-cdi-extension}/src/main/java/com/baeldung/cdi/extension/MainApp.java (100%) rename {flyway-cdi-extension => di-modules/flyway-cdi-extension}/src/main/resources/META-INF/beans.xml (100%) rename {flyway-cdi-extension => di-modules/flyway-cdi-extension}/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension (100%) rename {flyway-cdi-extension => di-modules/flyway-cdi-extension}/src/main/resources/db/migration/V1__Create_person_table.sql (100%) rename {flyway-cdi-extension => di-modules/flyway-cdi-extension}/src/main/resources/db/migration/V2__Add_people.sql (100%) rename {guice => di-modules/guice}/README.md (100%) rename {guice => di-modules/guice}/pom.xml (90%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/RunGuice.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/common/Account.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/common/AccountService.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/common/AccountServiceImpl.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/common/AudioBookService.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/common/AudioBookServiceImpl.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/common/AuthorService.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/common/AuthorServiceImpl.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/common/BookService.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/common/BookServiceImpl.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/common/PersonDao.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/common/PersonDaoImpl.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/Communication.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/CommunicationMode.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/Foo.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/FooProcessor.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/GuicePersonService.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/GuiceUserService.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/Person.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/marker/Communicator.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java (100%) rename {guice => di-modules/guice}/src/main/java/com/baeldung/examples/guice/modules/GuiceModule.java (100%) rename {guice => di-modules/guice}/src/main/resources/logback.xml (100%) rename {guice => di-modules/guice}/src/test/java/com/baeldung/examples/GuiceUnitTest.java (100%) create mode 100644 di-modules/pom.xml rename {apache-tomcat => server-modules/apache-tomcat}/pom.xml (86%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/.dockerignore (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/README.md (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/docker-compose.yml (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/pom.xml (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/res/conf/catalina.policy (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/res/conf/catalina.properties (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/res/conf/context.xml (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/res/conf/jaspic-providers.xml (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/res/conf/jaspic-providers.xsd (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/res/conf/logging.properties (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/res/conf/server.xml (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/res/conf/tomcat-users.xml (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/res/conf/tomcat-users.xsd (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/res/conf/web.xml (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/webapps/ping/WEB-INF/web.xml (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/webapps/ping/index.html (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/webapps/ping/logging.html (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/webapps/ping/logging_error.html (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/webapps/ping/private/index.html (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/webapps/pong/WEB-INF/web.xml (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/webapps/pong/index.html (100%) rename {apache-tomcat => server-modules/apache-tomcat}/sso/webapps/pong/private/index.html (100%) rename {netty => server-modules/netty}/README.md (100%) rename {netty => server-modules/netty}/pom.xml (91%) rename {netty => server-modules/netty}/src/main/java/com/baeldung/http/server/CustomHttpServerHandler.java (100%) rename {netty => server-modules/netty}/src/main/java/com/baeldung/http/server/HttpServer.java (100%) rename {netty => server-modules/netty}/src/main/java/com/baeldung/http/server/RequestUtils.java (100%) rename {netty => server-modules/netty}/src/main/java/com/baeldung/netty/http2/Http2Util.java (100%) rename {netty => server-modules/netty}/src/main/java/com/baeldung/netty/http2/client/Http2ClientInitializer.java (100%) rename {netty => server-modules/netty}/src/main/java/com/baeldung/netty/http2/client/Http2ClientResponseHandler.java (100%) rename {netty => server-modules/netty}/src/main/java/com/baeldung/netty/http2/client/Http2SettingsHandler.java (100%) rename {netty => server-modules/netty}/src/main/java/com/baeldung/netty/http2/server/Http2Server.java (100%) rename {netty => server-modules/netty}/src/main/java/com/baeldung/netty/http2/server/Http2ServerResponseHandler.java (100%) rename {netty => server-modules/netty}/src/main/resources/logback.xml (100%) rename {netty => server-modules/netty}/src/test/java/com/baeldung/http/server/HttpServerLiveTest.java (100%) rename {netty => server-modules/netty}/src/test/java/com/baeldung/http/server/ResponseAggregator.java (100%) rename {netty => server-modules/netty}/src/test/java/com/baeldung/netty/Http2ClientLiveTest.java (100%) create mode 100644 server-modules/pom.xml rename {undertow => server-modules/undertow}/README.md (100%) rename {undertow => server-modules/undertow}/pom.xml (94%) rename {undertow => server-modules/undertow}/src/main/java/com/baeldung/undertow/SimpleServer.java (100%) rename {undertow => server-modules/undertow}/src/main/java/com/baeldung/undertow/ftp/FileServer.java (100%) rename {undertow => server-modules/undertow}/src/main/java/com/baeldung/undertow/secure/CustomIdentityManager.java (100%) rename {undertow => server-modules/undertow}/src/main/java/com/baeldung/undertow/secure/SecureServer.java (100%) rename {undertow => server-modules/undertow}/src/main/java/com/baeldung/undertow/socket/SocketServer.java (100%) rename {spring-freemarker => server-modules/undertow}/src/main/resources/logback.xml (100%) rename {wildfly => server-modules/wildfly}/README.md (100%) rename {wildfly => server-modules/wildfly}/pom.xml (100%) rename {wildfly => server-modules/wildfly}/src/main/java/hello/Application.java (100%) rename {wildfly => server-modules/wildfly}/src/main/java/hello/HelloController.java (100%) rename {spring-freemarker => spring-web-modules/spring-freemarker}/.gitignore (100%) rename {spring-freemarker => spring-web-modules/spring-freemarker}/README.md (100%) rename {spring-freemarker => spring-web-modules/spring-freemarker}/pom.xml (100%) rename {spring-freemarker => spring-web-modules/spring-freemarker}/src/main/java/com/baeldung/freemarker/config/SpringWebConfig.java (100%) rename {spring-freemarker => spring-web-modules/spring-freemarker}/src/main/java/com/baeldung/freemarker/config/WebConfiguration.java (100%) rename {spring-freemarker => spring-web-modules/spring-freemarker}/src/main/java/com/baeldung/freemarker/controller/SpringController.java (100%) rename {spring-freemarker => spring-web-modules/spring-freemarker}/src/main/java/com/baeldung/freemarker/method/LastCharMethod.java (100%) rename {spring-freemarker => spring-web-modules/spring-freemarker}/src/main/java/com/baeldung/freemarker/model/Car.java (100%) rename {undertow => spring-web-modules/spring-freemarker}/src/main/resources/logback.xml (100%) rename {spring-freemarker => spring-web-modules/spring-freemarker}/src/main/webapp/WEB-INF/views/ftl/commons.ftl (100%) rename {spring-freemarker => spring-web-modules/spring-freemarker}/src/main/webapp/WEB-INF/views/ftl/index.ftl (100%) rename {spring-freemarker => spring-web-modules/spring-freemarker}/src/main/webapp/WEB-INF/web.xml (100%) rename {spring-freemarker => spring-web-modules/spring-freemarker}/src/test/java/com/baeldung/SpringContextTest.java (100%) diff --git a/cdi/README.md b/di-modules/cdi/README.md similarity index 100% rename from cdi/README.md rename to di-modules/cdi/README.md diff --git a/cdi/pom.xml b/di-modules/cdi/pom.xml similarity index 97% rename from cdi/pom.xml rename to di-modules/cdi/pom.xml index ee23e082c7..6b2382ba0e 100644 --- a/cdi/pom.xml +++ b/di-modules/cdi/pom.xml @@ -4,7 +4,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 cdi - 1.0-SNAPSHOT cdi @@ -49,4 +48,4 @@ 1.9.2 - \ No newline at end of file + diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java b/di-modules/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java similarity index 100% rename from cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java rename to di-modules/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java b/di-modules/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java similarity index 100% rename from cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java rename to di-modules/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java b/di-modules/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java similarity index 100% rename from cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java rename to di-modules/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java b/di-modules/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java similarity index 100% rename from cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java rename to di-modules/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java b/di-modules/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java similarity index 100% rename from cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java rename to di-modules/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java b/di-modules/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java similarity index 100% rename from cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java rename to di-modules/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java diff --git a/cdi/src/main/java/com/baeldung/dependencyinjection/application/FileApplication.java b/di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/application/FileApplication.java similarity index 100% rename from cdi/src/main/java/com/baeldung/dependencyinjection/application/FileApplication.java rename to di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/application/FileApplication.java diff --git a/cdi/src/main/java/com/baeldung/dependencyinjection/factories/TimeLoggerFactory.java b/di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/factories/TimeLoggerFactory.java similarity index 100% rename from cdi/src/main/java/com/baeldung/dependencyinjection/factories/TimeLoggerFactory.java rename to di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/factories/TimeLoggerFactory.java diff --git a/cdi/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/GifFileEditor.java b/di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/GifFileEditor.java similarity index 100% rename from cdi/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/GifFileEditor.java rename to di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/GifFileEditor.java diff --git a/cdi/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/ImageFileEditor.java b/di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/ImageFileEditor.java similarity index 100% rename from cdi/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/ImageFileEditor.java rename to di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/ImageFileEditor.java diff --git a/cdi/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/JpgFileEditor.java b/di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/JpgFileEditor.java similarity index 100% rename from cdi/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/JpgFileEditor.java rename to di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/JpgFileEditor.java diff --git a/cdi/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/PngFileEditor.java b/di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/PngFileEditor.java similarity index 100% rename from cdi/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/PngFileEditor.java rename to di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/imagefileeditors/PngFileEditor.java diff --git a/cdi/src/main/java/com/baeldung/dependencyinjection/imageprocessors/ImageFileProcessor.java b/di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/imageprocessors/ImageFileProcessor.java similarity index 100% rename from cdi/src/main/java/com/baeldung/dependencyinjection/imageprocessors/ImageFileProcessor.java rename to di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/imageprocessors/ImageFileProcessor.java diff --git a/cdi/src/main/java/com/baeldung/dependencyinjection/loggers/TimeLogger.java b/di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/loggers/TimeLogger.java similarity index 100% rename from cdi/src/main/java/com/baeldung/dependencyinjection/loggers/TimeLogger.java rename to di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/loggers/TimeLogger.java diff --git a/cdi/src/main/java/com/baeldung/dependencyinjection/qualifiers/GifFileEditorQualifier.java b/di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/qualifiers/GifFileEditorQualifier.java similarity index 100% rename from cdi/src/main/java/com/baeldung/dependencyinjection/qualifiers/GifFileEditorQualifier.java rename to di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/qualifiers/GifFileEditorQualifier.java diff --git a/cdi/src/main/java/com/baeldung/dependencyinjection/qualifiers/JpgFileEditorQualifier.java b/di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/qualifiers/JpgFileEditorQualifier.java similarity index 100% rename from cdi/src/main/java/com/baeldung/dependencyinjection/qualifiers/JpgFileEditorQualifier.java rename to di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/qualifiers/JpgFileEditorQualifier.java diff --git a/cdi/src/main/java/com/baeldung/dependencyinjection/qualifiers/PngFileEditorQualifier.java b/di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/qualifiers/PngFileEditorQualifier.java similarity index 100% rename from cdi/src/main/java/com/baeldung/dependencyinjection/qualifiers/PngFileEditorQualifier.java rename to di-modules/cdi/src/main/java/com/baeldung/dependencyinjection/qualifiers/PngFileEditorQualifier.java diff --git a/cdi/src/main/java/com/baeldung/interceptor/Audited.java b/di-modules/cdi/src/main/java/com/baeldung/interceptor/Audited.java similarity index 100% rename from cdi/src/main/java/com/baeldung/interceptor/Audited.java rename to di-modules/cdi/src/main/java/com/baeldung/interceptor/Audited.java diff --git a/cdi/src/main/java/com/baeldung/interceptor/AuditedInterceptor.java b/di-modules/cdi/src/main/java/com/baeldung/interceptor/AuditedInterceptor.java similarity index 100% rename from cdi/src/main/java/com/baeldung/interceptor/AuditedInterceptor.java rename to di-modules/cdi/src/main/java/com/baeldung/interceptor/AuditedInterceptor.java diff --git a/cdi/src/main/java/com/baeldung/service/SuperService.java b/di-modules/cdi/src/main/java/com/baeldung/service/SuperService.java similarity index 100% rename from cdi/src/main/java/com/baeldung/service/SuperService.java rename to di-modules/cdi/src/main/java/com/baeldung/service/SuperService.java diff --git a/cdi/src/main/java/com/baeldung/spring/aspect/SpringTestAspect.java b/di-modules/cdi/src/main/java/com/baeldung/spring/aspect/SpringTestAspect.java similarity index 100% rename from cdi/src/main/java/com/baeldung/spring/aspect/SpringTestAspect.java rename to di-modules/cdi/src/main/java/com/baeldung/spring/aspect/SpringTestAspect.java diff --git a/cdi/src/main/java/com/baeldung/spring/configuration/AppConfig.java b/di-modules/cdi/src/main/java/com/baeldung/spring/configuration/AppConfig.java similarity index 100% rename from cdi/src/main/java/com/baeldung/spring/configuration/AppConfig.java rename to di-modules/cdi/src/main/java/com/baeldung/spring/configuration/AppConfig.java diff --git a/cdi/src/main/java/com/baeldung/spring/service/SpringSuperService.java b/di-modules/cdi/src/main/java/com/baeldung/spring/service/SpringSuperService.java similarity index 100% rename from cdi/src/main/java/com/baeldung/spring/service/SpringSuperService.java rename to di-modules/cdi/src/main/java/com/baeldung/spring/service/SpringSuperService.java diff --git a/cdi/src/main/resources/META-INF/beans.xml b/di-modules/cdi/src/main/resources/META-INF/beans.xml similarity index 100% rename from cdi/src/main/resources/META-INF/beans.xml rename to di-modules/cdi/src/main/resources/META-INF/beans.xml diff --git a/cdi/src/main/resources/logback.xml b/di-modules/cdi/src/main/resources/logback.xml similarity index 100% rename from cdi/src/main/resources/logback.xml rename to di-modules/cdi/src/main/resources/logback.xml diff --git a/cdi/src/test/java/com/baeldung/test/InterceptorIntegrationTest.java b/di-modules/cdi/src/test/java/com/baeldung/test/InterceptorIntegrationTest.java similarity index 100% rename from cdi/src/test/java/com/baeldung/test/InterceptorIntegrationTest.java rename to di-modules/cdi/src/test/java/com/baeldung/test/InterceptorIntegrationTest.java diff --git a/cdi/src/test/java/com/baeldung/test/SpringInterceptorIntegrationTest.java b/di-modules/cdi/src/test/java/com/baeldung/test/SpringInterceptorIntegrationTest.java similarity index 100% rename from cdi/src/test/java/com/baeldung/test/SpringInterceptorIntegrationTest.java rename to di-modules/cdi/src/test/java/com/baeldung/test/SpringInterceptorIntegrationTest.java diff --git a/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java b/di-modules/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java similarity index 100% rename from cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java rename to di-modules/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java diff --git a/cdi/src/test/java/com/baeldung/test/dependencyinjection/GifFileEditorUnitTest.java b/di-modules/cdi/src/test/java/com/baeldung/test/dependencyinjection/GifFileEditorUnitTest.java similarity index 100% rename from cdi/src/test/java/com/baeldung/test/dependencyinjection/GifFileEditorUnitTest.java rename to di-modules/cdi/src/test/java/com/baeldung/test/dependencyinjection/GifFileEditorUnitTest.java diff --git a/cdi/src/test/java/com/baeldung/test/dependencyinjection/ImageProcessorUnitTest.java b/di-modules/cdi/src/test/java/com/baeldung/test/dependencyinjection/ImageProcessorUnitTest.java similarity index 100% rename from cdi/src/test/java/com/baeldung/test/dependencyinjection/ImageProcessorUnitTest.java rename to di-modules/cdi/src/test/java/com/baeldung/test/dependencyinjection/ImageProcessorUnitTest.java diff --git a/cdi/src/test/java/com/baeldung/test/dependencyinjection/JpgFileEditorUnitTest.java b/di-modules/cdi/src/test/java/com/baeldung/test/dependencyinjection/JpgFileEditorUnitTest.java similarity index 100% rename from cdi/src/test/java/com/baeldung/test/dependencyinjection/JpgFileEditorUnitTest.java rename to di-modules/cdi/src/test/java/com/baeldung/test/dependencyinjection/JpgFileEditorUnitTest.java diff --git a/cdi/src/test/java/com/baeldung/test/dependencyinjection/PngFileEditorUnitTest.java b/di-modules/cdi/src/test/java/com/baeldung/test/dependencyinjection/PngFileEditorUnitTest.java similarity index 100% rename from cdi/src/test/java/com/baeldung/test/dependencyinjection/PngFileEditorUnitTest.java rename to di-modules/cdi/src/test/java/com/baeldung/test/dependencyinjection/PngFileEditorUnitTest.java diff --git a/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java b/di-modules/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java similarity index 100% rename from cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java rename to di-modules/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java diff --git a/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerUnitTest.java b/di-modules/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerUnitTest.java similarity index 100% rename from cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerUnitTest.java rename to di-modules/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerUnitTest.java diff --git a/dagger/README.md b/di-modules/dagger/README.md similarity index 100% rename from dagger/README.md rename to di-modules/dagger/README.md diff --git a/dagger/pom.xml b/di-modules/dagger/pom.xml similarity index 96% rename from dagger/pom.xml rename to di-modules/dagger/pom.xml index 304b0e428e..06a87b0475 100644 --- a/dagger/pom.xml +++ b/di-modules/dagger/pom.xml @@ -8,7 +8,7 @@ com.baeldung - parent-modules + di-modules 1.0.0-SNAPSHOT @@ -45,4 +45,4 @@ 2.16 - \ No newline at end of file + diff --git a/dagger/src/main/java/com/baeldung/dagger/intro/Brand.java b/di-modules/dagger/src/main/java/com/baeldung/dagger/intro/Brand.java similarity index 100% rename from dagger/src/main/java/com/baeldung/dagger/intro/Brand.java rename to di-modules/dagger/src/main/java/com/baeldung/dagger/intro/Brand.java diff --git a/dagger/src/main/java/com/baeldung/dagger/intro/Car.java b/di-modules/dagger/src/main/java/com/baeldung/dagger/intro/Car.java similarity index 100% rename from dagger/src/main/java/com/baeldung/dagger/intro/Car.java rename to di-modules/dagger/src/main/java/com/baeldung/dagger/intro/Car.java diff --git a/dagger/src/main/java/com/baeldung/dagger/intro/Engine.java b/di-modules/dagger/src/main/java/com/baeldung/dagger/intro/Engine.java similarity index 100% rename from dagger/src/main/java/com/baeldung/dagger/intro/Engine.java rename to di-modules/dagger/src/main/java/com/baeldung/dagger/intro/Engine.java diff --git a/dagger/src/main/java/com/baeldung/dagger/intro/VehiclesComponent.java b/di-modules/dagger/src/main/java/com/baeldung/dagger/intro/VehiclesComponent.java similarity index 100% rename from dagger/src/main/java/com/baeldung/dagger/intro/VehiclesComponent.java rename to di-modules/dagger/src/main/java/com/baeldung/dagger/intro/VehiclesComponent.java diff --git a/dagger/src/main/java/com/baeldung/dagger/intro/VehiclesModule.java b/di-modules/dagger/src/main/java/com/baeldung/dagger/intro/VehiclesModule.java similarity index 100% rename from dagger/src/main/java/com/baeldung/dagger/intro/VehiclesModule.java rename to di-modules/dagger/src/main/java/com/baeldung/dagger/intro/VehiclesModule.java diff --git a/dagger/src/main/resources/logback.xml b/di-modules/dagger/src/main/resources/logback.xml similarity index 100% rename from dagger/src/main/resources/logback.xml rename to di-modules/dagger/src/main/resources/logback.xml diff --git a/dagger/src/test/java/com/baeldung/dagger/intro/DaggerUnitTest.java b/di-modules/dagger/src/test/java/com/baeldung/dagger/intro/DaggerUnitTest.java similarity index 100% rename from dagger/src/test/java/com/baeldung/dagger/intro/DaggerUnitTest.java rename to di-modules/dagger/src/test/java/com/baeldung/dagger/intro/DaggerUnitTest.java diff --git a/flyway-cdi-extension/README.md b/di-modules/flyway-cdi-extension/README.md similarity index 100% rename from flyway-cdi-extension/README.md rename to di-modules/flyway-cdi-extension/README.md diff --git a/flyway-cdi-extension/pom.xml b/di-modules/flyway-cdi-extension/pom.xml similarity index 95% rename from flyway-cdi-extension/pom.xml rename to di-modules/flyway-cdi-extension/pom.xml index 3d52ff0e36..7e9b73a127 100644 --- a/flyway-cdi-extension/pom.xml +++ b/di-modules/flyway-cdi-extension/pom.xml @@ -4,12 +4,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 flyway-cdi-extension - 1.0-SNAPSHOT flyway-cdi-extension com.baeldung - parent-modules + di-modules 1.0.0-SNAPSHOT @@ -56,4 +55,4 @@ 1.3.2 - \ No newline at end of file + diff --git a/flyway-cdi-extension/src/main/java/com/baeldung/cdi/extension/FlywayExtension.java b/di-modules/flyway-cdi-extension/src/main/java/com/baeldung/cdi/extension/FlywayExtension.java similarity index 100% rename from flyway-cdi-extension/src/main/java/com/baeldung/cdi/extension/FlywayExtension.java rename to di-modules/flyway-cdi-extension/src/main/java/com/baeldung/cdi/extension/FlywayExtension.java diff --git a/flyway-cdi-extension/src/main/java/com/baeldung/cdi/extension/FlywayType.java b/di-modules/flyway-cdi-extension/src/main/java/com/baeldung/cdi/extension/FlywayType.java similarity index 100% rename from flyway-cdi-extension/src/main/java/com/baeldung/cdi/extension/FlywayType.java rename to di-modules/flyway-cdi-extension/src/main/java/com/baeldung/cdi/extension/FlywayType.java diff --git a/flyway-cdi-extension/src/main/java/com/baeldung/cdi/extension/MainApp.java b/di-modules/flyway-cdi-extension/src/main/java/com/baeldung/cdi/extension/MainApp.java similarity index 100% rename from flyway-cdi-extension/src/main/java/com/baeldung/cdi/extension/MainApp.java rename to di-modules/flyway-cdi-extension/src/main/java/com/baeldung/cdi/extension/MainApp.java diff --git a/flyway-cdi-extension/src/main/resources/META-INF/beans.xml b/di-modules/flyway-cdi-extension/src/main/resources/META-INF/beans.xml similarity index 100% rename from flyway-cdi-extension/src/main/resources/META-INF/beans.xml rename to di-modules/flyway-cdi-extension/src/main/resources/META-INF/beans.xml diff --git a/flyway-cdi-extension/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension b/di-modules/flyway-cdi-extension/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension similarity index 100% rename from flyway-cdi-extension/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension rename to di-modules/flyway-cdi-extension/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension diff --git a/flyway-cdi-extension/src/main/resources/db/migration/V1__Create_person_table.sql b/di-modules/flyway-cdi-extension/src/main/resources/db/migration/V1__Create_person_table.sql similarity index 100% rename from flyway-cdi-extension/src/main/resources/db/migration/V1__Create_person_table.sql rename to di-modules/flyway-cdi-extension/src/main/resources/db/migration/V1__Create_person_table.sql diff --git a/flyway-cdi-extension/src/main/resources/db/migration/V2__Add_people.sql b/di-modules/flyway-cdi-extension/src/main/resources/db/migration/V2__Add_people.sql similarity index 100% rename from flyway-cdi-extension/src/main/resources/db/migration/V2__Add_people.sql rename to di-modules/flyway-cdi-extension/src/main/resources/db/migration/V2__Add_people.sql diff --git a/guice/README.md b/di-modules/guice/README.md similarity index 100% rename from guice/README.md rename to di-modules/guice/README.md diff --git a/guice/pom.xml b/di-modules/guice/pom.xml similarity index 90% rename from guice/pom.xml rename to di-modules/guice/pom.xml index 2d968cdfc7..39b1f20b76 100644 --- a/guice/pom.xml +++ b/di-modules/guice/pom.xml @@ -5,13 +5,12 @@ 4.0.0 com.baeldung.examples.guice guice - 1.0-SNAPSHOT guice jar com.baeldung - parent-modules + di-modules 1.0.0-SNAPSHOT @@ -27,4 +26,4 @@ 4.1.0 - \ No newline at end of file + diff --git a/guice/src/main/java/com/baeldung/examples/RunGuice.java b/di-modules/guice/src/main/java/com/baeldung/examples/RunGuice.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/RunGuice.java rename to di-modules/guice/src/main/java/com/baeldung/examples/RunGuice.java diff --git a/guice/src/main/java/com/baeldung/examples/common/Account.java b/di-modules/guice/src/main/java/com/baeldung/examples/common/Account.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/common/Account.java rename to di-modules/guice/src/main/java/com/baeldung/examples/common/Account.java diff --git a/guice/src/main/java/com/baeldung/examples/common/AccountService.java b/di-modules/guice/src/main/java/com/baeldung/examples/common/AccountService.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/common/AccountService.java rename to di-modules/guice/src/main/java/com/baeldung/examples/common/AccountService.java diff --git a/guice/src/main/java/com/baeldung/examples/common/AccountServiceImpl.java b/di-modules/guice/src/main/java/com/baeldung/examples/common/AccountServiceImpl.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/common/AccountServiceImpl.java rename to di-modules/guice/src/main/java/com/baeldung/examples/common/AccountServiceImpl.java diff --git a/guice/src/main/java/com/baeldung/examples/common/AudioBookService.java b/di-modules/guice/src/main/java/com/baeldung/examples/common/AudioBookService.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/common/AudioBookService.java rename to di-modules/guice/src/main/java/com/baeldung/examples/common/AudioBookService.java diff --git a/guice/src/main/java/com/baeldung/examples/common/AudioBookServiceImpl.java b/di-modules/guice/src/main/java/com/baeldung/examples/common/AudioBookServiceImpl.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/common/AudioBookServiceImpl.java rename to di-modules/guice/src/main/java/com/baeldung/examples/common/AudioBookServiceImpl.java diff --git a/guice/src/main/java/com/baeldung/examples/common/AuthorService.java b/di-modules/guice/src/main/java/com/baeldung/examples/common/AuthorService.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/common/AuthorService.java rename to di-modules/guice/src/main/java/com/baeldung/examples/common/AuthorService.java diff --git a/guice/src/main/java/com/baeldung/examples/common/AuthorServiceImpl.java b/di-modules/guice/src/main/java/com/baeldung/examples/common/AuthorServiceImpl.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/common/AuthorServiceImpl.java rename to di-modules/guice/src/main/java/com/baeldung/examples/common/AuthorServiceImpl.java diff --git a/guice/src/main/java/com/baeldung/examples/common/BookService.java b/di-modules/guice/src/main/java/com/baeldung/examples/common/BookService.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/common/BookService.java rename to di-modules/guice/src/main/java/com/baeldung/examples/common/BookService.java diff --git a/guice/src/main/java/com/baeldung/examples/common/BookServiceImpl.java b/di-modules/guice/src/main/java/com/baeldung/examples/common/BookServiceImpl.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/common/BookServiceImpl.java rename to di-modules/guice/src/main/java/com/baeldung/examples/common/BookServiceImpl.java diff --git a/guice/src/main/java/com/baeldung/examples/common/PersonDao.java b/di-modules/guice/src/main/java/com/baeldung/examples/common/PersonDao.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/common/PersonDao.java rename to di-modules/guice/src/main/java/com/baeldung/examples/common/PersonDao.java diff --git a/guice/src/main/java/com/baeldung/examples/common/PersonDaoImpl.java b/di-modules/guice/src/main/java/com/baeldung/examples/common/PersonDaoImpl.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/common/PersonDaoImpl.java rename to di-modules/guice/src/main/java/com/baeldung/examples/common/PersonDaoImpl.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/Communication.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/Communication.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/Communication.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/Communication.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/CommunicationMode.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/CommunicationMode.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/CommunicationMode.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/CommunicationMode.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/Foo.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/Foo.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/Foo.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/Foo.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/FooProcessor.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/FooProcessor.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/FooProcessor.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/FooProcessor.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/GuicePersonService.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/GuicePersonService.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/GuicePersonService.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/GuicePersonService.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/GuiceUserService.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/GuiceUserService.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/GuiceUserService.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/GuiceUserService.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/Person.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/Person.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/Person.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/Person.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/marker/Communicator.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/marker/Communicator.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/marker/Communicator.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/marker/Communicator.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java diff --git a/guice/src/main/java/com/baeldung/examples/guice/modules/GuiceModule.java b/di-modules/guice/src/main/java/com/baeldung/examples/guice/modules/GuiceModule.java similarity index 100% rename from guice/src/main/java/com/baeldung/examples/guice/modules/GuiceModule.java rename to di-modules/guice/src/main/java/com/baeldung/examples/guice/modules/GuiceModule.java diff --git a/guice/src/main/resources/logback.xml b/di-modules/guice/src/main/resources/logback.xml similarity index 100% rename from guice/src/main/resources/logback.xml rename to di-modules/guice/src/main/resources/logback.xml diff --git a/guice/src/test/java/com/baeldung/examples/GuiceUnitTest.java b/di-modules/guice/src/test/java/com/baeldung/examples/GuiceUnitTest.java similarity index 100% rename from guice/src/test/java/com/baeldung/examples/GuiceUnitTest.java rename to di-modules/guice/src/test/java/com/baeldung/examples/GuiceUnitTest.java diff --git a/di-modules/pom.xml b/di-modules/pom.xml new file mode 100644 index 0000000000..675d6117a6 --- /dev/null +++ b/di-modules/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + di-modules + di-modules + pom + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + + cdi + dagger + flyway-cdi-extension + guice + + diff --git a/pom.xml b/pom.xml index ba1f778614..883f5b58f4 100644 --- a/pom.xml +++ b/pom.xml @@ -360,7 +360,6 @@ azure bazel - cdi checker-plugin code-generation @@ -372,10 +371,10 @@ couchbase custom-pmd - dagger data-structures ddd deeplearning4j + di-modules discord4j disruptor dozer @@ -385,7 +384,6 @@ feign - flyway-cdi-extension geotools google-cloud @@ -396,7 +394,6 @@ grpc guava-modules - guice hazelcast apache-httpclient @@ -467,7 +464,6 @@ mybatis netflix-modules - netty orika osgi @@ -537,6 +533,7 @@ parent-java saas + server-modules spf4j @@ -580,8 +577,6 @@ spring-ejb-modules spring-exceptions - spring-freemarker - spring-integration spring-jenkins-pipeline @@ -627,13 +622,10 @@ twilio twitter4j - undertow - vertx-modules video-tutorials webrtc - wildfly xml xml-2 xstream @@ -762,7 +754,6 @@ azure bazel - cdi checker-plugin code-generation @@ -774,10 +765,10 @@ couchbase custom-pmd - dagger data-structures ddd deeplearning4j + di-modules discord4j disruptor dozer @@ -787,7 +778,6 @@ feign - flyway-cdi-extension geotools google-cloud @@ -798,7 +788,6 @@ grpc guava-modules - guice hazelcast apache-httpclient @@ -868,7 +857,6 @@ mybatis netflix-modules - netty orika osgi @@ -929,6 +917,7 @@ parent-java saas + server-modules spf4j @@ -973,8 +962,6 @@ spring-ejb-modules spring-exceptions - spring-freemarker - spring-integration spring-jenkins-pipeline @@ -1020,13 +1007,10 @@ twilio twitter4j - undertow - vertx-modules video-tutorials webrtc - wildfly xml xml-2 xstream diff --git a/apache-tomcat/pom.xml b/server-modules/apache-tomcat/pom.xml similarity index 86% rename from apache-tomcat/pom.xml rename to server-modules/apache-tomcat/pom.xml index 36487f2108..f9a0dfaf4a 100644 --- a/apache-tomcat/pom.xml +++ b/server-modules/apache-tomcat/pom.xml @@ -3,16 +3,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - - com.baeldung apache-tomcat - 1.0.0-SNAPSHOT apache-tomcat pom com.baeldung - parent-modules + server-modules 1.0.0-SNAPSHOT @@ -31,4 +28,4 @@ - \ No newline at end of file + diff --git a/apache-tomcat/sso/.dockerignore b/server-modules/apache-tomcat/sso/.dockerignore similarity index 100% rename from apache-tomcat/sso/.dockerignore rename to server-modules/apache-tomcat/sso/.dockerignore diff --git a/apache-tomcat/sso/README.md b/server-modules/apache-tomcat/sso/README.md similarity index 100% rename from apache-tomcat/sso/README.md rename to server-modules/apache-tomcat/sso/README.md diff --git a/apache-tomcat/sso/docker-compose.yml b/server-modules/apache-tomcat/sso/docker-compose.yml similarity index 100% rename from apache-tomcat/sso/docker-compose.yml rename to server-modules/apache-tomcat/sso/docker-compose.yml diff --git a/apache-tomcat/sso/pom.xml b/server-modules/apache-tomcat/sso/pom.xml similarity index 100% rename from apache-tomcat/sso/pom.xml rename to server-modules/apache-tomcat/sso/pom.xml diff --git a/apache-tomcat/sso/res/conf/catalina.policy b/server-modules/apache-tomcat/sso/res/conf/catalina.policy similarity index 100% rename from apache-tomcat/sso/res/conf/catalina.policy rename to server-modules/apache-tomcat/sso/res/conf/catalina.policy diff --git a/apache-tomcat/sso/res/conf/catalina.properties b/server-modules/apache-tomcat/sso/res/conf/catalina.properties similarity index 100% rename from apache-tomcat/sso/res/conf/catalina.properties rename to server-modules/apache-tomcat/sso/res/conf/catalina.properties diff --git a/apache-tomcat/sso/res/conf/context.xml b/server-modules/apache-tomcat/sso/res/conf/context.xml similarity index 100% rename from apache-tomcat/sso/res/conf/context.xml rename to server-modules/apache-tomcat/sso/res/conf/context.xml diff --git a/apache-tomcat/sso/res/conf/jaspic-providers.xml b/server-modules/apache-tomcat/sso/res/conf/jaspic-providers.xml similarity index 100% rename from apache-tomcat/sso/res/conf/jaspic-providers.xml rename to server-modules/apache-tomcat/sso/res/conf/jaspic-providers.xml diff --git a/apache-tomcat/sso/res/conf/jaspic-providers.xsd b/server-modules/apache-tomcat/sso/res/conf/jaspic-providers.xsd similarity index 100% rename from apache-tomcat/sso/res/conf/jaspic-providers.xsd rename to server-modules/apache-tomcat/sso/res/conf/jaspic-providers.xsd diff --git a/apache-tomcat/sso/res/conf/logging.properties b/server-modules/apache-tomcat/sso/res/conf/logging.properties similarity index 100% rename from apache-tomcat/sso/res/conf/logging.properties rename to server-modules/apache-tomcat/sso/res/conf/logging.properties diff --git a/apache-tomcat/sso/res/conf/server.xml b/server-modules/apache-tomcat/sso/res/conf/server.xml similarity index 100% rename from apache-tomcat/sso/res/conf/server.xml rename to server-modules/apache-tomcat/sso/res/conf/server.xml diff --git a/apache-tomcat/sso/res/conf/tomcat-users.xml b/server-modules/apache-tomcat/sso/res/conf/tomcat-users.xml similarity index 100% rename from apache-tomcat/sso/res/conf/tomcat-users.xml rename to server-modules/apache-tomcat/sso/res/conf/tomcat-users.xml diff --git a/apache-tomcat/sso/res/conf/tomcat-users.xsd b/server-modules/apache-tomcat/sso/res/conf/tomcat-users.xsd similarity index 100% rename from apache-tomcat/sso/res/conf/tomcat-users.xsd rename to server-modules/apache-tomcat/sso/res/conf/tomcat-users.xsd diff --git a/apache-tomcat/sso/res/conf/web.xml b/server-modules/apache-tomcat/sso/res/conf/web.xml similarity index 100% rename from apache-tomcat/sso/res/conf/web.xml rename to server-modules/apache-tomcat/sso/res/conf/web.xml diff --git a/apache-tomcat/sso/webapps/ping/WEB-INF/web.xml b/server-modules/apache-tomcat/sso/webapps/ping/WEB-INF/web.xml similarity index 100% rename from apache-tomcat/sso/webapps/ping/WEB-INF/web.xml rename to server-modules/apache-tomcat/sso/webapps/ping/WEB-INF/web.xml diff --git a/apache-tomcat/sso/webapps/ping/index.html b/server-modules/apache-tomcat/sso/webapps/ping/index.html similarity index 100% rename from apache-tomcat/sso/webapps/ping/index.html rename to server-modules/apache-tomcat/sso/webapps/ping/index.html diff --git a/apache-tomcat/sso/webapps/ping/logging.html b/server-modules/apache-tomcat/sso/webapps/ping/logging.html similarity index 100% rename from apache-tomcat/sso/webapps/ping/logging.html rename to server-modules/apache-tomcat/sso/webapps/ping/logging.html diff --git a/apache-tomcat/sso/webapps/ping/logging_error.html b/server-modules/apache-tomcat/sso/webapps/ping/logging_error.html similarity index 100% rename from apache-tomcat/sso/webapps/ping/logging_error.html rename to server-modules/apache-tomcat/sso/webapps/ping/logging_error.html diff --git a/apache-tomcat/sso/webapps/ping/private/index.html b/server-modules/apache-tomcat/sso/webapps/ping/private/index.html similarity index 100% rename from apache-tomcat/sso/webapps/ping/private/index.html rename to server-modules/apache-tomcat/sso/webapps/ping/private/index.html diff --git a/apache-tomcat/sso/webapps/pong/WEB-INF/web.xml b/server-modules/apache-tomcat/sso/webapps/pong/WEB-INF/web.xml similarity index 100% rename from apache-tomcat/sso/webapps/pong/WEB-INF/web.xml rename to server-modules/apache-tomcat/sso/webapps/pong/WEB-INF/web.xml diff --git a/apache-tomcat/sso/webapps/pong/index.html b/server-modules/apache-tomcat/sso/webapps/pong/index.html similarity index 100% rename from apache-tomcat/sso/webapps/pong/index.html rename to server-modules/apache-tomcat/sso/webapps/pong/index.html diff --git a/apache-tomcat/sso/webapps/pong/private/index.html b/server-modules/apache-tomcat/sso/webapps/pong/private/index.html similarity index 100% rename from apache-tomcat/sso/webapps/pong/private/index.html rename to server-modules/apache-tomcat/sso/webapps/pong/private/index.html diff --git a/netty/README.md b/server-modules/netty/README.md similarity index 100% rename from netty/README.md rename to server-modules/netty/README.md diff --git a/netty/pom.xml b/server-modules/netty/pom.xml similarity index 91% rename from netty/pom.xml rename to server-modules/netty/pom.xml index c235ec9f4a..698b693a7d 100644 --- a/netty/pom.xml +++ b/server-modules/netty/pom.xml @@ -4,12 +4,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 netty - 0.0.1-SNAPSHOT netty com.baeldung - parent-modules + server-modules 1.0.0-SNAPSHOT @@ -31,4 +30,4 @@ 2.4.0 - \ No newline at end of file + diff --git a/netty/src/main/java/com/baeldung/http/server/CustomHttpServerHandler.java b/server-modules/netty/src/main/java/com/baeldung/http/server/CustomHttpServerHandler.java similarity index 100% rename from netty/src/main/java/com/baeldung/http/server/CustomHttpServerHandler.java rename to server-modules/netty/src/main/java/com/baeldung/http/server/CustomHttpServerHandler.java diff --git a/netty/src/main/java/com/baeldung/http/server/HttpServer.java b/server-modules/netty/src/main/java/com/baeldung/http/server/HttpServer.java similarity index 100% rename from netty/src/main/java/com/baeldung/http/server/HttpServer.java rename to server-modules/netty/src/main/java/com/baeldung/http/server/HttpServer.java diff --git a/netty/src/main/java/com/baeldung/http/server/RequestUtils.java b/server-modules/netty/src/main/java/com/baeldung/http/server/RequestUtils.java similarity index 100% rename from netty/src/main/java/com/baeldung/http/server/RequestUtils.java rename to server-modules/netty/src/main/java/com/baeldung/http/server/RequestUtils.java diff --git a/netty/src/main/java/com/baeldung/netty/http2/Http2Util.java b/server-modules/netty/src/main/java/com/baeldung/netty/http2/Http2Util.java similarity index 100% rename from netty/src/main/java/com/baeldung/netty/http2/Http2Util.java rename to server-modules/netty/src/main/java/com/baeldung/netty/http2/Http2Util.java diff --git a/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientInitializer.java b/server-modules/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientInitializer.java similarity index 100% rename from netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientInitializer.java rename to server-modules/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientInitializer.java diff --git a/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientResponseHandler.java b/server-modules/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientResponseHandler.java similarity index 100% rename from netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientResponseHandler.java rename to server-modules/netty/src/main/java/com/baeldung/netty/http2/client/Http2ClientResponseHandler.java diff --git a/netty/src/main/java/com/baeldung/netty/http2/client/Http2SettingsHandler.java b/server-modules/netty/src/main/java/com/baeldung/netty/http2/client/Http2SettingsHandler.java similarity index 100% rename from netty/src/main/java/com/baeldung/netty/http2/client/Http2SettingsHandler.java rename to server-modules/netty/src/main/java/com/baeldung/netty/http2/client/Http2SettingsHandler.java diff --git a/netty/src/main/java/com/baeldung/netty/http2/server/Http2Server.java b/server-modules/netty/src/main/java/com/baeldung/netty/http2/server/Http2Server.java similarity index 100% rename from netty/src/main/java/com/baeldung/netty/http2/server/Http2Server.java rename to server-modules/netty/src/main/java/com/baeldung/netty/http2/server/Http2Server.java diff --git a/netty/src/main/java/com/baeldung/netty/http2/server/Http2ServerResponseHandler.java b/server-modules/netty/src/main/java/com/baeldung/netty/http2/server/Http2ServerResponseHandler.java similarity index 100% rename from netty/src/main/java/com/baeldung/netty/http2/server/Http2ServerResponseHandler.java rename to server-modules/netty/src/main/java/com/baeldung/netty/http2/server/Http2ServerResponseHandler.java diff --git a/netty/src/main/resources/logback.xml b/server-modules/netty/src/main/resources/logback.xml similarity index 100% rename from netty/src/main/resources/logback.xml rename to server-modules/netty/src/main/resources/logback.xml diff --git a/netty/src/test/java/com/baeldung/http/server/HttpServerLiveTest.java b/server-modules/netty/src/test/java/com/baeldung/http/server/HttpServerLiveTest.java similarity index 100% rename from netty/src/test/java/com/baeldung/http/server/HttpServerLiveTest.java rename to server-modules/netty/src/test/java/com/baeldung/http/server/HttpServerLiveTest.java diff --git a/netty/src/test/java/com/baeldung/http/server/ResponseAggregator.java b/server-modules/netty/src/test/java/com/baeldung/http/server/ResponseAggregator.java similarity index 100% rename from netty/src/test/java/com/baeldung/http/server/ResponseAggregator.java rename to server-modules/netty/src/test/java/com/baeldung/http/server/ResponseAggregator.java diff --git a/netty/src/test/java/com/baeldung/netty/Http2ClientLiveTest.java b/server-modules/netty/src/test/java/com/baeldung/netty/Http2ClientLiveTest.java similarity index 100% rename from netty/src/test/java/com/baeldung/netty/Http2ClientLiveTest.java rename to server-modules/netty/src/test/java/com/baeldung/netty/Http2ClientLiveTest.java diff --git a/server-modules/pom.xml b/server-modules/pom.xml new file mode 100644 index 0000000000..5e66256e3a --- /dev/null +++ b/server-modules/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + server-modules + server-modules + pom + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + + apache-tomcat + netty + undertow + wildfly + + diff --git a/undertow/README.md b/server-modules/undertow/README.md similarity index 100% rename from undertow/README.md rename to server-modules/undertow/README.md diff --git a/undertow/pom.xml b/server-modules/undertow/pom.xml similarity index 94% rename from undertow/pom.xml rename to server-modules/undertow/pom.xml index 47e512daad..b40789f37d 100644 --- a/undertow/pom.xml +++ b/server-modules/undertow/pom.xml @@ -5,14 +5,12 @@ 4.0.0 com.baeldung.undertow undertow - 1.0-SNAPSHOT undertow jar - http://maven.apache.org com.baeldung - parent-modules + server-modules 1.0.0-SNAPSHOT @@ -52,4 +50,4 @@ 3.0.2 - \ No newline at end of file + diff --git a/undertow/src/main/java/com/baeldung/undertow/SimpleServer.java b/server-modules/undertow/src/main/java/com/baeldung/undertow/SimpleServer.java similarity index 100% rename from undertow/src/main/java/com/baeldung/undertow/SimpleServer.java rename to server-modules/undertow/src/main/java/com/baeldung/undertow/SimpleServer.java diff --git a/undertow/src/main/java/com/baeldung/undertow/ftp/FileServer.java b/server-modules/undertow/src/main/java/com/baeldung/undertow/ftp/FileServer.java similarity index 100% rename from undertow/src/main/java/com/baeldung/undertow/ftp/FileServer.java rename to server-modules/undertow/src/main/java/com/baeldung/undertow/ftp/FileServer.java diff --git a/undertow/src/main/java/com/baeldung/undertow/secure/CustomIdentityManager.java b/server-modules/undertow/src/main/java/com/baeldung/undertow/secure/CustomIdentityManager.java similarity index 100% rename from undertow/src/main/java/com/baeldung/undertow/secure/CustomIdentityManager.java rename to server-modules/undertow/src/main/java/com/baeldung/undertow/secure/CustomIdentityManager.java diff --git a/undertow/src/main/java/com/baeldung/undertow/secure/SecureServer.java b/server-modules/undertow/src/main/java/com/baeldung/undertow/secure/SecureServer.java similarity index 100% rename from undertow/src/main/java/com/baeldung/undertow/secure/SecureServer.java rename to server-modules/undertow/src/main/java/com/baeldung/undertow/secure/SecureServer.java diff --git a/undertow/src/main/java/com/baeldung/undertow/socket/SocketServer.java b/server-modules/undertow/src/main/java/com/baeldung/undertow/socket/SocketServer.java similarity index 100% rename from undertow/src/main/java/com/baeldung/undertow/socket/SocketServer.java rename to server-modules/undertow/src/main/java/com/baeldung/undertow/socket/SocketServer.java diff --git a/spring-freemarker/src/main/resources/logback.xml b/server-modules/undertow/src/main/resources/logback.xml similarity index 100% rename from spring-freemarker/src/main/resources/logback.xml rename to server-modules/undertow/src/main/resources/logback.xml diff --git a/wildfly/README.md b/server-modules/wildfly/README.md similarity index 100% rename from wildfly/README.md rename to server-modules/wildfly/README.md diff --git a/wildfly/pom.xml b/server-modules/wildfly/pom.xml similarity index 100% rename from wildfly/pom.xml rename to server-modules/wildfly/pom.xml diff --git a/wildfly/src/main/java/hello/Application.java b/server-modules/wildfly/src/main/java/hello/Application.java similarity index 100% rename from wildfly/src/main/java/hello/Application.java rename to server-modules/wildfly/src/main/java/hello/Application.java diff --git a/wildfly/src/main/java/hello/HelloController.java b/server-modules/wildfly/src/main/java/hello/HelloController.java similarity index 100% rename from wildfly/src/main/java/hello/HelloController.java rename to server-modules/wildfly/src/main/java/hello/HelloController.java diff --git a/spring-web-modules/pom.xml b/spring-web-modules/pom.xml index a676a86d80..0f8465ce98 100644 --- a/spring-web-modules/pom.xml +++ b/spring-web-modules/pom.xml @@ -16,6 +16,7 @@ spring-5-mvc + spring-freemarker spring-mvc-basics spring-mvc-basics-2 spring-mvc-basics-3 @@ -51,4 +52,4 @@ spring-web-url - \ No newline at end of file + diff --git a/spring-freemarker/.gitignore b/spring-web-modules/spring-freemarker/.gitignore similarity index 100% rename from spring-freemarker/.gitignore rename to spring-web-modules/spring-freemarker/.gitignore diff --git a/spring-freemarker/README.md b/spring-web-modules/spring-freemarker/README.md similarity index 100% rename from spring-freemarker/README.md rename to spring-web-modules/spring-freemarker/README.md diff --git a/spring-freemarker/pom.xml b/spring-web-modules/spring-freemarker/pom.xml similarity index 100% rename from spring-freemarker/pom.xml rename to spring-web-modules/spring-freemarker/pom.xml diff --git a/spring-freemarker/src/main/java/com/baeldung/freemarker/config/SpringWebConfig.java b/spring-web-modules/spring-freemarker/src/main/java/com/baeldung/freemarker/config/SpringWebConfig.java similarity index 100% rename from spring-freemarker/src/main/java/com/baeldung/freemarker/config/SpringWebConfig.java rename to spring-web-modules/spring-freemarker/src/main/java/com/baeldung/freemarker/config/SpringWebConfig.java diff --git a/spring-freemarker/src/main/java/com/baeldung/freemarker/config/WebConfiguration.java b/spring-web-modules/spring-freemarker/src/main/java/com/baeldung/freemarker/config/WebConfiguration.java similarity index 100% rename from spring-freemarker/src/main/java/com/baeldung/freemarker/config/WebConfiguration.java rename to spring-web-modules/spring-freemarker/src/main/java/com/baeldung/freemarker/config/WebConfiguration.java diff --git a/spring-freemarker/src/main/java/com/baeldung/freemarker/controller/SpringController.java b/spring-web-modules/spring-freemarker/src/main/java/com/baeldung/freemarker/controller/SpringController.java similarity index 100% rename from spring-freemarker/src/main/java/com/baeldung/freemarker/controller/SpringController.java rename to spring-web-modules/spring-freemarker/src/main/java/com/baeldung/freemarker/controller/SpringController.java diff --git a/spring-freemarker/src/main/java/com/baeldung/freemarker/method/LastCharMethod.java b/spring-web-modules/spring-freemarker/src/main/java/com/baeldung/freemarker/method/LastCharMethod.java similarity index 100% rename from spring-freemarker/src/main/java/com/baeldung/freemarker/method/LastCharMethod.java rename to spring-web-modules/spring-freemarker/src/main/java/com/baeldung/freemarker/method/LastCharMethod.java diff --git a/spring-freemarker/src/main/java/com/baeldung/freemarker/model/Car.java b/spring-web-modules/spring-freemarker/src/main/java/com/baeldung/freemarker/model/Car.java similarity index 100% rename from spring-freemarker/src/main/java/com/baeldung/freemarker/model/Car.java rename to spring-web-modules/spring-freemarker/src/main/java/com/baeldung/freemarker/model/Car.java diff --git a/undertow/src/main/resources/logback.xml b/spring-web-modules/spring-freemarker/src/main/resources/logback.xml similarity index 100% rename from undertow/src/main/resources/logback.xml rename to spring-web-modules/spring-freemarker/src/main/resources/logback.xml diff --git a/spring-freemarker/src/main/webapp/WEB-INF/views/ftl/commons.ftl b/spring-web-modules/spring-freemarker/src/main/webapp/WEB-INF/views/ftl/commons.ftl similarity index 100% rename from spring-freemarker/src/main/webapp/WEB-INF/views/ftl/commons.ftl rename to spring-web-modules/spring-freemarker/src/main/webapp/WEB-INF/views/ftl/commons.ftl diff --git a/spring-freemarker/src/main/webapp/WEB-INF/views/ftl/index.ftl b/spring-web-modules/spring-freemarker/src/main/webapp/WEB-INF/views/ftl/index.ftl similarity index 100% rename from spring-freemarker/src/main/webapp/WEB-INF/views/ftl/index.ftl rename to spring-web-modules/spring-freemarker/src/main/webapp/WEB-INF/views/ftl/index.ftl diff --git a/spring-freemarker/src/main/webapp/WEB-INF/web.xml b/spring-web-modules/spring-freemarker/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from spring-freemarker/src/main/webapp/WEB-INF/web.xml rename to spring-web-modules/spring-freemarker/src/main/webapp/WEB-INF/web.xml diff --git a/spring-freemarker/src/test/java/com/baeldung/SpringContextTest.java b/spring-web-modules/spring-freemarker/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-freemarker/src/test/java/com/baeldung/SpringContextTest.java rename to spring-web-modules/spring-freemarker/src/test/java/com/baeldung/SpringContextTest.java From 979f49067b87f9cb66b356ddc6a744086fc84922 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 24 Nov 2022 20:32:23 +0530 Subject: [PATCH 017/592] JAVA-15787 Moved spring-rector and spring-webflux-amqp to spring-reactive-modules --- pom.xml | 4 ---- spring-reactive-modules/pom.xml | 4 +++- .../spring-reactor}/README.md | 0 .../spring-reactor}/pom.xml | 0 .../src/main/java/com/baeldung/reactorbus/Config.java | 0 .../java/com/baeldung/reactorbus/NotificationApplication.java | 0 .../baeldung/reactorbus/consumer/NotificationConsumer.java | 0 .../reactorbus/controller/NotificationController.java | 0 .../java/com/baeldung/reactorbus/domain/NotificationData.java | 0 .../com/baeldung/reactorbus/service/NotificationService.java | 0 .../reactorbus/service/impl/NotificationServiceimpl.java | 0 .../spring-reactor}/src/main/resources/logback.xml | 0 .../src/test/java/com/baeldung/SpringContextTest.java | 0 .../reactorbus/NotificationApplicationIntegrationTest.java | 0 .../spring-webflux-amqp}/.gitignore | 0 .../spring-webflux-amqp}/README.md | 0 .../spring-webflux-amqp}/pom.xml | 0 .../java/com/baeldung/spring/amqp/AmqpReactiveController.java | 0 .../java/com/baeldung/spring/amqp/DestinationsConfig.java | 0 .../baeldung/spring/amqp/MessageListenerContainerFactory.java | 0 .../baeldung/spring/amqp/SpringWebfluxAmqpApplication.java | 0 .../spring-webflux-amqp}/src/main/resources/application.yml | 0 .../spring-webflux-amqp}/src/main/resources/logback.xml | 0 .../src/test/java/com/baeldung/SpringContextLiveTest.java | 0 .../com/baeldung/spring/amqp/SpringWebfluxAmqpLiveTest.java | 0 25 files changed, 3 insertions(+), 5 deletions(-) rename {spring-reactor => spring-reactive-modules/spring-reactor}/README.md (100%) rename {spring-reactor => spring-reactive-modules/spring-reactor}/pom.xml (100%) rename {spring-reactor => spring-reactive-modules/spring-reactor}/src/main/java/com/baeldung/reactorbus/Config.java (100%) rename {spring-reactor => spring-reactive-modules/spring-reactor}/src/main/java/com/baeldung/reactorbus/NotificationApplication.java (100%) rename {spring-reactor => spring-reactive-modules/spring-reactor}/src/main/java/com/baeldung/reactorbus/consumer/NotificationConsumer.java (100%) rename {spring-reactor => spring-reactive-modules/spring-reactor}/src/main/java/com/baeldung/reactorbus/controller/NotificationController.java (100%) rename {spring-reactor => spring-reactive-modules/spring-reactor}/src/main/java/com/baeldung/reactorbus/domain/NotificationData.java (100%) rename {spring-reactor => spring-reactive-modules/spring-reactor}/src/main/java/com/baeldung/reactorbus/service/NotificationService.java (100%) rename {spring-reactor => spring-reactive-modules/spring-reactor}/src/main/java/com/baeldung/reactorbus/service/impl/NotificationServiceimpl.java (100%) rename {spring-reactor => spring-reactive-modules/spring-reactor}/src/main/resources/logback.xml (100%) rename {spring-reactor => spring-reactive-modules/spring-reactor}/src/test/java/com/baeldung/SpringContextTest.java (100%) rename {spring-reactor => spring-reactive-modules/spring-reactor}/src/test/java/com/baeldung/reactorbus/NotificationApplicationIntegrationTest.java (100%) rename {spring-webflux-amqp => spring-reactive-modules/spring-webflux-amqp}/.gitignore (100%) rename {spring-webflux-amqp => spring-reactive-modules/spring-webflux-amqp}/README.md (100%) rename {spring-webflux-amqp => spring-reactive-modules/spring-webflux-amqp}/pom.xml (100%) rename {spring-webflux-amqp => spring-reactive-modules/spring-webflux-amqp}/src/main/java/com/baeldung/spring/amqp/AmqpReactiveController.java (100%) rename {spring-webflux-amqp => spring-reactive-modules/spring-webflux-amqp}/src/main/java/com/baeldung/spring/amqp/DestinationsConfig.java (100%) rename {spring-webflux-amqp => spring-reactive-modules/spring-webflux-amqp}/src/main/java/com/baeldung/spring/amqp/MessageListenerContainerFactory.java (100%) rename {spring-webflux-amqp => spring-reactive-modules/spring-webflux-amqp}/src/main/java/com/baeldung/spring/amqp/SpringWebfluxAmqpApplication.java (100%) rename {spring-webflux-amqp => spring-reactive-modules/spring-webflux-amqp}/src/main/resources/application.yml (100%) rename {spring-webflux-amqp => spring-reactive-modules/spring-webflux-amqp}/src/main/resources/logback.xml (100%) rename {spring-webflux-amqp => spring-reactive-modules/spring-webflux-amqp}/src/test/java/com/baeldung/SpringContextLiveTest.java (100%) rename {spring-webflux-amqp => spring-reactive-modules/spring-webflux-amqp}/src/test/java/com/baeldung/spring/amqp/SpringWebfluxAmqpLiveTest.java (100%) diff --git a/pom.xml b/pom.xml index 883f5b58f4..2a18379ca8 100644 --- a/pom.xml +++ b/pom.xml @@ -592,7 +592,6 @@ spring-protobuf spring-quartz - spring-reactor spring-remoting-modules spring-roo @@ -610,7 +609,6 @@ spring-vault spring-web-modules - spring-webflux-amqp spring-websockets static-analysis @@ -977,7 +975,6 @@ spring-protobuf spring-quartz - spring-reactor spring-remoting-modules spring-roo @@ -995,7 +992,6 @@ spring-vault spring-web-modules - spring-webflux-amqp spring-websockets static-analysis diff --git a/spring-reactive-modules/pom.xml b/spring-reactive-modules/pom.xml index 9822642a11..3352a00113 100644 --- a/spring-reactive-modules/pom.xml +++ b/spring-reactive-modules/pom.xml @@ -27,6 +27,8 @@ spring-5-reactive-security spring-reactive spring-reactive-exceptions + spring-reactor + spring-webflux-amqp @@ -62,4 +64,4 @@ - \ No newline at end of file + diff --git a/spring-reactor/README.md b/spring-reactive-modules/spring-reactor/README.md similarity index 100% rename from spring-reactor/README.md rename to spring-reactive-modules/spring-reactor/README.md diff --git a/spring-reactor/pom.xml b/spring-reactive-modules/spring-reactor/pom.xml similarity index 100% rename from spring-reactor/pom.xml rename to spring-reactive-modules/spring-reactor/pom.xml diff --git a/spring-reactor/src/main/java/com/baeldung/reactorbus/Config.java b/spring-reactive-modules/spring-reactor/src/main/java/com/baeldung/reactorbus/Config.java similarity index 100% rename from spring-reactor/src/main/java/com/baeldung/reactorbus/Config.java rename to spring-reactive-modules/spring-reactor/src/main/java/com/baeldung/reactorbus/Config.java diff --git a/spring-reactor/src/main/java/com/baeldung/reactorbus/NotificationApplication.java b/spring-reactive-modules/spring-reactor/src/main/java/com/baeldung/reactorbus/NotificationApplication.java similarity index 100% rename from spring-reactor/src/main/java/com/baeldung/reactorbus/NotificationApplication.java rename to spring-reactive-modules/spring-reactor/src/main/java/com/baeldung/reactorbus/NotificationApplication.java diff --git a/spring-reactor/src/main/java/com/baeldung/reactorbus/consumer/NotificationConsumer.java b/spring-reactive-modules/spring-reactor/src/main/java/com/baeldung/reactorbus/consumer/NotificationConsumer.java similarity index 100% rename from spring-reactor/src/main/java/com/baeldung/reactorbus/consumer/NotificationConsumer.java rename to spring-reactive-modules/spring-reactor/src/main/java/com/baeldung/reactorbus/consumer/NotificationConsumer.java diff --git a/spring-reactor/src/main/java/com/baeldung/reactorbus/controller/NotificationController.java b/spring-reactive-modules/spring-reactor/src/main/java/com/baeldung/reactorbus/controller/NotificationController.java similarity index 100% rename from spring-reactor/src/main/java/com/baeldung/reactorbus/controller/NotificationController.java rename to spring-reactive-modules/spring-reactor/src/main/java/com/baeldung/reactorbus/controller/NotificationController.java diff --git a/spring-reactor/src/main/java/com/baeldung/reactorbus/domain/NotificationData.java b/spring-reactive-modules/spring-reactor/src/main/java/com/baeldung/reactorbus/domain/NotificationData.java similarity index 100% rename from spring-reactor/src/main/java/com/baeldung/reactorbus/domain/NotificationData.java rename to spring-reactive-modules/spring-reactor/src/main/java/com/baeldung/reactorbus/domain/NotificationData.java diff --git a/spring-reactor/src/main/java/com/baeldung/reactorbus/service/NotificationService.java b/spring-reactive-modules/spring-reactor/src/main/java/com/baeldung/reactorbus/service/NotificationService.java similarity index 100% rename from spring-reactor/src/main/java/com/baeldung/reactorbus/service/NotificationService.java rename to spring-reactive-modules/spring-reactor/src/main/java/com/baeldung/reactorbus/service/NotificationService.java diff --git a/spring-reactor/src/main/java/com/baeldung/reactorbus/service/impl/NotificationServiceimpl.java b/spring-reactive-modules/spring-reactor/src/main/java/com/baeldung/reactorbus/service/impl/NotificationServiceimpl.java similarity index 100% rename from spring-reactor/src/main/java/com/baeldung/reactorbus/service/impl/NotificationServiceimpl.java rename to spring-reactive-modules/spring-reactor/src/main/java/com/baeldung/reactorbus/service/impl/NotificationServiceimpl.java diff --git a/spring-reactor/src/main/resources/logback.xml b/spring-reactive-modules/spring-reactor/src/main/resources/logback.xml similarity index 100% rename from spring-reactor/src/main/resources/logback.xml rename to spring-reactive-modules/spring-reactor/src/main/resources/logback.xml diff --git a/spring-reactor/src/test/java/com/baeldung/SpringContextTest.java b/spring-reactive-modules/spring-reactor/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-reactor/src/test/java/com/baeldung/SpringContextTest.java rename to spring-reactive-modules/spring-reactor/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-reactor/src/test/java/com/baeldung/reactorbus/NotificationApplicationIntegrationTest.java b/spring-reactive-modules/spring-reactor/src/test/java/com/baeldung/reactorbus/NotificationApplicationIntegrationTest.java similarity index 100% rename from spring-reactor/src/test/java/com/baeldung/reactorbus/NotificationApplicationIntegrationTest.java rename to spring-reactive-modules/spring-reactor/src/test/java/com/baeldung/reactorbus/NotificationApplicationIntegrationTest.java diff --git a/spring-webflux-amqp/.gitignore b/spring-reactive-modules/spring-webflux-amqp/.gitignore similarity index 100% rename from spring-webflux-amqp/.gitignore rename to spring-reactive-modules/spring-webflux-amqp/.gitignore diff --git a/spring-webflux-amqp/README.md b/spring-reactive-modules/spring-webflux-amqp/README.md similarity index 100% rename from spring-webflux-amqp/README.md rename to spring-reactive-modules/spring-webflux-amqp/README.md diff --git a/spring-webflux-amqp/pom.xml b/spring-reactive-modules/spring-webflux-amqp/pom.xml similarity index 100% rename from spring-webflux-amqp/pom.xml rename to spring-reactive-modules/spring-webflux-amqp/pom.xml diff --git a/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/AmqpReactiveController.java b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/AmqpReactiveController.java similarity index 100% rename from spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/AmqpReactiveController.java rename to spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/AmqpReactiveController.java diff --git a/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/DestinationsConfig.java b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/DestinationsConfig.java similarity index 100% rename from spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/DestinationsConfig.java rename to spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/DestinationsConfig.java diff --git a/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/MessageListenerContainerFactory.java b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/MessageListenerContainerFactory.java similarity index 100% rename from spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/MessageListenerContainerFactory.java rename to spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/MessageListenerContainerFactory.java diff --git a/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/SpringWebfluxAmqpApplication.java b/spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/SpringWebfluxAmqpApplication.java similarity index 100% rename from spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/SpringWebfluxAmqpApplication.java rename to spring-reactive-modules/spring-webflux-amqp/src/main/java/com/baeldung/spring/amqp/SpringWebfluxAmqpApplication.java diff --git a/spring-webflux-amqp/src/main/resources/application.yml b/spring-reactive-modules/spring-webflux-amqp/src/main/resources/application.yml similarity index 100% rename from spring-webflux-amqp/src/main/resources/application.yml rename to spring-reactive-modules/spring-webflux-amqp/src/main/resources/application.yml diff --git a/spring-webflux-amqp/src/main/resources/logback.xml b/spring-reactive-modules/spring-webflux-amqp/src/main/resources/logback.xml similarity index 100% rename from spring-webflux-amqp/src/main/resources/logback.xml rename to spring-reactive-modules/spring-webflux-amqp/src/main/resources/logback.xml diff --git a/spring-webflux-amqp/src/test/java/com/baeldung/SpringContextLiveTest.java b/spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/SpringContextLiveTest.java similarity index 100% rename from spring-webflux-amqp/src/test/java/com/baeldung/SpringContextLiveTest.java rename to spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/SpringContextLiveTest.java diff --git a/spring-webflux-amqp/src/test/java/com/baeldung/spring/amqp/SpringWebfluxAmqpLiveTest.java b/spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/spring/amqp/SpringWebfluxAmqpLiveTest.java similarity index 100% rename from spring-webflux-amqp/src/test/java/com/baeldung/spring/amqp/SpringWebfluxAmqpLiveTest.java rename to spring-reactive-modules/spring-webflux-amqp/src/test/java/com/baeldung/spring/amqp/SpringWebfluxAmqpLiveTest.java From e3aee5c129351da9821437224078b1e41b77391c Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 24 Nov 2022 23:39:57 +0530 Subject: [PATCH 018/592] JAVA-15989 Renamed to jenkins to jenkins-modules --- {jenkins => jenkins-modules}/README.md | 0 {jenkins => jenkins-modules}/plugins/README.md | 0 {jenkins => jenkins-modules}/plugins/pom.xml | 0 .../main/java/com/baeldung/jenkins/plugins/ProjectStats.java | 0 .../baeldung/jenkins/plugins/ProjectStatsBuildWrapper.java | 0 .../plugins/src/main/resources/logback.xml | 0 .../plugins/src/main/resources/stats.html | 0 {jenkins => jenkins-modules}/pom.xml | 4 ++-- pom.xml | 4 ++-- 9 files changed, 4 insertions(+), 4 deletions(-) rename {jenkins => jenkins-modules}/README.md (100%) rename {jenkins => jenkins-modules}/plugins/README.md (100%) rename {jenkins => jenkins-modules}/plugins/pom.xml (100%) rename {jenkins => jenkins-modules}/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStats.java (100%) rename {jenkins => jenkins-modules}/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStatsBuildWrapper.java (100%) rename {jenkins => jenkins-modules}/plugins/src/main/resources/logback.xml (100%) rename {jenkins => jenkins-modules}/plugins/src/main/resources/stats.html (100%) rename {jenkins => jenkins-modules}/pom.xml (87%) diff --git a/jenkins/README.md b/jenkins-modules/README.md similarity index 100% rename from jenkins/README.md rename to jenkins-modules/README.md diff --git a/jenkins/plugins/README.md b/jenkins-modules/plugins/README.md similarity index 100% rename from jenkins/plugins/README.md rename to jenkins-modules/plugins/README.md diff --git a/jenkins/plugins/pom.xml b/jenkins-modules/plugins/pom.xml similarity index 100% rename from jenkins/plugins/pom.xml rename to jenkins-modules/plugins/pom.xml diff --git a/jenkins/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStats.java b/jenkins-modules/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStats.java similarity index 100% rename from jenkins/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStats.java rename to jenkins-modules/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStats.java diff --git a/jenkins/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStatsBuildWrapper.java b/jenkins-modules/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStatsBuildWrapper.java similarity index 100% rename from jenkins/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStatsBuildWrapper.java rename to jenkins-modules/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStatsBuildWrapper.java diff --git a/jenkins/plugins/src/main/resources/logback.xml b/jenkins-modules/plugins/src/main/resources/logback.xml similarity index 100% rename from jenkins/plugins/src/main/resources/logback.xml rename to jenkins-modules/plugins/src/main/resources/logback.xml diff --git a/jenkins/plugins/src/main/resources/stats.html b/jenkins-modules/plugins/src/main/resources/stats.html similarity index 100% rename from jenkins/plugins/src/main/resources/stats.html rename to jenkins-modules/plugins/src/main/resources/stats.html diff --git a/jenkins/pom.xml b/jenkins-modules/pom.xml similarity index 87% rename from jenkins/pom.xml rename to jenkins-modules/pom.xml index cdd701f7d3..35777a08d8 100644 --- a/jenkins/pom.xml +++ b/jenkins-modules/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 - jenkins - jenkins + jenkins-modules + jenkins-modules pom diff --git a/pom.xml b/pom.xml index 2a18379ca8..60f8512052 100644 --- a/pom.xml +++ b/pom.xml @@ -672,7 +672,7 @@ image-processing - jenkins + jenkins-modules jhipster-modules jhipster-5 jws @@ -1047,7 +1047,7 @@ image-processing - jenkins + jenkins-modules jhipster-modules jhipster-5 jws From d5a255da3e5e900222b68c089786795136dd3f34 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 24 Nov 2022 19:06:29 +0000 Subject: [PATCH 019/592] Upgrade to HttpClient 5 (#13026) * [JAVA-14911] Added HttpClient 5.2 dependencies * [JAVA-14911] Clean up * [JAVA-14911] Clean up Co-authored-by: panagiotiskakos --- httpclient-simple/pom.xml | 30 +++++++++- .../httpclient/HttpClientParamsLiveTest.java | 57 +++++++++---------- 2 files changed, 54 insertions(+), 33 deletions(-) diff --git a/httpclient-simple/pom.xml b/httpclient-simple/pom.xml index 49e47afe92..edd2838f3a 100644 --- a/httpclient-simple/pom.xml +++ b/httpclient-simple/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 httpclient-simple 0.1-SNAPSHOT @@ -101,6 +101,18 @@ + + + org.apache.httpcomponents.core5 + httpcore5 + ${httpcore5.version} + + + commons-logging + commons-logging + + + org.apache.commons @@ -130,6 +142,17 @@ + + org.apache.httpcomponents.client5 + httpclient5 + ${httpclient5.version} + + + commons-logging + commons-logging + + + org.apache.httpcomponents httpmime @@ -283,6 +306,9 @@ 2.5.1 4.4.11 4.5.8 + + 5.2 + 5.2 1.6.1 diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientParamsLiveTest.java b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientParamsLiveTest.java index f3ea9be089..f56a6863a3 100644 --- a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientParamsLiveTest.java +++ b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientParamsLiveTest.java @@ -10,17 +10,17 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; -import org.apache.http.NameValuePair; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.entity.UrlEncodedFormEntity; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.methods.HttpRequestBase; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.message.BasicNameValuePair; +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.classic.methods.HttpPost; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.client5.http.ClientProtocolException; +import org.apache.hc.client5.http.entity.UrlEncodedFormEntity; +import org.apache.hc.core5.http.NameValuePair; +import org.apache.hc.core5.http.message.BasicNameValuePair; +import org.apache.hc.core5.net.URIBuilder; + import org.junit.Before; import org.junit.Test; @@ -36,7 +36,7 @@ public class HttpClientParamsLiveTest { public void setUp() { client = HttpClientBuilder.create() .build(); - nameValuePairs = new ArrayList(); + nameValuePairs = new ArrayList<>(); NameValuePair param1NameValuePair = new BasicNameValuePair("param1", "value1"); NameValuePair param2NameValuePair = new BasicNameValuePair("param2", "value2"); nameValuePairs.add(param1NameValuePair); @@ -46,54 +46,50 @@ public class HttpClientParamsLiveTest { @Test public void givenStringNameValuePairParams_whenGetRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { HttpGet httpGet = new HttpGet("https://postman-echo.com/get"); - URI uri = new URIBuilder(httpGet.getURI()).addParameter("param1", "value1") + URI uri = new URIBuilder(httpGet.getUri()).addParameter("param1", "value1") .addParameter("param2", "value2") .build(); - ((HttpRequestBase) httpGet).setURI(uri); - response = client.execute(httpGet); + httpGet.setUri(uri); - assertThat(response.getStatusLine() - .getStatusCode(), equalTo(200)); + response = client.execute(httpGet); + assertThat(response.getCode(), equalTo(200)); client.close(); } @Test public void givenStringNameValuePairParams_whenPostRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { HttpPost httpPost = new HttpPost("https://postman-echo.com/post"); - URI uri = new URIBuilder(httpPost.getURI()).addParameter("param1", "value1") + URI uri = new URIBuilder(httpPost.getUri()).addParameter("param1", "value1") .addParameter("param2", "value2") .build(); - ((HttpRequestBase) httpPost).setURI(uri); + httpPost.setUri(uri); response = client.execute(httpPost); - assertThat(response.getStatusLine() - .getStatusCode(), equalTo(200)); + assertThat(response.getCode(), equalTo(200)); client.close(); } @Test public void givenNameValuePairParams_whenGetRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { HttpGet httpGet = new HttpGet("https://postman-echo.com/get"); - URI uri = new URIBuilder(httpGet.getURI()).addParameters(nameValuePairs) + URI uri = new URIBuilder(httpGet.getUri()).addParameters(nameValuePairs) .build(); - ((HttpRequestBase) httpGet).setURI(uri); + httpGet.setUri(uri); response = client.execute(httpGet); - assertThat(response.getStatusLine() - .getStatusCode(), equalTo(200)); + assertThat(response.getCode(), equalTo(200)); client.close(); } @Test public void givenNameValuePairsParams_whenPostRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { HttpPost httpPost = new HttpPost("https://postman-echo.com/post"); - URI uri = new URIBuilder(httpPost.getURI()).addParameters(nameValuePairs) + URI uri = new URIBuilder(httpPost.getUri()).addParameters(nameValuePairs) .build(); - ((HttpRequestBase) httpPost).setURI(uri); + httpPost.setUri(uri); response = client.execute(httpPost); - assertThat(response.getStatusLine() - .getStatusCode(), equalTo(200)); + assertThat(response.getCode(), equalTo(200)); client.close(); } @@ -103,8 +99,7 @@ public class HttpClientParamsLiveTest { httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, StandardCharsets.UTF_8)); response = client.execute(httpPost); - assertThat(response.getStatusLine() - .getStatusCode(), equalTo(200)); + assertThat(response.getCode(), equalTo(200)); client.close(); } From 4193cc9a56b607fb20d1affac2322d7529ca629e Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 24 Nov 2022 19:12:07 +0000 Subject: [PATCH 020/592] [JAVA-15017] Upgraded httpClient version to 5.2 (#13053) Co-authored-by: panagiotiskakos --- apache-httpclient-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-httpclient-2/pom.xml b/apache-httpclient-2/pom.xml index c5b8195472..91c4c718c0 100644 --- a/apache-httpclient-2/pom.xml +++ b/apache-httpclient-2/pom.xml @@ -98,7 +98,7 @@ 3.22.0 5.11.2 4.5.8 - 5.1.3 + 5.2 11 11 2.1.7.RELEASE From fd1bf7a0298d6e338cfd3833a71713dd4bdecba3 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 24 Nov 2022 19:23:09 +0000 Subject: [PATCH 021/592] [JAVA-13962] Align code with article + clean up (#13012) * [JAVA-13962] Align code with article + clean up * [JAVA-13962] Clean up Co-authored-by: panagiotiskakos --- .../executorservice/DelayedCallable.java | 11 +++--- .../WaitingForThreadsToFinishManualTest.java | 37 ++++++++++++------- .../executorservice/CallableTask.java | 10 +++++ .../executorservice/ExecutorServiceDemo.java | 27 -------------- .../ScheduledExecutorServiceDemo.java | 30 ++++++--------- 5 files changed, 50 insertions(+), 65 deletions(-) rename core-java-modules/{core-java-concurrency-simple => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java (95%) rename core-java-modules/{core-java-concurrency-simple => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java (90%) create mode 100644 core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/CallableTask.java delete mode 100644 core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java rename core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/{Scheduledexecutorservice => executorservice}/ScheduledExecutorServiceDemo.java (59%) diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java similarity index 95% rename from core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java rename to core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java index 16d9aa4c9f..cd77069979 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java @@ -1,14 +1,15 @@ package com.baeldung.concurrent.executorservice; + import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; public class DelayedCallable implements Callable { - + private String name; private long period; private CountDownLatch latch; - + public DelayedCallable(String name, long period, CountDownLatch latch) { this(name, period); this.latch = latch; @@ -23,11 +24,11 @@ public class DelayedCallable implements Callable { try { Thread.sleep(period); - + if (latch != null) { latch.countDown(); } - + } catch (InterruptedException ex) { // handle exception ex.printStackTrace(); @@ -36,4 +37,4 @@ public class DelayedCallable implements Callable { return name; } -} +} \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java similarity index 90% rename from core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java index cd8b015be2..8e08914c3c 100644 --- a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java @@ -1,15 +1,24 @@ package com.baeldung.concurrent.executorservice; +import static junit.framework.TestCase.assertTrue; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.CompletionService; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorCompletionService; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.TimeUnit; + import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.*; - -import static junit.framework.TestCase.assertTrue; - public class WaitingForThreadsToFinishManualTest { private static final Logger LOG = LoggerFactory.getLogger(WaitingForThreadsToFinishManualTest.class); @@ -26,18 +35,18 @@ public class WaitingForThreadsToFinishManualTest { Thread.currentThread().interrupt(); } } - + @Test public void givenMultipleThreads_whenUsingCountDownLatch_thenMainShoudWaitForAllToFinish() { ExecutorService WORKER_THREAD_POOL = Executors.newFixedThreadPool(10); - + try { long startTime = System.currentTimeMillis(); // create a CountDownLatch that waits for the 2 threads to finish CountDownLatch latch = new CountDownLatch(2); - + for (int i = 0; i < 2; i++) { WORKER_THREAD_POOL.submit(() -> { try { @@ -69,13 +78,13 @@ public class WaitingForThreadsToFinishManualTest { ExecutorService WORKER_THREAD_POOL = Executors.newFixedThreadPool(10); List> callables = Arrays.asList( - new DelayedCallable("fast thread", 100), + new DelayedCallable("fast thread", 100), new DelayedCallable("slow thread", 3000)); try { long startProcessingTime = System.currentTimeMillis(); List> futures = WORKER_THREAD_POOL.invokeAll(callables); - + awaitTerminationAfterShutdown(WORKER_THREAD_POOL); try { @@ -100,7 +109,7 @@ public class WaitingForThreadsToFinishManualTest { } catch (ExecutionException | InterruptedException ex) { ex.printStackTrace(); - } + } } @Test @@ -109,7 +118,7 @@ public class WaitingForThreadsToFinishManualTest { CompletionService service = new ExecutorCompletionService<>(WORKER_THREAD_POOL); List> callables = Arrays.asList( - new DelayedCallable("fast thread", 100), + new DelayedCallable("fast thread", 100), new DelayedCallable("slow thread", 3000)); for (Callable callable : callables) { @@ -142,4 +151,4 @@ public class WaitingForThreadsToFinishManualTest { awaitTerminationAfterShutdown(WORKER_THREAD_POOL); } } -} +} \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/CallableTask.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/CallableTask.java new file mode 100644 index 0000000000..bd01491e1e --- /dev/null +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/CallableTask.java @@ -0,0 +1,10 @@ +package com.baeldung.concurrent.executorservice; + +import java.util.concurrent.Callable; + +public class CallableTask implements Callable { + @Override + public String call() throws Exception { + return "Hello world"; + } +} diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java deleted file mode 100644 index 83a9fb6692..0000000000 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.concurrent.executorservice; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - -public class ExecutorServiceDemo { - - ExecutorService executor = Executors.newFixedThreadPool(10); - - public void execute() { - - executor.submit(() -> { - new Task(); - }); - - executor.shutdown(); - executor.shutdownNow(); - try { - executor.awaitTermination(20l, TimeUnit.NANOSECONDS); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - -} diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ScheduledExecutorServiceDemo.java similarity index 59% rename from core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java rename to core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ScheduledExecutorServiceDemo.java index 0989195ba7..613cb6a022 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/executorservice/ScheduledExecutorServiceDemo.java @@ -1,13 +1,15 @@ -package com.baeldung.concurrent.Scheduledexecutorservice; +package com.baeldung.concurrent.executorservice; import java.util.concurrent.Executors; +import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.function.Function; public class ScheduledExecutorServiceDemo { + private Task runnableTask; + private CallableTask callableTask; private void execute() { ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); getTasksToRun().apply(executorService); @@ -21,23 +23,14 @@ public class ScheduledExecutorServiceDemo { } private Function getTasksToRun() { + + runnableTask = new Task(); + callableTask = new CallableTask(); + return (executorService -> { - ScheduledFuture scheduledFuture1 = executorService.schedule(() -> { - // Task - }, 1, TimeUnit.SECONDS); - - ScheduledFuture scheduledFuture2 = executorService.scheduleAtFixedRate(() -> { - // Task - }, 1, 10, TimeUnit.SECONDS); - - ScheduledFuture scheduledFuture3 = executorService.scheduleWithFixedDelay(() -> { - // Task - }, 1, 10, TimeUnit.SECONDS); - - ScheduledFuture scheduledFuture4 = executorService.schedule(() -> { - // Task - return "Hellow world"; - }, 1, TimeUnit.SECONDS); + Future resultFuture = executorService.schedule(callableTask, 1, TimeUnit.SECONDS); + executorService.scheduleAtFixedRate( runnableTask, 100, 450, TimeUnit.SECONDS); + executorService.scheduleWithFixedDelay( runnableTask, 100, 150, TimeUnit.SECONDS); return null; }); } @@ -48,5 +41,4 @@ public class ScheduledExecutorServiceDemo { demo.executeWithMultiThread(); } - } From c5944c1d3d2d25e98a4b902871b70c099d93bc08 Mon Sep 17 00:00:00 2001 From: Andrey Shcherbakov Date: Thu, 24 Nov 2022 20:29:13 +0100 Subject: [PATCH 022/592] Set the learning rates (#13052) --- .../main/java/com/baeldung/logreg/MnistClassifier.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java b/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java index c8580b9c27..01f1ef1bdc 100644 --- a/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java +++ b/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java @@ -11,6 +11,7 @@ import org.datavec.image.loader.NativeImageLoader; import org.datavec.image.recordreader.ImageRecordReader; import org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator; import org.deeplearning4j.eval.Evaluation; +import org.deeplearning4j.nn.conf.LearningRatePolicy; import org.deeplearning4j.nn.conf.MultiLayerConfiguration; import org.deeplearning4j.nn.conf.NeuralNetConfiguration; import org.deeplearning4j.nn.conf.inputs.InputType; @@ -69,7 +70,8 @@ public class MnistClassifier { String localFilePath = basePath + "mnist_png.tar.gz"; File file = new File(localFilePath); if (!file.exists()) { - file.getParentFile().mkdirs(); + file.getParentFile() + .mkdirs(); Utils.downloadAndSave(dataUrl, file); Utils.extractTarArchive(file, basePath); } @@ -132,7 +134,9 @@ public class MnistClassifier { .build(); final MultiLayerConfiguration config = new NeuralNetConfiguration.Builder().seed(seed) .l2(0.0005) // ridge regression value - .updater(new Nesterovs()) //TODO new MapSchedule(ScheduleType.ITERATION, learningRateSchedule) + .updater(new Nesterovs()) + .learningRateSchedule(learningRateSchedule) + .learningRateDecayPolicy(LearningRatePolicy.Schedule) .weightInit(WeightInit.XAVIER) .list() .layer(0, layer1) From d74259b014eb077b3ead1fdbe4ff85b33f35d7d8 Mon Sep 17 00:00:00 2001 From: Bhaskar Ghosh Dastidar Date: Fri, 25 Nov 2022 05:11:35 +0530 Subject: [PATCH 023/592] [JAVA-5980] First Non Repeating Character (#13072) * [JAVA-5980] First Non Repeating Character * [JAVA-5980] renamed UnitTest class * [JAVA-5980] changed file location to core-java-string-algorithms-3 Co-authored-by: Bhaskar --- .../FirstNonRepeatingCharacter.java | 72 +++++++++++++++++++ .../FirstNonRepeatingCharacterUnitTest.java | 52 ++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 core-java-modules/core-java-string-algorithms-3/src/main/java/com/baeldung/firstnonrepeatingcharacter/FirstNonRepeatingCharacter.java create mode 100644 core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/firstnonrepeatingcharacter/FirstNonRepeatingCharacterUnitTest.java diff --git a/core-java-modules/core-java-string-algorithms-3/src/main/java/com/baeldung/firstnonrepeatingcharacter/FirstNonRepeatingCharacter.java b/core-java-modules/core-java-string-algorithms-3/src/main/java/com/baeldung/firstnonrepeatingcharacter/FirstNonRepeatingCharacter.java new file mode 100644 index 0000000000..e3ac0ea2f3 --- /dev/null +++ b/core-java-modules/core-java-string-algorithms-3/src/main/java/com/baeldung/firstnonrepeatingcharacter/FirstNonRepeatingCharacter.java @@ -0,0 +1,72 @@ +package com.baeldung.firstnonrepeatingcharacter; + +import java.util.HashMap; +import java.util.Map; + +public class FirstNonRepeatingCharacter { + public Character firstNonRepeatingCharBruteForce(String inputString) { + if (null == inputString || inputString.isEmpty()) { + return null; + } + for (Character c : inputString.toCharArray()) { + int indexOfC = inputString.indexOf(c); + if (indexOfC == inputString.lastIndexOf(c)) { + return c; + } + } + return null; + } + + public Character firstNonRepeatingCharBruteForceNaive(String inputString) { + if (null == inputString || inputString.isEmpty()) { + return null; + } + for (int outer = 0; outer < inputString.length(); outer++) { + boolean repeat = false; + for (int inner = 0; inner < inputString.length(); inner++) { + if (inner != outer && inputString.charAt(outer) == inputString.charAt(inner)) { + repeat = true; + break; + } + } + if (!repeat) { + return inputString.charAt(outer); + } + } + return null; + } + + public Character firstNonRepeatingCharWithMap(String inputString) { + if (null == inputString || inputString.isEmpty()) { + return null; + } + Map frequency = new HashMap<>(); + for (int outer = 0; outer < inputString.length(); outer++) { + char character = inputString.charAt(outer); + frequency.put(character, frequency.getOrDefault(character, 0) + 1); + } + for (Character c : inputString.toCharArray()) { + if (frequency.get(c) == 1) { + return c; + } + } + return null; + } + + public Character firstNonRepeatingCharWithArray(String inputString) { + if (null == inputString || inputString.isEmpty()) { + return null; + } + int[] frequency = new int[26]; + for (int outer = 0; outer < inputString.length(); outer++) { + char character = inputString.charAt(outer); + frequency[character - 'a']++; + } + for (Character c : inputString.toCharArray()) { + if (frequency[c - 'a'] == 1) { + return c; + } + } + return null; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/firstnonrepeatingcharacter/FirstNonRepeatingCharacterUnitTest.java b/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/firstnonrepeatingcharacter/FirstNonRepeatingCharacterUnitTest.java new file mode 100644 index 0000000000..6fca176fa0 --- /dev/null +++ b/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/firstnonrepeatingcharacter/FirstNonRepeatingCharacterUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.firstnonrepeatingcharacter; + +import org.junit.Assert; +import org.junit.Test; + +public class FirstNonRepeatingCharacterUnitTest { + + @Test + public void testNonRepeatingCharacterBruteForce() { + FirstNonRepeatingCharacter program = new FirstNonRepeatingCharacter(); + + Assert.assertEquals(program.firstNonRepeatingCharBruteForce("baeldung"), Character.valueOf('b')); + Assert.assertEquals(program.firstNonRepeatingCharBruteForce("lullaby"), Character.valueOf('u')); + Assert.assertEquals(program.firstNonRepeatingCharBruteForce("hello"), Character.valueOf('h')); + Assert.assertNull(program.firstNonRepeatingCharBruteForce("mahimahi")); + Assert.assertNull(program.firstNonRepeatingCharBruteForce("")); + Assert.assertNull(program.firstNonRepeatingCharBruteForce(null)); + } + + @Test + public void testNonRepeatingCharacterBruteForceNaive() { + FirstNonRepeatingCharacter program = new FirstNonRepeatingCharacter(); + Assert.assertEquals(program.firstNonRepeatingCharBruteForceNaive("baeldung"), Character.valueOf('b')); + Assert.assertEquals(program.firstNonRepeatingCharBruteForceNaive("lullaby"), Character.valueOf('u')); + Assert.assertEquals(program.firstNonRepeatingCharBruteForceNaive("hello"), Character.valueOf('h')); + Assert.assertNull(program.firstNonRepeatingCharBruteForceNaive("mahimahi")); + Assert.assertNull(program.firstNonRepeatingCharBruteForceNaive("")); + Assert.assertNull(program.firstNonRepeatingCharBruteForceNaive(null)); + } + + @Test + public void testNonRepeatingCharacterWithMap() { + FirstNonRepeatingCharacter program = new FirstNonRepeatingCharacter(); + Assert.assertEquals(program.firstNonRepeatingCharWithMap("baeldung"), Character.valueOf('b')); + Assert.assertEquals(program.firstNonRepeatingCharWithMap("lullaby"), Character.valueOf('u')); + Assert.assertEquals(program.firstNonRepeatingCharWithMap("hello"), Character.valueOf('h')); + Assert.assertNull(program.firstNonRepeatingCharWithMap("mahimahi")); + Assert.assertNull(program.firstNonRepeatingCharWithMap("")); + Assert.assertNull(program.firstNonRepeatingCharWithMap(null)); + } + + @Test + public void testNonRepeatingCharacterWithArray() { + FirstNonRepeatingCharacter program = new FirstNonRepeatingCharacter(); + Assert.assertEquals(program.firstNonRepeatingCharWithArray("baeldung"), Character.valueOf('b')); + Assert.assertEquals(program.firstNonRepeatingCharWithArray("lullaby"), Character.valueOf('u')); + Assert.assertEquals(program.firstNonRepeatingCharWithArray("hello"), Character.valueOf('h')); + Assert.assertNull(program.firstNonRepeatingCharWithArray("mahimahi")); + Assert.assertNull(program.firstNonRepeatingCharWithArray("")); + Assert.assertNull(program.firstNonRepeatingCharWithArray(null)); + } +} \ No newline at end of file From c9d99174bbb675dcfcdc4996c04c0b616e55c6c9 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 25 Nov 2022 14:29:53 +0800 Subject: [PATCH 024/592] Update README.md [skip ci] --- testing-modules/spring-mockito/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/spring-mockito/README.md b/testing-modules/spring-mockito/README.md index 3fda392c0f..73b102623f 100644 --- a/testing-modules/spring-mockito/README.md +++ b/testing-modules/spring-mockito/README.md @@ -4,3 +4,4 @@ This module contains articles about Spring with Mockito ### Relevant Articles: - [Injecting Mockito Mocks into Spring Beans](https://www.baeldung.com/injecting-mocks-in-spring) +- [SpringRunner vs MockitoJUnitRunner](https://www.baeldung.com/junit-springrunner-vs-mockitojunitrunner) From ca9e3d864b07c6c565eb266ae7b0d811490c8e70 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 25 Nov 2022 14:31:33 +0800 Subject: [PATCH 025/592] 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 474d0c8a22..61b2853af9 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 @@ -7,3 +7,4 @@ This module contains articles about types in Java - [Convert an Array of Primitives to an Array of Objects](https://www.baeldung.com/java-primitive-array-to-object-array) - [Check if an Enum Value Exists in Java](https://www.baeldung.com/java-search-enum-values) - [Generate a Random Value From an Enum](https://www.baeldung.com/java-enum-random-value) +- [Filling a List With All Enum Values in Java](https://www.baeldung.com/java-enum-values-to-list) From 540b32ef088801a3738e91812a3f42d92e814af5 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 25 Nov 2022 14:33:35 +0800 Subject: [PATCH 026/592] Update README.md [skip ci] --- spring-security-modules/spring-security-web-boot-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-security-modules/spring-security-web-boot-4/README.md b/spring-security-modules/spring-security-web-boot-4/README.md index caec447846..26b19e7b33 100644 --- a/spring-security-modules/spring-security-web-boot-4/README.md +++ b/spring-security-modules/spring-security-web-boot-4/README.md @@ -9,3 +9,4 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com - [Spring Security: Upgrading the Deprecated WebSecurityConfigurerAdapter](https://www.baeldung.com/spring-deprecated-websecurityconfigureradapter) - More articles: [[<-- prev]](/spring-security-modules/spring-security-web-boot-3) +- [Spring @EnableMethodSecurity Annotation](https://www.baeldung.com/spring-enablemethodsecurity) From 802a0d3de75768b26cc41284178a3861aecf9822 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 25 Nov 2022 14:36:06 +0800 Subject: [PATCH 027/592] Update README.md [skip ci] --- core-java-modules/core-java-concurrency-basic-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-concurrency-basic-2/README.md b/core-java-modules/core-java-concurrency-basic-2/README.md index c9f1c11a89..455ff52081 100644 --- a/core-java-modules/core-java-concurrency-basic-2/README.md +++ b/core-java-modules/core-java-concurrency-basic-2/README.md @@ -11,4 +11,5 @@ This module contains articles about basic Java concurrency - [How to Stop Execution After a Certain Time in Java](https://www.baeldung.com/java-stop-execution-after-certain-time) - [How to Get the Number of Threads in a Java Process](https://www.baeldung.com/java-get-number-of-threads) - [Set the Name of a Thread in Java](https://www.baeldung.com/java-set-thread-name) +- [Thread vs. Single Thread Executor Service](https://www.baeldung.com/java-single-thread-executor-service) - [[<-- Prev]](../core-java-concurrency-basic)[[Next -->]](../core-java-concurrency-basic-3) From 79813536d3e47a870ffeee0fcda8a6e6f86f12d3 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 25 Nov 2022 14:38:23 +0800 Subject: [PATCH 028/592] Update README.md [skip ci] --- patterns-modules/design-patterns-creational/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/patterns-modules/design-patterns-creational/README.md b/patterns-modules/design-patterns-creational/README.md index b599955846..fc1f982cbe 100644 --- a/patterns-modules/design-patterns-creational/README.md +++ b/patterns-modules/design-patterns-creational/README.md @@ -9,3 +9,4 @@ - [How to Replace Many if Statements in Java](https://www.baeldung.com/java-replace-if-statements) - [Prototype Pattern in Java](https://www.baeldung.com/java-pattern-prototype) - [Implementing Factory Pattern With Generics in Java](https://www.baeldung.com/java-factory-pattern-generics) +- [The Factory Design Pattern in Java](https://www.baeldung.com/java-factory-pattern) From 7377c93d7a8beff2d5e169535dcea4dee65fdc30 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 25 Nov 2022 14:42:29 +0800 Subject: [PATCH 029/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-list-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-list-4/README.md b/core-java-modules/core-java-collections-list-4/README.md index 6966b60756..369b943a5a 100644 --- a/core-java-modules/core-java-collections-list-4/README.md +++ b/core-java-modules/core-java-collections-list-4/README.md @@ -12,4 +12,5 @@ This module contains articles about the Java List collection - [How to Store HashMap Inside a List](https://www.baeldung.com/java-hashmap-inside-list) - [Convert a List to a Comma-Separated String](https://www.baeldung.com/java-list-comma-separated-string) - [Set vs List in Java](https://www.baeldung.com/java-set-vs-list) +- [Inserting an Object in an ArrayList at a Specific Position](https://www.baeldung.com/java-insert-object-arraylist-specific-position) - [[<-- Prev]](/core-java-modules/core-java-collections-list-3) From 065358af8f17071d1a2a455f4da16481c18589a1 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 25 Nov 2022 14:46:53 +0800 Subject: [PATCH 030/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-list-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-list-4/README.md b/core-java-modules/core-java-collections-list-4/README.md index 369b943a5a..9079c55cf8 100644 --- a/core-java-modules/core-java-collections-list-4/README.md +++ b/core-java-modules/core-java-collections-list-4/README.md @@ -13,4 +13,5 @@ This module contains articles about the Java List collection - [Convert a List to a Comma-Separated String](https://www.baeldung.com/java-list-comma-separated-string) - [Set vs List in Java](https://www.baeldung.com/java-set-vs-list) - [Inserting an Object in an ArrayList at a Specific Position](https://www.baeldung.com/java-insert-object-arraylist-specific-position) +- [Iterate Through Two ArrayLists Simultaneously](https://www.baeldung.com/iterate-through-two-arraylists-simultaneously) - [[<-- Prev]](/core-java-modules/core-java-collections-list-3) From 2f9327ea3b41ae7f63f9f9824d7e5d5d5b3df983 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 25 Nov 2022 15:06:22 +0800 Subject: [PATCH 031/592] Update README.md [skip ci] --- rxjava-modules/rxjava-core/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/rxjava-modules/rxjava-core/README.md b/rxjava-modules/rxjava-core/README.md index 148713c8e3..16625435e6 100644 --- a/rxjava-modules/rxjava-core/README.md +++ b/rxjava-modules/rxjava-core/README.md @@ -13,3 +13,4 @@ This module contains articles about RxJava. - [RxJava Maybe](https://www.baeldung.com/rxjava-maybe) - [Combining RxJava Completables](https://www.baeldung.com/rxjava-completable) - [RxJava Hooks](https://www.baeldung.com/rxjava-hooks) +- [Retry with Delay in RxJava](https://www.baeldung.com/rxjava-retry-with-delay) From 8978bd34d566bb7242c583c8487800719d888521 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 25 Nov 2022 15:15:31 +0800 Subject: [PATCH 032/592] Update README.md [skip ci] --- spring-boot-modules/spring-boot-mvc-5/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-mvc-5/README.md b/spring-boot-modules/spring-boot-mvc-5/README.md index 7cc3f8a1fe..95f48ad3f0 100644 --- a/spring-boot-modules/spring-boot-mvc-5/README.md +++ b/spring-boot-modules/spring-boot-mvc-5/README.md @@ -2,4 +2,5 @@ This module contains articles about Spring Web MVC in Spring Boot projects. -### Relevant Articles: \ No newline at end of file +### Relevant Articles: +- [Enable and Disable Endpoints at Runtime With Spring Boot](https://www.baeldung.com/spring-boot-enable-disable-endpoints-at-runtime) From 66dbd3105e3da16b3c202493fc56774b9e8028a4 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 25 Nov 2022 15:22:31 +0800 Subject: [PATCH 033/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-4/README.md b/core-java-modules/core-java-collections-4/README.md index cdb457e342..1f52dc6d91 100644 --- a/core-java-modules/core-java-collections-4/README.md +++ b/core-java-modules/core-java-collections-4/README.md @@ -11,3 +11,4 @@ - [Sorting Objects in a List by Date](https://www.baeldung.com/java-sort-list-by-date) - [Fixed Size Queue Implementations in Java](https://www.baeldung.com/java-fixed-size-queue) - [Difference Between Java Enumeration and Iterator](https://www.baeldung.com/java-enumeration-vs-iterator) +- [Sort Collection of Objects by Multiple Fields in Java](https://www.baeldung.com/java-sort-collection-multiple-fields) From a93eb796de434300bd64a03bc75cf9f9bcab7b7e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 25 Nov 2022 15:27:40 +0800 Subject: [PATCH 034/592] Update README.md [skip ci] --- pdf-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/pdf-2/README.md b/pdf-2/README.md index 531ebb04e5..12c0934543 100644 --- a/pdf-2/README.md +++ b/pdf-2/README.md @@ -1,2 +1,3 @@ ## Relevant articles - [Editing Existing PDF Files in Java](https://www.baeldung.com/java-edit-existing-pdf) +- [Get Information About a PDF in Java](https://www.baeldung.com/java-pdf-info) From d6a3dd20f3e0bc5642ea0992a360efe02d327af3 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 25 Nov 2022 15:41:11 +0800 Subject: [PATCH 035/592] Update README.md [skip ci] --- testing-modules/testng/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/testng/README.md b/testing-modules/testng/README.md index a7e0e29d62..739cae1197 100644 --- a/testing-modules/testng/README.md +++ b/testing-modules/testng/README.md @@ -3,3 +3,4 @@ - [Introduction to TestNG](http://www.baeldung.com/testng) - [Custom Reporting with TestNG](http://www.baeldung.com/testng-custom-reporting) - [A Quick JUnit vs TestNG Comparison](https://www.baeldung.com/junit-vs-testng) +- [How to Run TestNG Tests on Jenkins](https://www.baeldung.com/ops/testng-jenkins) From c8e8b507a411d7f3811fc31c835c895aa61a3887 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 25 Nov 2022 15:46:48 +0800 Subject: [PATCH 036/592] Update README.md [skip ci] --- spring-web-modules/spring-resttemplate-3/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-web-modules/spring-resttemplate-3/README.md b/spring-web-modules/spring-resttemplate-3/README.md index 6a00d226db..68f6b8c5e4 100644 --- a/spring-web-modules/spring-resttemplate-3/README.md +++ b/spring-web-modules/spring-resttemplate-3/README.md @@ -8,4 +8,5 @@ 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) \ No newline at end of file +- [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) From c8d99e699e377eb6c1fc314ccc0d3c3982e1f8a1 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 25 Nov 2022 15:49:29 +0800 Subject: [PATCH 037/592] Update README.md [skip ci] --- spring-web-modules/spring-thymeleaf-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-web-modules/spring-thymeleaf-5/README.md b/spring-web-modules/spring-thymeleaf-5/README.md index 177d28e506..c06b47d240 100644 --- a/spring-web-modules/spring-thymeleaf-5/README.md +++ b/spring-web-modules/spring-thymeleaf-5/README.md @@ -9,4 +9,5 @@ This module contains articles about Spring with Thymeleaf - [Spring MVC Data and Thymeleaf](https://www.baeldung.com/spring-mvc-thymeleaf-data) - [Upload Image With Spring Boot and Thymeleaf](https://www.baeldung.com/spring-boot-thymeleaf-image-upload) - [Getting a URL Attribute Value in Thymeleaf](https://www.baeldung.com/thymeleaf-url-attribute-value) +- [Expression Types in Thymeleaf](https://www.baeldung.com/java-thymeleaf-expression-types) - [[<-- prev]](/spring-thymeleaf) From b870712b288260d0dba45a0f0dcb8a859870dc3f Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 25 Nov 2022 15:51:37 +0800 Subject: [PATCH 038/592] Update README.md [skip ci] --- javax-validation-advanced/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/javax-validation-advanced/README.md b/javax-validation-advanced/README.md index 8f03107330..b3ed669c39 100644 --- a/javax-validation-advanced/README.md +++ b/javax-validation-advanced/README.md @@ -3,3 +3,4 @@ This module contains articles about Bean Validation. ### Relevant Articles: +- [Object Validation After Deserialization](https://www.baeldung.com/java-object-validation-deserialization) From f43520bdd39df6da6292e94fa414f8b3e9543443 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 25 Nov 2022 15:59:07 +0800 Subject: [PATCH 039/592] Update README.md [skip ci] --- core-java-modules/core-java-perf/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-perf/README.md b/core-java-modules/core-java-perf/README.md index e09f8bb6fc..c018ec9927 100644 --- a/core-java-modules/core-java-perf/README.md +++ b/core-java-modules/core-java-perf/README.md @@ -12,3 +12,4 @@ This module contains articles about performance of Java applications - [Branch Prediction in Java](https://www.baeldung.com/java-branch-prediction) - [Capturing a Java Thread Dump](https://www.baeldung.com/java-thread-dump) - [JMX Ports](https://www.baeldung.com/jmx-ports) +- [Calling JMX MBean Method From a Shell Script](https://www.baeldung.com/jmx-mbean-shell-access) From 8ee7dcd350a7018def006ae1ec139a356bc44393 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 25 Nov 2022 19:50:00 +0530 Subject: [PATCH 040/592] JAVA-14897 Update spring-security-auth0 module under spring-security modules to remove usage of deprecated WebSecurityConfigurerAdapter (#13070) * JAVA-14897 Update spring-security-auth0 module under spring-security-modules to remove usage of deprecated WebSecurityConfigurerAdapter * JAVA-14897 Code update as per review comment --- .../java/com/baeldung/auth0/AuthConfig.java | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/AuthConfig.java b/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/AuthConfig.java index 69cf8b3071..e010a86a0c 100644 --- a/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/AuthConfig.java +++ b/spring-security-modules/spring-security-auth0/src/main/java/com/baeldung/auth0/AuthConfig.java @@ -7,10 +7,9 @@ import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -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.web.SecurityFilterChain; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; import com.auth0.AuthenticationController; @@ -20,7 +19,7 @@ import com.auth0.jwk.JwkProviderBuilder; @Configuration @EnableWebSecurity -public class AuthConfig extends WebSecurityConfigurerAdapter { +public class AuthConfig { @Value(value = "${com.auth0.domain}") private String domain; @@ -53,18 +52,23 @@ public class AuthConfig extends WebSecurityConfigurerAdapter { .build(); } - @Override - protected void configure(HttpSecurity http) throws Exception { - http.csrf().disable(); - http - .authorizeRequests() - .antMatchers("/callback", "/login", "/").permitAll() - .anyRequest().authenticated() - .and() - .formLogin() - .loginPage("/login") - .and() - .logout().logoutSuccessHandler(logoutSuccessHandler()).permitAll(); + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.csrf() + .disable() + .authorizeRequests() + .antMatchers("/callback", "/login", "/") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .loginPage("/login") + .and() + .logout() + .logoutSuccessHandler(logoutSuccessHandler()) + .permitAll(); + return http.build(); } public String getDomain() { From b7f097bb922f20264ccdf306589e33720e40a947 Mon Sep 17 00:00:00 2001 From: Arya <108480101+drafii@users.noreply.github.com> Date: Fri, 25 Nov 2022 21:03:26 +0330 Subject: [PATCH 041/592] Serialize a Singleton in Java (#13074) * Added a new module. Also added Serializable Singleton article source code. * Modified the unit tests. And deleted the main classes. --- .../design-patterns-creational-2/README.md | 1 + .../design-patterns-creational-2/pom.xml | 17 +++++ .../serializable_singleton/EnumSingleton.java | 20 ++++++ .../serializable_singleton/Singleton.java | 28 ++++++++ .../EnumSingletonUnitTest.java | 69 +++++++++++++++++++ .../SingletonUnitTest.java | 68 ++++++++++++++++++ 6 files changed, 203 insertions(+) create mode 100644 patterns-modules/design-patterns-creational-2/README.md create mode 100644 patterns-modules/design-patterns-creational-2/pom.xml create mode 100644 patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/serializable_singleton/EnumSingleton.java create mode 100644 patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/serializable_singleton/Singleton.java create mode 100644 patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/serializable_singleton/EnumSingletonUnitTest.java create mode 100644 patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/serializable_singleton/SingletonUnitTest.java diff --git a/patterns-modules/design-patterns-creational-2/README.md b/patterns-modules/design-patterns-creational-2/README.md new file mode 100644 index 0000000000..7d843af9ea --- /dev/null +++ b/patterns-modules/design-patterns-creational-2/README.md @@ -0,0 +1 @@ +### Relevant Articles: diff --git a/patterns-modules/design-patterns-creational-2/pom.xml b/patterns-modules/design-patterns-creational-2/pom.xml new file mode 100644 index 0000000000..2e67b346f2 --- /dev/null +++ b/patterns-modules/design-patterns-creational-2/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + design-patterns-creational-2 + 1.0 + design-patterns-creational-2 + jar + + + com.baeldung + patterns-modules + 1.0.0-SNAPSHOT + + + \ No newline at end of file diff --git a/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/serializable_singleton/EnumSingleton.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/serializable_singleton/EnumSingleton.java new file mode 100644 index 0000000000..4259211934 --- /dev/null +++ b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/serializable_singleton/EnumSingleton.java @@ -0,0 +1,20 @@ +package com.baeldung.serializable_singleton; + +public enum EnumSingleton { + + INSTANCE("State Zero"); + + private String state; + + private EnumSingleton(String state) { + this.state = state; + } + + public static EnumSingleton getInstance() { + return INSTANCE; + } + + public String getState() { return this.state; } + + public void setState(String state) { this.state = state; } +} \ No newline at end of file diff --git a/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/serializable_singleton/Singleton.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/serializable_singleton/Singleton.java new file mode 100644 index 0000000000..6605d5dcf7 --- /dev/null +++ b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/serializable_singleton/Singleton.java @@ -0,0 +1,28 @@ +package com.baeldung.serializable_singleton; + +import java.io.Serializable; + +public class Singleton implements Serializable { + + private static Singleton INSTANCE; + private String state = "State Zero"; + + private Singleton() { + } + + public static Singleton getInstance() { + if(INSTANCE == null) { + INSTANCE = new Singleton(); + } + + return INSTANCE; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } +} \ No newline at end of file diff --git a/patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/serializable_singleton/EnumSingletonUnitTest.java b/patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/serializable_singleton/EnumSingletonUnitTest.java new file mode 100644 index 0000000000..e0a098056a --- /dev/null +++ b/patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/serializable_singleton/EnumSingletonUnitTest.java @@ -0,0 +1,69 @@ +package com.baeldung.serializable_singleton; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +// Unit test for the EnumSingleton class. +public class EnumSingletonUnitTest { + + // Checks that when an EnumSingleton instance is serialized + // and then deserialized, its state is preserved. + @Test + public void givenEnumSingleton_whenSerializedAndDeserialized_thenStatePreserved() { + EnumSingleton es1 = EnumSingleton.getInstance(); + + es1.setState("State One"); + + try ( + FileOutputStream fos = new FileOutputStream("enum_singleton_test.txt"); + ObjectOutputStream oos = new ObjectOutputStream(fos); + FileInputStream fis = new FileInputStream("enum_singleton_test.txt"); + ObjectInputStream ois = new ObjectInputStream(fis)) { + + // Serializing. + oos.writeObject(es1); + + // Deserializing. + EnumSingleton es2 = (EnumSingleton) ois.readObject(); + + // Checking if the state is preserved. + assertEquals(es1.getState(), es2.getState()); + + } catch (Exception e) { + System.out.println(e); + } + } + + // Checking that when an EnumSingleton instance is serialized + // and then deserialized, then there is still one instance + // of the EnumSingleton class in memory. + @Test + public void givenEnumSingleton_whenSerializedAndDeserialized_thenOneInstance() { + EnumSingleton es1 = EnumSingleton.getInstance(); + + try ( + FileOutputStream fos = new FileOutputStream("enum_singleton_test.txt"); + ObjectOutputStream oos = new ObjectOutputStream(fos); + FileInputStream fis = new FileInputStream("enum_singleton_test.txt"); + ObjectInputStream ois = new ObjectInputStream(fis)) { + + // Serializing. + oos.writeObject(es1); + + // Deserializing. + EnumSingleton es2 = (EnumSingleton) ois.readObject(); + + // Checking if es1 and es2 are pointing to + // the same instance in memory. + assertEquals(es1, es2); + + } catch (Exception e) { + System.out.println(e); + } + } +} diff --git a/patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/serializable_singleton/SingletonUnitTest.java b/patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/serializable_singleton/SingletonUnitTest.java new file mode 100644 index 0000000000..cc26eb6995 --- /dev/null +++ b/patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/serializable_singleton/SingletonUnitTest.java @@ -0,0 +1,68 @@ +package com.baeldung.serializable_singleton; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +// Unit test for the Singleton class. +public class SingletonUnitTest { + + // Checks that when a Singleton instance is serialized + // and then deserialized, its state is preserved. + @Test + public void givenSingleton_whenSerializedAndDeserialized_thenStatePreserved() { + Singleton s1 = Singleton.getInstance(); + + s1.setState("State One"); + + try ( + FileOutputStream fos = new FileOutputStream("singleton_test.txt"); + ObjectOutputStream oos = new ObjectOutputStream(fos); + FileInputStream fis = new FileInputStream("singleton_test.txt"); + ObjectInputStream ois = new ObjectInputStream(fis)) { + + // Serializing. + oos.writeObject(s1); + + // Deserializing. + Singleton s2 = (Singleton) ois.readObject(); + + // Checking if the state is preserved. + assertEquals(s1.getState(), s2.getState()); + + } catch (Exception e) { + System.out.println(e); + } + } + + // Checking that when a Singleton instance is serialized + // and then deserialized, then there are two instances of + // the Singleton class. + @Test + public void givenSingleton_whenSerializedAndDeserialized_thenTwoInstances() { + Singleton s1 = Singleton.getInstance(); + + try ( + FileOutputStream fos = new FileOutputStream("singleton_test.txt"); + ObjectOutputStream oos = new ObjectOutputStream(fos); + FileInputStream fis = new FileInputStream("singleton_test.txt"); + ObjectInputStream ois = new ObjectInputStream(fis)) { + + // Serializing. + oos.writeObject(s1); + + // Deserializing. + Singleton s2 = (Singleton) ois.readObject(); + + // Checking if s1 and s2 are not the same instance. + assertNotEquals(s1, s2); + + } catch (Exception e) { + System.out.println(e); + } + } +} From ad9ddfc6e3da2fa0d0635a96993e7bca346a650a Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sat, 26 Nov 2022 11:54:53 +0530 Subject: [PATCH 042/592] JAVA-15787 Created new messaging-modules and saas-modules - Moved jgroups, rabbitmq, spring-amqp, spring-apache-camel, spring-jms to messaging-modules - Moved twilio, twitter4j, strip to saas-modules - Renamed existing saas to jira-rest-integration --- .../jgroups}/README.md | 0 .../jgroups}/pom.xml | 7 ++-- .../baeldung/jgroups/JGroupsMessenger.java | 0 .../jgroups}/src/main/resources/logback.xml | 0 .../jgroups}/src/main/resources/udp.xml | 0 messaging-modules/pom.xml | 24 +++++++++++++ .../rabbitmq}/README.md | 0 .../rabbitmq}/docker-compose.yaml | 0 .../rabbitmq}/pom.xml | 3 +- .../ConnectionPerChannelPublisher.java | 0 .../benchmark/SharedConnectionPublisher.java | 0 .../benchmark/SingleConnectionPublisher.java | 0 .../SingleConnectionPublisherNio.java | 0 .../java/com/baeldung/benchmark/Worker.java | 0 .../java/com/baeldung/consumer/Receiver.java | 0 .../java/com/baeldung/producer/Publisher.java | 0 .../pubsubmq/client/ClientApplication.java | 0 .../baeldung/pubsubmq/client/Consumer.java | 0 .../baeldung/pubsubmq/server/Publisher.java | 0 .../pubsubmq/server/ServerApplication.java | 0 .../main/java/com/baeldung/setup/Setup.java | 0 .../rabbitmq}/src/main/resources/logback.xml | 0 .../rabbitmq}/src/rabbitmq/20-mem.conf | 0 ...ConnectionPerChannelPublisherLiveTest.java | 0 .../SingleConnectionPublisherLiveTest.java | 0 .../spring-amqp}/README.md | 0 .../spring-amqp}/pom.xml | 3 +- .../springamqp/broadcast/BroadcastConfig.java | 0 .../broadcast/BroadcastMessageApp.java | 0 .../errorhandling/ErrorHandlingApp.java | 0 .../DLXCustomAmqpConfiguration.java | 0 .../DLXParkingLotAmqpConfiguration.java | 0 ...talExceptionStrategyAmqpConfiguration.java | 0 ...ListenerErrorHandlerAmqpConfiguration.java | 0 .../RoutingKeyDLQAmqpConfiguration.java | 0 .../SimpleDLQAmqpConfiguration.java | 0 .../consumer/DLQCustomAmqpContainer.java | 0 .../consumer/MessagesConsumer.java | 0 .../consumer/ParkingLotDLQAmqpContainer.java | 0 .../consumer/RoutingDLQAmqpContainer.java | 0 .../consumer/SimpleDLQAmqpContainer.java | 0 .../errorhandler/BusinessException.java | 0 .../errorhandler/CustomErrorHandler.java | 0 .../CustomFatalExceptionStrategy.java | 0 .../producer/MessageProducer.java | 0 .../ExponentialBackoffApp.java | 0 ...servableRejectAndDontRequeueRecoverer.java | 0 .../RabbitConfiguration.java | 0 .../exponentialbackoff/RetryQueues.java | 0 .../RetryQueuesInterceptor.java | 0 .../simple/HelloWorldMessageApp.java | 0 .../src/main/resources/application.properties | 0 .../ExponentialBackoffLiveTest.java | 0 .../src/test/resources/logback-test.xml | 0 .../spring-apache-camel}/.gitignore | 0 .../spring-apache-camel}/README.md | 0 .../spring-apache-camel}/pom.xml | 11 +++--- .../camel/file/ContentBasedFileRouter.java | 0 .../file/DeadLetterChannelFileRouter.java | 0 .../baeldung/camel/file/FileProcessor.java | 0 .../com/baeldung/camel/file/FileRouter.java | 0 .../file/MessageTranslatorFileRouter.java | 0 .../camel/file/MulticastFileRouter.java | 0 .../camel/file/SplitterFileRouter.java | 0 .../cfg/ContentBasedFileRouterConfig.java | 0 .../com/baeldung/camel/jackson/Fruit.java | 0 .../com/baeldung/camel/jackson/FruitList.java | 0 .../java/com/baeldung/camel/main/App.java | 0 .../camel/processor/FileProcessor.java | 0 ...mel-context-ContentBasedFileRouterTest.xml | 0 ...el-context-DeadLetterChannelFileRouter.xml | 0 ...ontext-MessageTranslatorFileRouterTest.xml | 0 .../camel-context-MulticastFileRouterTest.xml | 0 .../camel-context-SplitterFileRouter.xml | 0 .../src/main/resources/camel-context-test.xml | 0 .../src/main/resources/camel-context.xml | 0 .../src/main/resources/logback.xml | 0 .../src/test/data/sampleInputFile/file.txt | 0 ...ContentBasedFileRouterIntegrationTest.java | 0 ...etterChannelFileRouterIntegrationTest.java | 0 .../FileProcessorIntegrationTest.java | 0 ...geTranslatorFileRouterIntegrationTest.java | 0 .../MulticastFileRouterIntegrationTest.java | 0 .../SplitterFileRouterIntegrationTest.java | 0 .../apache/camel/main/AppIntegrationTest.java | 0 .../java/com/baeldung/SpringContextTest.java | 0 .../FruitArrayJacksonUnmarshalUnitTest.java | 0 .../FruitListJacksonUnmarshalUnitTest.java | 0 .../src/test/resources/json/fruit-array.json | 0 .../src/test/resources/json/fruit-list.json | 0 .../spring-jms}/README.md | 0 .../spring-jms}/pom.xml | 7 ++-- .../com/baeldung/spring/jms/Employee.java | 0 .../spring/jms/SampleJmsErrorHandler.java | 0 .../spring/jms/SampleJmsMessageSender.java | 0 .../baeldung/spring/jms/SampleListener.java | 0 .../spring/jms/SampleMessageConverter.java | 0 .../spring/jms/testing/JmsApplication.java | 0 .../spring/jms/testing/JmsConfig.java | 0 .../spring/jms/testing/MessageListener.java | 0 .../spring/jms/testing/MessageSender.java | 0 .../src/main/resources/EmbeddedActiveMQ.xml | 0 .../src/main/resources/applicationContext.xml | 0 .../src/main/resources/logback.xml | 0 .../src/main/webapp/META-INF/MANIFEST.MF | 0 .../java/com/baeldung/SpringContextTest.java | 0 ...faultTextMessageSenderIntegrationTest.java | 0 .../EmbeddedActiveMqIntegrationTest.java | 0 .../TestContainersActiveMqLiveTest.java | 0 pom.xml | 24 +++---------- .../jira-rest-integration}/.gitignore | 0 .../jira-rest-integration}/README.md | 4 +-- .../jira-rest-integration}/pom.xml | 12 +++---- .../com/baeldung/saas/jira/MyJiraClient.java | 0 .../src/main/resources/logback.xml | 0 saas-modules/pom.xml | 36 +++++++++++++++++++ {stripe => saas-modules/stripe}/.gitignore | 0 {stripe => saas-modules/stripe}/README.md | 0 {stripe => saas-modules/stripe}/pom.xml | 8 ++--- .../com/baeldung/stripe/ChargeController.java | 0 .../com/baeldung/stripe/ChargeRequest.java | 0 .../baeldung/stripe/CheckoutController.java | 0 .../baeldung/stripe/StripeApplication.java | 0 .../com/baeldung/stripe/StripeService.java | 0 .../src/main/resources/application.properties | 0 .../stripe}/src/main/resources/logback.xml | 0 .../src/main/resources/static/index.html | 0 .../main/resources/templates/checkout.html | 0 .../src/main/resources/templates/result.html | 0 {twilio => saas-modules/twilio}/README.md | 0 {twilio => saas-modules/twilio}/pom.xml | 5 ++- .../baeldung/twilio/sms/TwilioSmsExample.java | 0 .../twilio/sms/TwilioSmsMediaExample.java | 0 .../sms/TwilioSmsStatusAsyncExample.java | 0 .../twilio/sms/TwilioSmsStatusExample.java | 0 .../twilio}/src/main/resources/logback.xml | 0 .../twitter4j}/README.md | 0 {twitter4j => saas-modules/twitter4j}/pom.xml | 4 +-- .../main/java/com/baeldung/Application.java | 0 .../twitter4j}/src/main/resources/logback.xml | 0 .../src/main/resources/twitter4j.properties | 0 .../com/baeldung/ApplicationManualTest.java | 0 142 files changed, 91 insertions(+), 57 deletions(-) rename {jgroups => messaging-modules/jgroups}/README.md (100%) rename {jgroups => messaging-modules/jgroups}/pom.xml (88%) rename {jgroups => messaging-modules/jgroups}/src/main/java/com/baeldung/jgroups/JGroupsMessenger.java (100%) rename {jgroups => messaging-modules/jgroups}/src/main/resources/logback.xml (100%) rename {jgroups => messaging-modules/jgroups}/src/main/resources/udp.xml (100%) create mode 100644 messaging-modules/pom.xml rename {rabbitmq => messaging-modules/rabbitmq}/README.md (100%) rename {rabbitmq => messaging-modules/rabbitmq}/docker-compose.yaml (100%) rename {rabbitmq => messaging-modules/rabbitmq}/pom.xml (93%) rename {rabbitmq => messaging-modules/rabbitmq}/src/main/java/com/baeldung/benchmark/ConnectionPerChannelPublisher.java (100%) rename {rabbitmq => messaging-modules/rabbitmq}/src/main/java/com/baeldung/benchmark/SharedConnectionPublisher.java (100%) rename {rabbitmq => messaging-modules/rabbitmq}/src/main/java/com/baeldung/benchmark/SingleConnectionPublisher.java (100%) rename {rabbitmq => messaging-modules/rabbitmq}/src/main/java/com/baeldung/benchmark/SingleConnectionPublisherNio.java (100%) rename {rabbitmq => messaging-modules/rabbitmq}/src/main/java/com/baeldung/benchmark/Worker.java (100%) rename {rabbitmq => messaging-modules/rabbitmq}/src/main/java/com/baeldung/consumer/Receiver.java (100%) rename {rabbitmq => messaging-modules/rabbitmq}/src/main/java/com/baeldung/producer/Publisher.java (100%) rename {rabbitmq => messaging-modules/rabbitmq}/src/main/java/com/baeldung/pubsubmq/client/ClientApplication.java (100%) rename {rabbitmq => messaging-modules/rabbitmq}/src/main/java/com/baeldung/pubsubmq/client/Consumer.java (100%) rename {rabbitmq => messaging-modules/rabbitmq}/src/main/java/com/baeldung/pubsubmq/server/Publisher.java (100%) rename {rabbitmq => messaging-modules/rabbitmq}/src/main/java/com/baeldung/pubsubmq/server/ServerApplication.java (100%) rename {rabbitmq => messaging-modules/rabbitmq}/src/main/java/com/baeldung/setup/Setup.java (100%) rename {rabbitmq => messaging-modules/rabbitmq}/src/main/resources/logback.xml (100%) rename {rabbitmq => messaging-modules/rabbitmq}/src/rabbitmq/20-mem.conf (100%) rename {rabbitmq => messaging-modules/rabbitmq}/src/test/java/com/baeldung/benchmark/ConnectionPerChannelPublisherLiveTest.java (100%) rename {rabbitmq => messaging-modules/rabbitmq}/src/test/java/com/baeldung/benchmark/SingleConnectionPublisherLiveTest.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/README.md (100%) rename {spring-amqp => messaging-modules/spring-amqp}/pom.xml (88%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/broadcast/BroadcastConfig.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/broadcast/BroadcastMessageApp.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/errorhandling/ErrorHandlingApp.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/errorhandling/configuration/DLXCustomAmqpConfiguration.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/errorhandling/configuration/DLXParkingLotAmqpConfiguration.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/errorhandling/configuration/FatalExceptionStrategyAmqpConfiguration.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/errorhandling/configuration/ListenerErrorHandlerAmqpConfiguration.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/errorhandling/configuration/RoutingKeyDLQAmqpConfiguration.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/errorhandling/configuration/SimpleDLQAmqpConfiguration.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/errorhandling/consumer/DLQCustomAmqpContainer.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/errorhandling/consumer/MessagesConsumer.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/errorhandling/consumer/ParkingLotDLQAmqpContainer.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/errorhandling/consumer/RoutingDLQAmqpContainer.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/errorhandling/consumer/SimpleDLQAmqpContainer.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/errorhandling/errorhandler/BusinessException.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/errorhandling/errorhandler/CustomErrorHandler.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/errorhandling/errorhandler/CustomFatalExceptionStrategy.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/errorhandling/producer/MessageProducer.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/exponentialbackoff/ExponentialBackoffApp.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/exponentialbackoff/ObservableRejectAndDontRequeueRecoverer.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/exponentialbackoff/RabbitConfiguration.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/exponentialbackoff/RetryQueues.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/exponentialbackoff/RetryQueuesInterceptor.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/java/com/baeldung/springamqp/simple/HelloWorldMessageApp.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/main/resources/application.properties (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/test/java/com/baeldung/springamqp/exponentialbackoff/ExponentialBackoffLiveTest.java (100%) rename {spring-amqp => messaging-modules/spring-amqp}/src/test/resources/logback-test.xml (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/.gitignore (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/README.md (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/pom.xml (90%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/java/com/baeldung/camel/file/ContentBasedFileRouter.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/java/com/baeldung/camel/file/DeadLetterChannelFileRouter.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/java/com/baeldung/camel/file/FileProcessor.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/java/com/baeldung/camel/file/FileRouter.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/java/com/baeldung/camel/file/MessageTranslatorFileRouter.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/java/com/baeldung/camel/file/MulticastFileRouter.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/java/com/baeldung/camel/file/SplitterFileRouter.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/java/com/baeldung/camel/file/cfg/ContentBasedFileRouterConfig.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/java/com/baeldung/camel/jackson/Fruit.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/java/com/baeldung/camel/jackson/FruitList.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/java/com/baeldung/camel/main/App.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/java/com/baeldung/camel/processor/FileProcessor.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/resources/camel-context-ContentBasedFileRouterTest.xml (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/resources/camel-context-DeadLetterChannelFileRouter.xml (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/resources/camel-context-MessageTranslatorFileRouterTest.xml (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/resources/camel-context-MulticastFileRouterTest.xml (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/resources/camel-context-SplitterFileRouter.xml (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/resources/camel-context-test.xml (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/main/resources/camel-context.xml (100%) rename {saas => messaging-modules/spring-apache-camel}/src/main/resources/logback.xml (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/test/data/sampleInputFile/file.txt (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/test/java/com/apache/camel/file/processor/ContentBasedFileRouterIntegrationTest.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/test/java/com/apache/camel/file/processor/DeadLetterChannelFileRouterIntegrationTest.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/test/java/com/apache/camel/file/processor/FileProcessorIntegrationTest.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/test/java/com/apache/camel/file/processor/MessageTranslatorFileRouterIntegrationTest.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/test/java/com/apache/camel/file/processor/MulticastFileRouterIntegrationTest.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/test/java/com/apache/camel/file/processor/SplitterFileRouterIntegrationTest.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/test/java/com/apache/camel/main/AppIntegrationTest.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/test/java/com/baeldung/SpringContextTest.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/test/java/com/baeldung/camel/jackson/FruitArrayJacksonUnmarshalUnitTest.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/test/java/com/baeldung/camel/jackson/FruitListJacksonUnmarshalUnitTest.java (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/test/resources/json/fruit-array.json (100%) rename {spring-apache-camel => messaging-modules/spring-apache-camel}/src/test/resources/json/fruit-list.json (100%) rename {spring-jms => messaging-modules/spring-jms}/README.md (100%) rename {spring-jms => messaging-modules/spring-jms}/pom.xml (93%) rename {spring-jms => messaging-modules/spring-jms}/src/main/java/com/baeldung/spring/jms/Employee.java (100%) rename {spring-jms => messaging-modules/spring-jms}/src/main/java/com/baeldung/spring/jms/SampleJmsErrorHandler.java (100%) rename {spring-jms => messaging-modules/spring-jms}/src/main/java/com/baeldung/spring/jms/SampleJmsMessageSender.java (100%) rename {spring-jms => messaging-modules/spring-jms}/src/main/java/com/baeldung/spring/jms/SampleListener.java (100%) rename {spring-jms => messaging-modules/spring-jms}/src/main/java/com/baeldung/spring/jms/SampleMessageConverter.java (100%) rename {spring-jms => messaging-modules/spring-jms}/src/main/java/com/baeldung/spring/jms/testing/JmsApplication.java (100%) rename {spring-jms => messaging-modules/spring-jms}/src/main/java/com/baeldung/spring/jms/testing/JmsConfig.java (100%) rename {spring-jms => messaging-modules/spring-jms}/src/main/java/com/baeldung/spring/jms/testing/MessageListener.java (100%) rename {spring-jms => messaging-modules/spring-jms}/src/main/java/com/baeldung/spring/jms/testing/MessageSender.java (100%) rename {spring-jms => messaging-modules/spring-jms}/src/main/resources/EmbeddedActiveMQ.xml (100%) rename {spring-jms => messaging-modules/spring-jms}/src/main/resources/applicationContext.xml (100%) rename {spring-apache-camel => messaging-modules/spring-jms}/src/main/resources/logback.xml (100%) rename {spring-jms => messaging-modules/spring-jms}/src/main/webapp/META-INF/MANIFEST.MF (100%) rename {spring-jms => messaging-modules/spring-jms}/src/test/java/com/baeldung/SpringContextTest.java (100%) rename {spring-jms => messaging-modules/spring-jms}/src/test/java/com/baeldung/spring/jms/DefaultTextMessageSenderIntegrationTest.java (100%) rename {spring-jms => messaging-modules/spring-jms}/src/test/java/com/baeldung/spring/jms/testing/EmbeddedActiveMqIntegrationTest.java (100%) rename {spring-jms => messaging-modules/spring-jms}/src/test/java/com/baeldung/spring/jms/testing/TestContainersActiveMqLiveTest.java (100%) rename {saas => saas-modules/jira-rest-integration}/.gitignore (100%) rename {saas => saas-modules/jira-rest-integration}/README.md (53%) rename {saas => saas-modules/jira-rest-integration}/pom.xml (90%) rename {saas => saas-modules/jira-rest-integration}/src/main/java/com/baeldung/saas/jira/MyJiraClient.java (100%) rename {spring-jms => saas-modules/jira-rest-integration}/src/main/resources/logback.xml (100%) create mode 100644 saas-modules/pom.xml rename {stripe => saas-modules/stripe}/.gitignore (100%) rename {stripe => saas-modules/stripe}/README.md (100%) rename {stripe => saas-modules/stripe}/pom.xml (87%) rename {stripe => saas-modules/stripe}/src/main/java/com/baeldung/stripe/ChargeController.java (100%) rename {stripe => saas-modules/stripe}/src/main/java/com/baeldung/stripe/ChargeRequest.java (100%) rename {stripe => saas-modules/stripe}/src/main/java/com/baeldung/stripe/CheckoutController.java (100%) rename {stripe => saas-modules/stripe}/src/main/java/com/baeldung/stripe/StripeApplication.java (100%) rename {stripe => saas-modules/stripe}/src/main/java/com/baeldung/stripe/StripeService.java (100%) rename {stripe => saas-modules/stripe}/src/main/resources/application.properties (100%) rename {stripe => saas-modules/stripe}/src/main/resources/logback.xml (100%) rename {stripe => saas-modules/stripe}/src/main/resources/static/index.html (100%) rename {stripe => saas-modules/stripe}/src/main/resources/templates/checkout.html (100%) rename {stripe => saas-modules/stripe}/src/main/resources/templates/result.html (100%) rename {twilio => saas-modules/twilio}/README.md (100%) rename {twilio => saas-modules/twilio}/pom.xml (89%) rename {twilio => saas-modules/twilio}/src/main/java/com/baeldung/twilio/sms/TwilioSmsExample.java (100%) rename {twilio => saas-modules/twilio}/src/main/java/com/baeldung/twilio/sms/TwilioSmsMediaExample.java (100%) rename {twilio => saas-modules/twilio}/src/main/java/com/baeldung/twilio/sms/TwilioSmsStatusAsyncExample.java (100%) rename {twilio => saas-modules/twilio}/src/main/java/com/baeldung/twilio/sms/TwilioSmsStatusExample.java (100%) rename {twilio => saas-modules/twilio}/src/main/resources/logback.xml (100%) rename {twitter4j => saas-modules/twitter4j}/README.md (100%) rename {twitter4j => saas-modules/twitter4j}/pom.xml (93%) rename {twitter4j => saas-modules/twitter4j}/src/main/java/com/baeldung/Application.java (100%) rename {twitter4j => saas-modules/twitter4j}/src/main/resources/logback.xml (100%) rename {twitter4j => saas-modules/twitter4j}/src/main/resources/twitter4j.properties (100%) rename {twitter4j => saas-modules/twitter4j}/src/test/java/com/baeldung/ApplicationManualTest.java (100%) diff --git a/jgroups/README.md b/messaging-modules/jgroups/README.md similarity index 100% rename from jgroups/README.md rename to messaging-modules/jgroups/README.md diff --git a/jgroups/pom.xml b/messaging-modules/jgroups/pom.xml similarity index 88% rename from jgroups/pom.xml rename to messaging-modules/jgroups/pom.xml index 370d8a349a..ec094ac53a 100644 --- a/jgroups/pom.xml +++ b/messaging-modules/jgroups/pom.xml @@ -4,15 +4,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 jgroups - 0.1-SNAPSHOT jgroups jar Reliable Messaging with JGroups Tutorial com.baeldung - parent-modules - 1.0.0-SNAPSHOT + messaging-modules + 0.0.1-SNAPSHOT @@ -32,4 +31,4 @@ 4.0.10.Final - \ No newline at end of file + diff --git a/jgroups/src/main/java/com/baeldung/jgroups/JGroupsMessenger.java b/messaging-modules/jgroups/src/main/java/com/baeldung/jgroups/JGroupsMessenger.java similarity index 100% rename from jgroups/src/main/java/com/baeldung/jgroups/JGroupsMessenger.java rename to messaging-modules/jgroups/src/main/java/com/baeldung/jgroups/JGroupsMessenger.java diff --git a/jgroups/src/main/resources/logback.xml b/messaging-modules/jgroups/src/main/resources/logback.xml similarity index 100% rename from jgroups/src/main/resources/logback.xml rename to messaging-modules/jgroups/src/main/resources/logback.xml diff --git a/jgroups/src/main/resources/udp.xml b/messaging-modules/jgroups/src/main/resources/udp.xml similarity index 100% rename from jgroups/src/main/resources/udp.xml rename to messaging-modules/jgroups/src/main/resources/udp.xml diff --git a/messaging-modules/pom.xml b/messaging-modules/pom.xml new file mode 100644 index 0000000000..0fa5d81c40 --- /dev/null +++ b/messaging-modules/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + messaging-modules + messaging-modules + pom + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + jgroups + rabbitmq + spring-amqp + spring-apache-camel + spring-jms + + diff --git a/rabbitmq/README.md b/messaging-modules/rabbitmq/README.md similarity index 100% rename from rabbitmq/README.md rename to messaging-modules/rabbitmq/README.md diff --git a/rabbitmq/docker-compose.yaml b/messaging-modules/rabbitmq/docker-compose.yaml similarity index 100% rename from rabbitmq/docker-compose.yaml rename to messaging-modules/rabbitmq/docker-compose.yaml diff --git a/rabbitmq/pom.xml b/messaging-modules/rabbitmq/pom.xml similarity index 93% rename from rabbitmq/pom.xml rename to messaging-modules/rabbitmq/pom.xml index c7a299b74f..69476ba31b 100644 --- a/rabbitmq/pom.xml +++ b/messaging-modules/rabbitmq/pom.xml @@ -9,9 +9,8 @@ com.baeldung - parent-boot-2 + messaging-modules 0.0.1-SNAPSHOT - ../parent-boot-2 diff --git a/rabbitmq/src/main/java/com/baeldung/benchmark/ConnectionPerChannelPublisher.java b/messaging-modules/rabbitmq/src/main/java/com/baeldung/benchmark/ConnectionPerChannelPublisher.java similarity index 100% rename from rabbitmq/src/main/java/com/baeldung/benchmark/ConnectionPerChannelPublisher.java rename to messaging-modules/rabbitmq/src/main/java/com/baeldung/benchmark/ConnectionPerChannelPublisher.java diff --git a/rabbitmq/src/main/java/com/baeldung/benchmark/SharedConnectionPublisher.java b/messaging-modules/rabbitmq/src/main/java/com/baeldung/benchmark/SharedConnectionPublisher.java similarity index 100% rename from rabbitmq/src/main/java/com/baeldung/benchmark/SharedConnectionPublisher.java rename to messaging-modules/rabbitmq/src/main/java/com/baeldung/benchmark/SharedConnectionPublisher.java diff --git a/rabbitmq/src/main/java/com/baeldung/benchmark/SingleConnectionPublisher.java b/messaging-modules/rabbitmq/src/main/java/com/baeldung/benchmark/SingleConnectionPublisher.java similarity index 100% rename from rabbitmq/src/main/java/com/baeldung/benchmark/SingleConnectionPublisher.java rename to messaging-modules/rabbitmq/src/main/java/com/baeldung/benchmark/SingleConnectionPublisher.java diff --git a/rabbitmq/src/main/java/com/baeldung/benchmark/SingleConnectionPublisherNio.java b/messaging-modules/rabbitmq/src/main/java/com/baeldung/benchmark/SingleConnectionPublisherNio.java similarity index 100% rename from rabbitmq/src/main/java/com/baeldung/benchmark/SingleConnectionPublisherNio.java rename to messaging-modules/rabbitmq/src/main/java/com/baeldung/benchmark/SingleConnectionPublisherNio.java diff --git a/rabbitmq/src/main/java/com/baeldung/benchmark/Worker.java b/messaging-modules/rabbitmq/src/main/java/com/baeldung/benchmark/Worker.java similarity index 100% rename from rabbitmq/src/main/java/com/baeldung/benchmark/Worker.java rename to messaging-modules/rabbitmq/src/main/java/com/baeldung/benchmark/Worker.java diff --git a/rabbitmq/src/main/java/com/baeldung/consumer/Receiver.java b/messaging-modules/rabbitmq/src/main/java/com/baeldung/consumer/Receiver.java similarity index 100% rename from rabbitmq/src/main/java/com/baeldung/consumer/Receiver.java rename to messaging-modules/rabbitmq/src/main/java/com/baeldung/consumer/Receiver.java diff --git a/rabbitmq/src/main/java/com/baeldung/producer/Publisher.java b/messaging-modules/rabbitmq/src/main/java/com/baeldung/producer/Publisher.java similarity index 100% rename from rabbitmq/src/main/java/com/baeldung/producer/Publisher.java rename to messaging-modules/rabbitmq/src/main/java/com/baeldung/producer/Publisher.java diff --git a/rabbitmq/src/main/java/com/baeldung/pubsubmq/client/ClientApplication.java b/messaging-modules/rabbitmq/src/main/java/com/baeldung/pubsubmq/client/ClientApplication.java similarity index 100% rename from rabbitmq/src/main/java/com/baeldung/pubsubmq/client/ClientApplication.java rename to messaging-modules/rabbitmq/src/main/java/com/baeldung/pubsubmq/client/ClientApplication.java diff --git a/rabbitmq/src/main/java/com/baeldung/pubsubmq/client/Consumer.java b/messaging-modules/rabbitmq/src/main/java/com/baeldung/pubsubmq/client/Consumer.java similarity index 100% rename from rabbitmq/src/main/java/com/baeldung/pubsubmq/client/Consumer.java rename to messaging-modules/rabbitmq/src/main/java/com/baeldung/pubsubmq/client/Consumer.java diff --git a/rabbitmq/src/main/java/com/baeldung/pubsubmq/server/Publisher.java b/messaging-modules/rabbitmq/src/main/java/com/baeldung/pubsubmq/server/Publisher.java similarity index 100% rename from rabbitmq/src/main/java/com/baeldung/pubsubmq/server/Publisher.java rename to messaging-modules/rabbitmq/src/main/java/com/baeldung/pubsubmq/server/Publisher.java diff --git a/rabbitmq/src/main/java/com/baeldung/pubsubmq/server/ServerApplication.java b/messaging-modules/rabbitmq/src/main/java/com/baeldung/pubsubmq/server/ServerApplication.java similarity index 100% rename from rabbitmq/src/main/java/com/baeldung/pubsubmq/server/ServerApplication.java rename to messaging-modules/rabbitmq/src/main/java/com/baeldung/pubsubmq/server/ServerApplication.java diff --git a/rabbitmq/src/main/java/com/baeldung/setup/Setup.java b/messaging-modules/rabbitmq/src/main/java/com/baeldung/setup/Setup.java similarity index 100% rename from rabbitmq/src/main/java/com/baeldung/setup/Setup.java rename to messaging-modules/rabbitmq/src/main/java/com/baeldung/setup/Setup.java diff --git a/rabbitmq/src/main/resources/logback.xml b/messaging-modules/rabbitmq/src/main/resources/logback.xml similarity index 100% rename from rabbitmq/src/main/resources/logback.xml rename to messaging-modules/rabbitmq/src/main/resources/logback.xml diff --git a/rabbitmq/src/rabbitmq/20-mem.conf b/messaging-modules/rabbitmq/src/rabbitmq/20-mem.conf similarity index 100% rename from rabbitmq/src/rabbitmq/20-mem.conf rename to messaging-modules/rabbitmq/src/rabbitmq/20-mem.conf diff --git a/rabbitmq/src/test/java/com/baeldung/benchmark/ConnectionPerChannelPublisherLiveTest.java b/messaging-modules/rabbitmq/src/test/java/com/baeldung/benchmark/ConnectionPerChannelPublisherLiveTest.java similarity index 100% rename from rabbitmq/src/test/java/com/baeldung/benchmark/ConnectionPerChannelPublisherLiveTest.java rename to messaging-modules/rabbitmq/src/test/java/com/baeldung/benchmark/ConnectionPerChannelPublisherLiveTest.java diff --git a/rabbitmq/src/test/java/com/baeldung/benchmark/SingleConnectionPublisherLiveTest.java b/messaging-modules/rabbitmq/src/test/java/com/baeldung/benchmark/SingleConnectionPublisherLiveTest.java similarity index 100% rename from rabbitmq/src/test/java/com/baeldung/benchmark/SingleConnectionPublisherLiveTest.java rename to messaging-modules/rabbitmq/src/test/java/com/baeldung/benchmark/SingleConnectionPublisherLiveTest.java diff --git a/spring-amqp/README.md b/messaging-modules/spring-amqp/README.md similarity index 100% rename from spring-amqp/README.md rename to messaging-modules/spring-amqp/README.md diff --git a/spring-amqp/pom.xml b/messaging-modules/spring-amqp/pom.xml similarity index 88% rename from spring-amqp/pom.xml rename to messaging-modules/spring-amqp/pom.xml index 1a0b78c26e..7b2f7d518c 100755 --- a/spring-amqp/pom.xml +++ b/messaging-modules/spring-amqp/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + messaging-modules 0.0.1-SNAPSHOT - ../parent-boot-2 diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/broadcast/BroadcastConfig.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/broadcast/BroadcastConfig.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/broadcast/BroadcastConfig.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/broadcast/BroadcastConfig.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/broadcast/BroadcastMessageApp.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/broadcast/BroadcastMessageApp.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/broadcast/BroadcastMessageApp.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/broadcast/BroadcastMessageApp.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/ErrorHandlingApp.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/ErrorHandlingApp.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/ErrorHandlingApp.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/ErrorHandlingApp.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/DLXCustomAmqpConfiguration.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/DLXCustomAmqpConfiguration.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/DLXCustomAmqpConfiguration.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/DLXCustomAmqpConfiguration.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/DLXParkingLotAmqpConfiguration.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/DLXParkingLotAmqpConfiguration.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/DLXParkingLotAmqpConfiguration.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/DLXParkingLotAmqpConfiguration.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/FatalExceptionStrategyAmqpConfiguration.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/FatalExceptionStrategyAmqpConfiguration.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/FatalExceptionStrategyAmqpConfiguration.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/FatalExceptionStrategyAmqpConfiguration.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/ListenerErrorHandlerAmqpConfiguration.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/ListenerErrorHandlerAmqpConfiguration.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/ListenerErrorHandlerAmqpConfiguration.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/ListenerErrorHandlerAmqpConfiguration.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/RoutingKeyDLQAmqpConfiguration.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/RoutingKeyDLQAmqpConfiguration.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/RoutingKeyDLQAmqpConfiguration.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/RoutingKeyDLQAmqpConfiguration.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/SimpleDLQAmqpConfiguration.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/SimpleDLQAmqpConfiguration.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/SimpleDLQAmqpConfiguration.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/configuration/SimpleDLQAmqpConfiguration.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/DLQCustomAmqpContainer.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/DLQCustomAmqpContainer.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/DLQCustomAmqpContainer.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/DLQCustomAmqpContainer.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/MessagesConsumer.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/MessagesConsumer.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/MessagesConsumer.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/MessagesConsumer.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/ParkingLotDLQAmqpContainer.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/ParkingLotDLQAmqpContainer.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/ParkingLotDLQAmqpContainer.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/ParkingLotDLQAmqpContainer.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/RoutingDLQAmqpContainer.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/RoutingDLQAmqpContainer.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/RoutingDLQAmqpContainer.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/RoutingDLQAmqpContainer.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/SimpleDLQAmqpContainer.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/SimpleDLQAmqpContainer.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/SimpleDLQAmqpContainer.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/consumer/SimpleDLQAmqpContainer.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/errorhandler/BusinessException.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/errorhandler/BusinessException.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/errorhandler/BusinessException.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/errorhandler/BusinessException.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/errorhandler/CustomErrorHandler.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/errorhandler/CustomErrorHandler.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/errorhandler/CustomErrorHandler.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/errorhandler/CustomErrorHandler.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/errorhandler/CustomFatalExceptionStrategy.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/errorhandler/CustomFatalExceptionStrategy.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/errorhandler/CustomFatalExceptionStrategy.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/errorhandler/CustomFatalExceptionStrategy.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/producer/MessageProducer.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/producer/MessageProducer.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/producer/MessageProducer.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/errorhandling/producer/MessageProducer.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/ExponentialBackoffApp.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/ExponentialBackoffApp.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/ExponentialBackoffApp.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/ExponentialBackoffApp.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/ObservableRejectAndDontRequeueRecoverer.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/ObservableRejectAndDontRequeueRecoverer.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/ObservableRejectAndDontRequeueRecoverer.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/ObservableRejectAndDontRequeueRecoverer.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RabbitConfiguration.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RabbitConfiguration.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RabbitConfiguration.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RabbitConfiguration.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RetryQueues.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RetryQueues.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RetryQueues.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RetryQueues.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RetryQueuesInterceptor.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RetryQueuesInterceptor.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RetryQueuesInterceptor.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RetryQueuesInterceptor.java diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/simple/HelloWorldMessageApp.java b/messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/simple/HelloWorldMessageApp.java similarity index 100% rename from spring-amqp/src/main/java/com/baeldung/springamqp/simple/HelloWorldMessageApp.java rename to messaging-modules/spring-amqp/src/main/java/com/baeldung/springamqp/simple/HelloWorldMessageApp.java diff --git a/spring-amqp/src/main/resources/application.properties b/messaging-modules/spring-amqp/src/main/resources/application.properties similarity index 100% rename from spring-amqp/src/main/resources/application.properties rename to messaging-modules/spring-amqp/src/main/resources/application.properties diff --git a/spring-amqp/src/test/java/com/baeldung/springamqp/exponentialbackoff/ExponentialBackoffLiveTest.java b/messaging-modules/spring-amqp/src/test/java/com/baeldung/springamqp/exponentialbackoff/ExponentialBackoffLiveTest.java similarity index 100% rename from spring-amqp/src/test/java/com/baeldung/springamqp/exponentialbackoff/ExponentialBackoffLiveTest.java rename to messaging-modules/spring-amqp/src/test/java/com/baeldung/springamqp/exponentialbackoff/ExponentialBackoffLiveTest.java diff --git a/spring-amqp/src/test/resources/logback-test.xml b/messaging-modules/spring-amqp/src/test/resources/logback-test.xml similarity index 100% rename from spring-amqp/src/test/resources/logback-test.xml rename to messaging-modules/spring-amqp/src/test/resources/logback-test.xml diff --git a/spring-apache-camel/.gitignore b/messaging-modules/spring-apache-camel/.gitignore similarity index 100% rename from spring-apache-camel/.gitignore rename to messaging-modules/spring-apache-camel/.gitignore diff --git a/spring-apache-camel/README.md b/messaging-modules/spring-apache-camel/README.md similarity index 100% rename from spring-apache-camel/README.md rename to messaging-modules/spring-apache-camel/README.md diff --git a/spring-apache-camel/pom.xml b/messaging-modules/spring-apache-camel/pom.xml similarity index 90% rename from spring-apache-camel/pom.xml rename to messaging-modules/spring-apache-camel/pom.xml index de7bd1287a..8ba1697d3d 100644 --- a/spring-apache-camel/pom.xml +++ b/messaging-modules/spring-apache-camel/pom.xml @@ -3,19 +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/maven-v4_0_0.xsd"> 4.0.0 - org.apache.camel + org.baeldung.apache.camel spring-apache-camel - 1.0-SNAPSHOT spring-apache-camel jar http://maven.apache.org com.baeldung - parent-modules - 1.0.0-SNAPSHOT + messaging-modules + 0.0.1-SNAPSHOT - + org.apache.camel @@ -66,4 +65,4 @@ 4.3.4.RELEASE - \ No newline at end of file + diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/file/ContentBasedFileRouter.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/ContentBasedFileRouter.java similarity index 100% rename from spring-apache-camel/src/main/java/com/baeldung/camel/file/ContentBasedFileRouter.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/ContentBasedFileRouter.java diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/file/DeadLetterChannelFileRouter.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/DeadLetterChannelFileRouter.java similarity index 100% rename from spring-apache-camel/src/main/java/com/baeldung/camel/file/DeadLetterChannelFileRouter.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/DeadLetterChannelFileRouter.java diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileProcessor.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileProcessor.java similarity index 100% rename from spring-apache-camel/src/main/java/com/baeldung/camel/file/FileProcessor.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileProcessor.java diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileRouter.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileRouter.java similarity index 100% rename from spring-apache-camel/src/main/java/com/baeldung/camel/file/FileRouter.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileRouter.java diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/file/MessageTranslatorFileRouter.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/MessageTranslatorFileRouter.java similarity index 100% rename from spring-apache-camel/src/main/java/com/baeldung/camel/file/MessageTranslatorFileRouter.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/MessageTranslatorFileRouter.java diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/file/MulticastFileRouter.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/MulticastFileRouter.java similarity index 100% rename from spring-apache-camel/src/main/java/com/baeldung/camel/file/MulticastFileRouter.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/MulticastFileRouter.java diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/file/SplitterFileRouter.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/SplitterFileRouter.java similarity index 100% rename from spring-apache-camel/src/main/java/com/baeldung/camel/file/SplitterFileRouter.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/SplitterFileRouter.java diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/file/cfg/ContentBasedFileRouterConfig.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/cfg/ContentBasedFileRouterConfig.java similarity index 100% rename from spring-apache-camel/src/main/java/com/baeldung/camel/file/cfg/ContentBasedFileRouterConfig.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/cfg/ContentBasedFileRouterConfig.java diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/jackson/Fruit.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/jackson/Fruit.java similarity index 100% rename from spring-apache-camel/src/main/java/com/baeldung/camel/jackson/Fruit.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/jackson/Fruit.java diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/jackson/FruitList.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/jackson/FruitList.java similarity index 100% rename from spring-apache-camel/src/main/java/com/baeldung/camel/jackson/FruitList.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/jackson/FruitList.java diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/main/App.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/main/App.java similarity index 100% rename from spring-apache-camel/src/main/java/com/baeldung/camel/main/App.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/main/App.java diff --git a/spring-apache-camel/src/main/java/com/baeldung/camel/processor/FileProcessor.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/processor/FileProcessor.java similarity index 100% rename from spring-apache-camel/src/main/java/com/baeldung/camel/processor/FileProcessor.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/processor/FileProcessor.java diff --git a/spring-apache-camel/src/main/resources/camel-context-ContentBasedFileRouterTest.xml b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-ContentBasedFileRouterTest.xml similarity index 100% rename from spring-apache-camel/src/main/resources/camel-context-ContentBasedFileRouterTest.xml rename to messaging-modules/spring-apache-camel/src/main/resources/camel-context-ContentBasedFileRouterTest.xml diff --git a/spring-apache-camel/src/main/resources/camel-context-DeadLetterChannelFileRouter.xml b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-DeadLetterChannelFileRouter.xml similarity index 100% rename from spring-apache-camel/src/main/resources/camel-context-DeadLetterChannelFileRouter.xml rename to messaging-modules/spring-apache-camel/src/main/resources/camel-context-DeadLetterChannelFileRouter.xml diff --git a/spring-apache-camel/src/main/resources/camel-context-MessageTranslatorFileRouterTest.xml b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-MessageTranslatorFileRouterTest.xml similarity index 100% rename from spring-apache-camel/src/main/resources/camel-context-MessageTranslatorFileRouterTest.xml rename to messaging-modules/spring-apache-camel/src/main/resources/camel-context-MessageTranslatorFileRouterTest.xml diff --git a/spring-apache-camel/src/main/resources/camel-context-MulticastFileRouterTest.xml b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-MulticastFileRouterTest.xml similarity index 100% rename from spring-apache-camel/src/main/resources/camel-context-MulticastFileRouterTest.xml rename to messaging-modules/spring-apache-camel/src/main/resources/camel-context-MulticastFileRouterTest.xml diff --git a/spring-apache-camel/src/main/resources/camel-context-SplitterFileRouter.xml b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-SplitterFileRouter.xml similarity index 100% rename from spring-apache-camel/src/main/resources/camel-context-SplitterFileRouter.xml rename to messaging-modules/spring-apache-camel/src/main/resources/camel-context-SplitterFileRouter.xml diff --git a/spring-apache-camel/src/main/resources/camel-context-test.xml b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-test.xml similarity index 100% rename from spring-apache-camel/src/main/resources/camel-context-test.xml rename to messaging-modules/spring-apache-camel/src/main/resources/camel-context-test.xml diff --git a/spring-apache-camel/src/main/resources/camel-context.xml b/messaging-modules/spring-apache-camel/src/main/resources/camel-context.xml similarity index 100% rename from spring-apache-camel/src/main/resources/camel-context.xml rename to messaging-modules/spring-apache-camel/src/main/resources/camel-context.xml diff --git a/saas/src/main/resources/logback.xml b/messaging-modules/spring-apache-camel/src/main/resources/logback.xml similarity index 100% rename from saas/src/main/resources/logback.xml rename to messaging-modules/spring-apache-camel/src/main/resources/logback.xml diff --git a/spring-apache-camel/src/test/data/sampleInputFile/file.txt b/messaging-modules/spring-apache-camel/src/test/data/sampleInputFile/file.txt similarity index 100% rename from spring-apache-camel/src/test/data/sampleInputFile/file.txt rename to messaging-modules/spring-apache-camel/src/test/data/sampleInputFile/file.txt diff --git a/spring-apache-camel/src/test/java/com/apache/camel/file/processor/ContentBasedFileRouterIntegrationTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/ContentBasedFileRouterIntegrationTest.java similarity index 100% rename from spring-apache-camel/src/test/java/com/apache/camel/file/processor/ContentBasedFileRouterIntegrationTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/ContentBasedFileRouterIntegrationTest.java diff --git a/spring-apache-camel/src/test/java/com/apache/camel/file/processor/DeadLetterChannelFileRouterIntegrationTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/DeadLetterChannelFileRouterIntegrationTest.java similarity index 100% rename from spring-apache-camel/src/test/java/com/apache/camel/file/processor/DeadLetterChannelFileRouterIntegrationTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/DeadLetterChannelFileRouterIntegrationTest.java diff --git a/spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorIntegrationTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorIntegrationTest.java similarity index 100% rename from spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorIntegrationTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorIntegrationTest.java diff --git a/spring-apache-camel/src/test/java/com/apache/camel/file/processor/MessageTranslatorFileRouterIntegrationTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/MessageTranslatorFileRouterIntegrationTest.java similarity index 100% rename from spring-apache-camel/src/test/java/com/apache/camel/file/processor/MessageTranslatorFileRouterIntegrationTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/MessageTranslatorFileRouterIntegrationTest.java diff --git a/spring-apache-camel/src/test/java/com/apache/camel/file/processor/MulticastFileRouterIntegrationTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/MulticastFileRouterIntegrationTest.java similarity index 100% rename from spring-apache-camel/src/test/java/com/apache/camel/file/processor/MulticastFileRouterIntegrationTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/MulticastFileRouterIntegrationTest.java diff --git a/spring-apache-camel/src/test/java/com/apache/camel/file/processor/SplitterFileRouterIntegrationTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/SplitterFileRouterIntegrationTest.java similarity index 100% rename from spring-apache-camel/src/test/java/com/apache/camel/file/processor/SplitterFileRouterIntegrationTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/SplitterFileRouterIntegrationTest.java diff --git a/spring-apache-camel/src/test/java/com/apache/camel/main/AppIntegrationTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/main/AppIntegrationTest.java similarity index 100% rename from spring-apache-camel/src/test/java/com/apache/camel/main/AppIntegrationTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/main/AppIntegrationTest.java diff --git a/spring-apache-camel/src/test/java/com/baeldung/SpringContextTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-apache-camel/src/test/java/com/baeldung/SpringContextTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-apache-camel/src/test/java/com/baeldung/camel/jackson/FruitArrayJacksonUnmarshalUnitTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/baeldung/camel/jackson/FruitArrayJacksonUnmarshalUnitTest.java similarity index 100% rename from spring-apache-camel/src/test/java/com/baeldung/camel/jackson/FruitArrayJacksonUnmarshalUnitTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/baeldung/camel/jackson/FruitArrayJacksonUnmarshalUnitTest.java diff --git a/spring-apache-camel/src/test/java/com/baeldung/camel/jackson/FruitListJacksonUnmarshalUnitTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/baeldung/camel/jackson/FruitListJacksonUnmarshalUnitTest.java similarity index 100% rename from spring-apache-camel/src/test/java/com/baeldung/camel/jackson/FruitListJacksonUnmarshalUnitTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/baeldung/camel/jackson/FruitListJacksonUnmarshalUnitTest.java diff --git a/spring-apache-camel/src/test/resources/json/fruit-array.json b/messaging-modules/spring-apache-camel/src/test/resources/json/fruit-array.json similarity index 100% rename from spring-apache-camel/src/test/resources/json/fruit-array.json rename to messaging-modules/spring-apache-camel/src/test/resources/json/fruit-array.json diff --git a/spring-apache-camel/src/test/resources/json/fruit-list.json b/messaging-modules/spring-apache-camel/src/test/resources/json/fruit-list.json similarity index 100% rename from spring-apache-camel/src/test/resources/json/fruit-list.json rename to messaging-modules/spring-apache-camel/src/test/resources/json/fruit-list.json diff --git a/spring-jms/README.md b/messaging-modules/spring-jms/README.md similarity index 100% rename from spring-jms/README.md rename to messaging-modules/spring-jms/README.md diff --git a/spring-jms/pom.xml b/messaging-modules/spring-jms/pom.xml similarity index 93% rename from spring-jms/pom.xml rename to messaging-modules/spring-jms/pom.xml index ab202402f3..398a2ec54c 100644 --- a/spring-jms/pom.xml +++ b/messaging-modules/spring-jms/pom.xml @@ -4,15 +4,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-jms - 0.0.1-SNAPSHOT spring-jms war Introduction to Spring JMS com.baeldung - parent-modules - 1.0.0-SNAPSHOT + messaging-modules + 0.0.1-SNAPSHOT @@ -86,4 +85,4 @@ 1.5.10.RELEASE - \ No newline at end of file + diff --git a/spring-jms/src/main/java/com/baeldung/spring/jms/Employee.java b/messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/Employee.java similarity index 100% rename from spring-jms/src/main/java/com/baeldung/spring/jms/Employee.java rename to messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/Employee.java diff --git a/spring-jms/src/main/java/com/baeldung/spring/jms/SampleJmsErrorHandler.java b/messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/SampleJmsErrorHandler.java similarity index 100% rename from spring-jms/src/main/java/com/baeldung/spring/jms/SampleJmsErrorHandler.java rename to messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/SampleJmsErrorHandler.java diff --git a/spring-jms/src/main/java/com/baeldung/spring/jms/SampleJmsMessageSender.java b/messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/SampleJmsMessageSender.java similarity index 100% rename from spring-jms/src/main/java/com/baeldung/spring/jms/SampleJmsMessageSender.java rename to messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/SampleJmsMessageSender.java diff --git a/spring-jms/src/main/java/com/baeldung/spring/jms/SampleListener.java b/messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/SampleListener.java similarity index 100% rename from spring-jms/src/main/java/com/baeldung/spring/jms/SampleListener.java rename to messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/SampleListener.java diff --git a/spring-jms/src/main/java/com/baeldung/spring/jms/SampleMessageConverter.java b/messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/SampleMessageConverter.java similarity index 100% rename from spring-jms/src/main/java/com/baeldung/spring/jms/SampleMessageConverter.java rename to messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/SampleMessageConverter.java diff --git a/spring-jms/src/main/java/com/baeldung/spring/jms/testing/JmsApplication.java b/messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/testing/JmsApplication.java similarity index 100% rename from spring-jms/src/main/java/com/baeldung/spring/jms/testing/JmsApplication.java rename to messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/testing/JmsApplication.java diff --git a/spring-jms/src/main/java/com/baeldung/spring/jms/testing/JmsConfig.java b/messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/testing/JmsConfig.java similarity index 100% rename from spring-jms/src/main/java/com/baeldung/spring/jms/testing/JmsConfig.java rename to messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/testing/JmsConfig.java diff --git a/spring-jms/src/main/java/com/baeldung/spring/jms/testing/MessageListener.java b/messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/testing/MessageListener.java similarity index 100% rename from spring-jms/src/main/java/com/baeldung/spring/jms/testing/MessageListener.java rename to messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/testing/MessageListener.java diff --git a/spring-jms/src/main/java/com/baeldung/spring/jms/testing/MessageSender.java b/messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/testing/MessageSender.java similarity index 100% rename from spring-jms/src/main/java/com/baeldung/spring/jms/testing/MessageSender.java rename to messaging-modules/spring-jms/src/main/java/com/baeldung/spring/jms/testing/MessageSender.java diff --git a/spring-jms/src/main/resources/EmbeddedActiveMQ.xml b/messaging-modules/spring-jms/src/main/resources/EmbeddedActiveMQ.xml similarity index 100% rename from spring-jms/src/main/resources/EmbeddedActiveMQ.xml rename to messaging-modules/spring-jms/src/main/resources/EmbeddedActiveMQ.xml diff --git a/spring-jms/src/main/resources/applicationContext.xml b/messaging-modules/spring-jms/src/main/resources/applicationContext.xml similarity index 100% rename from spring-jms/src/main/resources/applicationContext.xml rename to messaging-modules/spring-jms/src/main/resources/applicationContext.xml diff --git a/spring-apache-camel/src/main/resources/logback.xml b/messaging-modules/spring-jms/src/main/resources/logback.xml similarity index 100% rename from spring-apache-camel/src/main/resources/logback.xml rename to messaging-modules/spring-jms/src/main/resources/logback.xml diff --git a/spring-jms/src/main/webapp/META-INF/MANIFEST.MF b/messaging-modules/spring-jms/src/main/webapp/META-INF/MANIFEST.MF similarity index 100% rename from spring-jms/src/main/webapp/META-INF/MANIFEST.MF rename to messaging-modules/spring-jms/src/main/webapp/META-INF/MANIFEST.MF diff --git a/spring-jms/src/test/java/com/baeldung/SpringContextTest.java b/messaging-modules/spring-jms/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-jms/src/test/java/com/baeldung/SpringContextTest.java rename to messaging-modules/spring-jms/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-jms/src/test/java/com/baeldung/spring/jms/DefaultTextMessageSenderIntegrationTest.java b/messaging-modules/spring-jms/src/test/java/com/baeldung/spring/jms/DefaultTextMessageSenderIntegrationTest.java similarity index 100% rename from spring-jms/src/test/java/com/baeldung/spring/jms/DefaultTextMessageSenderIntegrationTest.java rename to messaging-modules/spring-jms/src/test/java/com/baeldung/spring/jms/DefaultTextMessageSenderIntegrationTest.java diff --git a/spring-jms/src/test/java/com/baeldung/spring/jms/testing/EmbeddedActiveMqIntegrationTest.java b/messaging-modules/spring-jms/src/test/java/com/baeldung/spring/jms/testing/EmbeddedActiveMqIntegrationTest.java similarity index 100% rename from spring-jms/src/test/java/com/baeldung/spring/jms/testing/EmbeddedActiveMqIntegrationTest.java rename to messaging-modules/spring-jms/src/test/java/com/baeldung/spring/jms/testing/EmbeddedActiveMqIntegrationTest.java diff --git a/spring-jms/src/test/java/com/baeldung/spring/jms/testing/TestContainersActiveMqLiveTest.java b/messaging-modules/spring-jms/src/test/java/com/baeldung/spring/jms/testing/TestContainersActiveMqLiveTest.java similarity index 100% rename from spring-jms/src/test/java/com/baeldung/spring/jms/testing/TestContainersActiveMqLiveTest.java rename to messaging-modules/spring-jms/src/test/java/com/baeldung/spring/jms/testing/TestContainersActiveMqLiveTest.java diff --git a/pom.xml b/pom.xml index 60f8512052..adbccc6612 100644 --- a/pom.xml +++ b/pom.xml @@ -415,7 +415,6 @@ jaxb jersey jgit - jgroups jhipster-5 jib jmeter @@ -457,6 +456,7 @@ maven-modules mesos-marathon + messaging-modules metrics microservices-modules muleesb @@ -477,7 +477,6 @@ quarkus-modules - rabbitmq reactor-core rsocket rule-engines-modules @@ -532,7 +531,7 @@ parent-spring-5 parent-java - saas + saas-modules server-modules spf4j @@ -545,10 +544,8 @@ spring-5-webflux-2 spring-activiti - spring-amqp spring-aop spring-aop-2 - spring-apache-camel spring-batch spring-batch-2 @@ -582,7 +579,6 @@ spring-jenkins-pipeline spring-jersey - spring-jms spring-kafka spring-katharsis @@ -612,14 +608,10 @@ spring-websockets static-analysis - stripe tensorflow-java testing-modules - twilio - twitter4j - vertx-modules video-tutorials @@ -807,7 +799,6 @@ jaxb jersey jgit - jgroups jhipster-5 jib jmeter @@ -848,6 +839,7 @@ maven-modules mesos-marathon + messaging-modules metrics microservices-modules muleesb @@ -867,7 +859,6 @@ quarkus-modules - rabbitmq reactor-core rsocket rule-engines-modules @@ -914,7 +905,7 @@ parent-spring-5 parent-java - saas + saas-modules server-modules spf4j @@ -928,10 +919,8 @@ spring-activiti - spring-amqp spring-aop spring-aop-2 - spring-apache-camel spring-batch spring-batch-2 @@ -965,7 +954,6 @@ spring-jenkins-pipeline spring-jersey spring-jinq - spring-jms spring-kafka spring-katharsis @@ -995,14 +983,10 @@ spring-websockets static-analysis - stripe tensorflow-java testing-modules - twilio - twitter4j - vertx-modules video-tutorials diff --git a/saas/.gitignore b/saas-modules/jira-rest-integration/.gitignore similarity index 100% rename from saas/.gitignore rename to saas-modules/jira-rest-integration/.gitignore diff --git a/saas/README.md b/saas-modules/jira-rest-integration/README.md similarity index 53% rename from saas/README.md rename to saas-modules/jira-rest-integration/README.md index 4effb2afa9..5ae79ab5ea 100644 --- a/saas/README.md +++ b/saas-modules/jira-rest-integration/README.md @@ -1,6 +1,6 @@ -## SAAS +## Jira Rest Integration -This module contains articles about software as a service (SAAS) +This module contains articles about Jira Rest Integration ## Relevant articles: diff --git a/saas/pom.xml b/saas-modules/jira-rest-integration/pom.xml similarity index 90% rename from saas/pom.xml rename to saas-modules/jira-rest-integration/pom.xml index 87f273939c..9441691d49 100644 --- a/saas/pom.xml +++ b/saas-modules/jira-rest-integration/pom.xml @@ -3,16 +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 - saas - 0.1.0-SNAPSHOT - saas + jira-rest-integration + jira-rest-integration jar com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../parent-java + saas-modules + 1.0.0-SNAPSHOT @@ -67,4 +65,4 @@ 2.6.1 - \ No newline at end of file + diff --git a/saas/src/main/java/com/baeldung/saas/jira/MyJiraClient.java b/saas-modules/jira-rest-integration/src/main/java/com/baeldung/saas/jira/MyJiraClient.java similarity index 100% rename from saas/src/main/java/com/baeldung/saas/jira/MyJiraClient.java rename to saas-modules/jira-rest-integration/src/main/java/com/baeldung/saas/jira/MyJiraClient.java diff --git a/spring-jms/src/main/resources/logback.xml b/saas-modules/jira-rest-integration/src/main/resources/logback.xml similarity index 100% rename from spring-jms/src/main/resources/logback.xml rename to saas-modules/jira-rest-integration/src/main/resources/logback.xml diff --git a/saas-modules/pom.xml b/saas-modules/pom.xml new file mode 100644 index 0000000000..db319442c3 --- /dev/null +++ b/saas-modules/pom.xml @@ -0,0 +1,36 @@ + + + 4.0.0 + saas-modules + saas-modules + 1.0.0-SNAPSHOT + pom + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + jira-rest-integration + stripe + twilio + twitter4j + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/stripe/.gitignore b/saas-modules/stripe/.gitignore similarity index 100% rename from stripe/.gitignore rename to saas-modules/stripe/.gitignore diff --git a/stripe/README.md b/saas-modules/stripe/README.md similarity index 100% rename from stripe/README.md rename to saas-modules/stripe/README.md diff --git a/stripe/pom.xml b/saas-modules/stripe/pom.xml similarity index 87% rename from stripe/pom.xml rename to saas-modules/stripe/pom.xml index cfd281b4a8..468c62ac85 100644 --- a/stripe/pom.xml +++ b/saas-modules/stripe/pom.xml @@ -5,16 +5,14 @@ 4.0.0 com.baeldung.stripe stripe - 0.0.1-SNAPSHOT stripe jar Demo project for Stripe API com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2 + saas-modules + 1.0.0-SNAPSHOT @@ -41,4 +39,4 @@ 4.2.0 - \ No newline at end of file + diff --git a/stripe/src/main/java/com/baeldung/stripe/ChargeController.java b/saas-modules/stripe/src/main/java/com/baeldung/stripe/ChargeController.java similarity index 100% rename from stripe/src/main/java/com/baeldung/stripe/ChargeController.java rename to saas-modules/stripe/src/main/java/com/baeldung/stripe/ChargeController.java diff --git a/stripe/src/main/java/com/baeldung/stripe/ChargeRequest.java b/saas-modules/stripe/src/main/java/com/baeldung/stripe/ChargeRequest.java similarity index 100% rename from stripe/src/main/java/com/baeldung/stripe/ChargeRequest.java rename to saas-modules/stripe/src/main/java/com/baeldung/stripe/ChargeRequest.java diff --git a/stripe/src/main/java/com/baeldung/stripe/CheckoutController.java b/saas-modules/stripe/src/main/java/com/baeldung/stripe/CheckoutController.java similarity index 100% rename from stripe/src/main/java/com/baeldung/stripe/CheckoutController.java rename to saas-modules/stripe/src/main/java/com/baeldung/stripe/CheckoutController.java diff --git a/stripe/src/main/java/com/baeldung/stripe/StripeApplication.java b/saas-modules/stripe/src/main/java/com/baeldung/stripe/StripeApplication.java similarity index 100% rename from stripe/src/main/java/com/baeldung/stripe/StripeApplication.java rename to saas-modules/stripe/src/main/java/com/baeldung/stripe/StripeApplication.java diff --git a/stripe/src/main/java/com/baeldung/stripe/StripeService.java b/saas-modules/stripe/src/main/java/com/baeldung/stripe/StripeService.java similarity index 100% rename from stripe/src/main/java/com/baeldung/stripe/StripeService.java rename to saas-modules/stripe/src/main/java/com/baeldung/stripe/StripeService.java diff --git a/stripe/src/main/resources/application.properties b/saas-modules/stripe/src/main/resources/application.properties similarity index 100% rename from stripe/src/main/resources/application.properties rename to saas-modules/stripe/src/main/resources/application.properties diff --git a/stripe/src/main/resources/logback.xml b/saas-modules/stripe/src/main/resources/logback.xml similarity index 100% rename from stripe/src/main/resources/logback.xml rename to saas-modules/stripe/src/main/resources/logback.xml diff --git a/stripe/src/main/resources/static/index.html b/saas-modules/stripe/src/main/resources/static/index.html similarity index 100% rename from stripe/src/main/resources/static/index.html rename to saas-modules/stripe/src/main/resources/static/index.html diff --git a/stripe/src/main/resources/templates/checkout.html b/saas-modules/stripe/src/main/resources/templates/checkout.html similarity index 100% rename from stripe/src/main/resources/templates/checkout.html rename to saas-modules/stripe/src/main/resources/templates/checkout.html diff --git a/stripe/src/main/resources/templates/result.html b/saas-modules/stripe/src/main/resources/templates/result.html similarity index 100% rename from stripe/src/main/resources/templates/result.html rename to saas-modules/stripe/src/main/resources/templates/result.html diff --git a/twilio/README.md b/saas-modules/twilio/README.md similarity index 100% rename from twilio/README.md rename to saas-modules/twilio/README.md diff --git a/twilio/pom.xml b/saas-modules/twilio/pom.xml similarity index 89% rename from twilio/pom.xml rename to saas-modules/twilio/pom.xml index 327242749b..8e3271f482 100644 --- a/twilio/pom.xml +++ b/saas-modules/twilio/pom.xml @@ -4,12 +4,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 twilio - 1.0-SNAPSHOT twilio com.baeldung - parent-modules + saas-modules 1.0.0-SNAPSHOT @@ -25,4 +24,4 @@ 7.20.0 - \ No newline at end of file + diff --git a/twilio/src/main/java/com/baeldung/twilio/sms/TwilioSmsExample.java b/saas-modules/twilio/src/main/java/com/baeldung/twilio/sms/TwilioSmsExample.java similarity index 100% rename from twilio/src/main/java/com/baeldung/twilio/sms/TwilioSmsExample.java rename to saas-modules/twilio/src/main/java/com/baeldung/twilio/sms/TwilioSmsExample.java diff --git a/twilio/src/main/java/com/baeldung/twilio/sms/TwilioSmsMediaExample.java b/saas-modules/twilio/src/main/java/com/baeldung/twilio/sms/TwilioSmsMediaExample.java similarity index 100% rename from twilio/src/main/java/com/baeldung/twilio/sms/TwilioSmsMediaExample.java rename to saas-modules/twilio/src/main/java/com/baeldung/twilio/sms/TwilioSmsMediaExample.java diff --git a/twilio/src/main/java/com/baeldung/twilio/sms/TwilioSmsStatusAsyncExample.java b/saas-modules/twilio/src/main/java/com/baeldung/twilio/sms/TwilioSmsStatusAsyncExample.java similarity index 100% rename from twilio/src/main/java/com/baeldung/twilio/sms/TwilioSmsStatusAsyncExample.java rename to saas-modules/twilio/src/main/java/com/baeldung/twilio/sms/TwilioSmsStatusAsyncExample.java diff --git a/twilio/src/main/java/com/baeldung/twilio/sms/TwilioSmsStatusExample.java b/saas-modules/twilio/src/main/java/com/baeldung/twilio/sms/TwilioSmsStatusExample.java similarity index 100% rename from twilio/src/main/java/com/baeldung/twilio/sms/TwilioSmsStatusExample.java rename to saas-modules/twilio/src/main/java/com/baeldung/twilio/sms/TwilioSmsStatusExample.java diff --git a/twilio/src/main/resources/logback.xml b/saas-modules/twilio/src/main/resources/logback.xml similarity index 100% rename from twilio/src/main/resources/logback.xml rename to saas-modules/twilio/src/main/resources/logback.xml diff --git a/twitter4j/README.md b/saas-modules/twitter4j/README.md similarity index 100% rename from twitter4j/README.md rename to saas-modules/twitter4j/README.md diff --git a/twitter4j/pom.xml b/saas-modules/twitter4j/pom.xml similarity index 93% rename from twitter4j/pom.xml rename to saas-modules/twitter4j/pom.xml index 3e9bcd550a..2acee4583f 100644 --- a/twitter4j/pom.xml +++ b/saas-modules/twitter4j/pom.xml @@ -9,7 +9,7 @@ com.baeldung - parent-modules + saas-modules 1.0.0-SNAPSHOT @@ -25,4 +25,4 @@ 4.0.6 - \ No newline at end of file + diff --git a/twitter4j/src/main/java/com/baeldung/Application.java b/saas-modules/twitter4j/src/main/java/com/baeldung/Application.java similarity index 100% rename from twitter4j/src/main/java/com/baeldung/Application.java rename to saas-modules/twitter4j/src/main/java/com/baeldung/Application.java diff --git a/twitter4j/src/main/resources/logback.xml b/saas-modules/twitter4j/src/main/resources/logback.xml similarity index 100% rename from twitter4j/src/main/resources/logback.xml rename to saas-modules/twitter4j/src/main/resources/logback.xml diff --git a/twitter4j/src/main/resources/twitter4j.properties b/saas-modules/twitter4j/src/main/resources/twitter4j.properties similarity index 100% rename from twitter4j/src/main/resources/twitter4j.properties rename to saas-modules/twitter4j/src/main/resources/twitter4j.properties diff --git a/twitter4j/src/test/java/com/baeldung/ApplicationManualTest.java b/saas-modules/twitter4j/src/test/java/com/baeldung/ApplicationManualTest.java similarity index 100% rename from twitter4j/src/test/java/com/baeldung/ApplicationManualTest.java rename to saas-modules/twitter4j/src/test/java/com/baeldung/ApplicationManualTest.java From cbacca44c9413a6c7b67a5a40db2aecbd5f5b4e8 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Sat, 26 Nov 2022 22:20:16 +0000 Subject: [PATCH 043/592] [JAVA-15774] Update JUnit code --- .../junit5/AnnotationTestExampleUnitTest.java | 7 +++-- .../junit5/AssertionsExampleUnitTest.java | 18 ++++++------ ...foreAllAndAfterAllAnnotationsUnitTest.java | 12 ++++---- ...reEachAndAfterEachAnnotationsUnitTest.java | 28 +++++++++---------- .../migration/junit5/RuleExampleUnitTest.java | 6 ++-- 5 files changed, 35 insertions(+), 36 deletions(-) diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java index b324910ab7..4e3e0b36a9 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java @@ -9,9 +9,10 @@ import org.junit.jupiter.api.Test; @Tag("annotations") @Tag("junit5") -public class AnnotationTestExampleUnitTest { +class AnnotationTestExampleUnitTest { + @Test - public void shouldRaiseAnException() throws Exception { + void shouldRaiseAnException() { Assertions.assertThrows(Exception.class, () -> { throw new Exception("This is my expected exception"); }); @@ -19,7 +20,7 @@ public class AnnotationTestExampleUnitTest { @Test @Disabled - public void shouldFailBecauseTimeout() throws InterruptedException { + void shouldFailBecauseTimeout() { Assertions.assertTimeout(Duration.ofMillis(1), () -> Thread.sleep(10)); } } diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java index 14b1162ecf..896c9dcd9e 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java @@ -8,30 +8,28 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; public class AssertionsExampleUnitTest { + @Test @Disabled - public void shouldFailBecauseTheNumbersAreNotEqual() { + void shouldFailBecauseTheNumbersAreNotEqual() { Assertions.assertEquals(2, 3, "Numbers are not equal!"); } @Test @Disabled - public void shouldFailBecauseItsNotTrue_overloading() { + void shouldFailBecauseItsNotTrue_overloading() { Assertions.assertTrue(() -> { return false; }, () -> "It's not true!"); } @Test - public void shouldAssertAllTheGroup() { + void shouldAssertAllTheGroup() { List list = Arrays.asList(1, 2, 3); - Assertions.assertAll("List is not incremental", () -> Assertions.assertEquals(list.get(0) - .intValue(), 1), () -> Assertions.assertEquals( - list.get(1) - .intValue(), - 2), - () -> Assertions.assertEquals(list.get(2) - .intValue(), 3)); + Assertions.assertAll("List is not incremental", + () -> Assertions.assertEquals(list.get(0).intValue(), 1), + () -> Assertions.assertEquals(list.get(1).intValue(), 2), + () -> Assertions.assertEquals(list.get(2).intValue(), 3)); } } diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java index 68bb66657e..4087bb9b85 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java @@ -6,27 +6,27 @@ import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class BeforeAllAndAfterAllAnnotationsUnitTest { +class BeforeAllAndAfterAllAnnotationsUnitTest { private static final Logger LOG = LoggerFactory.getLogger(BeforeAllAndAfterAllAnnotationsUnitTest.class); - + @BeforeAll - public static void setup() { + static void setup() { LOG.debug("startup - creating DB connection"); } @AfterAll - public static void tearDown() { + static void tearDown() { LOG.debug("closing DB connection"); } @Test - public void simpleTest() { + void simpleTest() { LOG.debug("simple test"); } @Test - public void anotherSimpleTest() { + void anotherSimpleTest() { LOG.debug("another simple test"); } } diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java index 283665798d..9da15cac27 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java @@ -1,37 +1,37 @@ package com.baeldung.migration.junit5; -import static org.junit.Assert.assertEquals; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class BeforeEachAndAfterEachAnnotationsUnitTest { +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class BeforeEachAndAfterEachAnnotationsUnitTest { private static final Logger LOG = LoggerFactory.getLogger(BeforeEachAndAfterEachAnnotationsUnitTest.class); - + private List list; - - @BeforeEach - public void init() { + + @BeforeEach + void init() { LOG.debug("startup"); list = new ArrayList<>(Arrays.asList("test1", "test2")); } @AfterEach - public void teardown() { + void teardown() { LOG.debug("teardown"); list.clear(); } @Test - public void whenCheckingListSize_ThenSizeEqualsToInit() { + void whenCheckingListSize_thenSizeEqualsToInit() { LOG.debug("executing test"); assertEquals(2, list.size()); @@ -39,7 +39,7 @@ public class BeforeEachAndAfterEachAnnotationsUnitTest { } @Test - public void whenCheckingListSizeAgain_ThenSizeEqualsToInit() { + public void whenCheckingListSizeAgain_thenSizeEqualsToInit() { LOG.debug("executing another test"); assertEquals(2, list.size()); diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java index 5c878ef7d3..7e86cff003 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java @@ -8,12 +8,12 @@ import org.slf4j.LoggerFactory; import com.baeldung.migration.junit5.extensions.TraceUnitExtension; @ExtendWith(TraceUnitExtension.class) -public class RuleExampleUnitTest { +class RuleExampleUnitTest { private static final Logger LOGGER = LoggerFactory.getLogger(RuleExampleUnitTest.class); - + @Test - public void whenTracingTests() { + void whenTracingTests() { LOGGER.debug("This is my test"); /*...*/ } From c2a584c737f77ff7d90c2251878e710318af852b Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 27 Nov 2022 11:22:07 +0530 Subject: [PATCH 044/592] JAVA-14896 Update spring-thymeleaf-4 module under spring-web-modules to remove usage of deprecated WebSecurityConfigurerAdapter (#13086) --- .../thymeleaf/config/WebMVCSecurity.java | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/spring-web-modules/spring-thymeleaf-4/src/main/java/com/baeldung/thymeleaf/config/WebMVCSecurity.java b/spring-web-modules/spring-thymeleaf-4/src/main/java/com/baeldung/thymeleaf/config/WebMVCSecurity.java index ea51ca3cd9..b646717ec2 100644 --- a/spring-web-modules/spring-thymeleaf-4/src/main/java/com/baeldung/thymeleaf/config/WebMVCSecurity.java +++ b/spring-web-modules/spring-thymeleaf-4/src/main/java/com/baeldung/thymeleaf/config/WebMVCSecurity.java @@ -2,42 +2,43 @@ 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("ROLE_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"); + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.authorizeRequests() + .anyRequest() + .authenticated() + .and() + .httpBasic(); + return http.build(); } - - @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(); - } - } From 9ac3f4ffea3df5eaac16f35853e61b99bf70473a Mon Sep 17 00:00:00 2001 From: h_sharifi Date: Sun, 27 Nov 2022 10:49:48 +0330 Subject: [PATCH 045/592] #BAEL-5948:add new maven module --- spring-boot-modules/pom.xml | 1 + .../spring-boot-libraries-3/pom.xml | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 spring-boot-modules/spring-boot-libraries-3/pom.xml diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index b11c2c9afb..f17686752a 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -50,6 +50,7 @@ spring-boot-keycloak-2 spring-boot-libraries spring-boot-libraries-2 + spring-boot-libraries-3 spring-boot-logging-log4j2 spring-boot-mvc spring-boot-mvc-2 diff --git a/spring-boot-modules/spring-boot-libraries-3/pom.xml b/spring-boot-modules/spring-boot-libraries-3/pom.xml new file mode 100644 index 0000000000..0a924a46c2 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-3/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + spring-boot-libraries-3 + + + spring-boot-modules + com.baeldung.spring-boot-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + org.camunda.bpm.springboot + camunda-bpm-spring-boot-starter-webapp + ${camunda.version} + + + com.h2database + h2 + + + org.springframework.boot + spring-boot-starter-jdbc + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + 7.18.0 + + + \ No newline at end of file From 68c5a730eb4b5406dcb77d6a08f526189791fa76 Mon Sep 17 00:00:00 2001 From: h_sharifi Date: Sun, 27 Nov 2022 10:50:05 +0330 Subject: [PATCH 046/592] #BAEL-5948:add gitignore file --- spring-boot-modules/spring-boot-libraries-3/.gitignore | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 spring-boot-modules/spring-boot-libraries-3/.gitignore diff --git a/spring-boot-modules/spring-boot-libraries-3/.gitignore b/spring-boot-modules/spring-boot-libraries-3/.gitignore new file mode 100644 index 0000000000..da7c2c5c0a --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-3/.gitignore @@ -0,0 +1,5 @@ +/target/ +.settings/ +.classpath +.project + From e3f229f61d79ed90cf765d16c52936d871dd97b2 Mon Sep 17 00:00:00 2001 From: h_sharifi Date: Sun, 27 Nov 2022 10:50:29 +0330 Subject: [PATCH 047/592] #BAEL-5948:add main source code --- .../baeldung/camunda/CamundaApplication.java | 13 +++++++++++++ .../task/CalculateInterestService.java | 19 +++++++++++++++++++ .../src/main/resources/application.yaml | 5 +++++ 3 files changed, 37 insertions(+) create mode 100644 spring-boot-modules/spring-boot-libraries-3/src/main/java/com/baeldung/camunda/CamundaApplication.java create mode 100644 spring-boot-modules/spring-boot-libraries-3/src/main/java/com/baeldung/camunda/task/CalculateInterestService.java create mode 100644 spring-boot-modules/spring-boot-libraries-3/src/main/resources/application.yaml diff --git a/spring-boot-modules/spring-boot-libraries-3/src/main/java/com/baeldung/camunda/CamundaApplication.java b/spring-boot-modules/spring-boot-libraries-3/src/main/java/com/baeldung/camunda/CamundaApplication.java new file mode 100644 index 0000000000..2862bc9ebc --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-3/src/main/java/com/baeldung/camunda/CamundaApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.camunda; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CamundaApplication { + + public static void main(String[] args) { + SpringApplication.run(CamundaApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-libraries-3/src/main/java/com/baeldung/camunda/task/CalculateInterestService.java b/spring-boot-modules/spring-boot-libraries-3/src/main/java/com/baeldung/camunda/task/CalculateInterestService.java new file mode 100644 index 0000000000..ceef72ef79 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-3/src/main/java/com/baeldung/camunda/task/CalculateInterestService.java @@ -0,0 +1,19 @@ +package com.baeldung.camunda.task; + +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class CalculateInterestService implements JavaDelegate { + + private static final Logger LOGGER = LoggerFactory.getLogger(CalculateInterestService.class); + + @Override + public void execute(DelegateExecution execution) { + LOGGER.info("calculating interest of the loan"); + } + +} diff --git a/spring-boot-modules/spring-boot-libraries-3/src/main/resources/application.yaml b/spring-boot-modules/spring-boot-libraries-3/src/main/resources/application.yaml new file mode 100644 index 0000000000..102790e1ed --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-3/src/main/resources/application.yaml @@ -0,0 +1,5 @@ +spring.datasource.url: jdbc:h2:file:./camunda-h2-database + +camunda.bpm.admin-user: + id: demo + password: demo \ No newline at end of file From b46712fa14670bf52f7da7a849f6b49936143968 Mon Sep 17 00:00:00 2001 From: h_sharifi Date: Sun, 27 Nov 2022 10:50:56 +0330 Subject: [PATCH 048/592] #BAEL-5948:add sample loan process --- .../src/main/resources/loanProcess.bpmn | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 spring-boot-modules/spring-boot-libraries-3/src/main/resources/loanProcess.bpmn diff --git a/spring-boot-modules/spring-boot-libraries-3/src/main/resources/loanProcess.bpmn b/spring-boot-modules/spring-boot-libraries-3/src/main/resources/loanProcess.bpmn new file mode 100644 index 0000000000..c3245e5bfd --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-3/src/main/resources/loanProcess.bpmn @@ -0,0 +1,67 @@ + + + + + SequenceFlow_14bdz4q + + + + SequenceFlow_1s49wir + + + + + SequenceFlow_0d726xt + SequenceFlow_1s49wir + + + SequenceFlow_14bdz4q + SequenceFlow_0d726xt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From b82aabffc051452f0a74fbb560ce81df4413c927 Mon Sep 17 00:00:00 2001 From: Ralf Ueberfuhr <40685729+ueberfuhr@users.noreply.github.com> Date: Sun, 27 Nov 2022 10:58:07 +0100 Subject: [PATCH 049/592] BAEL 5951: Update Spring Boot 3 Version from release candidate to release version (#13091) * Update Spring Boot, Spring Native and Native Maven Plugin versions * BAEL-5951: Spring Boot 3 Sample for Native Image builds incl. Runtime Hints * BAEL-5951: Configure POMs and add Swagger UI runtime hints * BAEL-5951: Remove Swagger UI runtime hints * BAEL-5951: Remove Spring Boot3 parent POM from profiles because of JDK17 dependency during build (building the parent POM is even not necessary) * BAEL-5951: Add tests * BAEL-5951: Fix tests (PMD naming conventions) * BAEL-5951: Update from Spring Boot version 3.0.0-RC1 to 3.0.0 (release) --- parent-boot-3/pom.xml | 26 +------------------ .../spring-boot-3-native/pom.xml | 9 +++---- spring-boot-modules/spring-boot-3/pom.xml | 13 ++++++---- 3 files changed, 13 insertions(+), 35 deletions(-) diff --git a/parent-boot-3/pom.xml b/parent-boot-3/pom.xml index 8f891ec788..44f7d97310 100644 --- a/parent-boot-3/pom.xml +++ b/parent-boot-3/pom.xml @@ -223,29 +223,6 @@ - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - 3.2.0 3.10.1 @@ -253,9 +230,8 @@ 3.3.0 2.22.2 - 3.0.0-M3 + 3.0.0 5.8.2 - 3.0.0-M7 0.9.17 17 ${java.version} diff --git a/spring-boot-modules/spring-boot-3-native/pom.xml b/spring-boot-modules/spring-boot-3-native/pom.xml index 9e664efc02..411e9d652b 100644 --- a/spring-boot-modules/spring-boot-3-native/pom.xml +++ b/spring-boot-modules/spring-boot-3-native/pom.xml @@ -12,7 +12,7 @@ com.baeldung parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-3/pom.xml + ../../parent-boot-3 @@ -23,7 +23,7 @@ org.springdoc springdoc-openapi-starter-webmvc-ui - ${spring-doc.version} + ${springdoc.version} org.springframework.boot @@ -77,10 +77,9 @@ - 3.0.0-RC2 - 2.0.0-RC1 + 2.0.0 + 3.0.0-M7 0.9.17 - com.baeldung.sample.TodoApplication diff --git a/spring-boot-modules/spring-boot-3/pom.xml b/spring-boot-modules/spring-boot-3/pom.xml index a5e9ca903c..2fcb8cd8e1 100644 --- a/spring-boot-modules/spring-boot-3/pom.xml +++ b/spring-boot-modules/spring-boot-3/pom.xml @@ -49,9 +49,11 @@ spring-boot-configuration-processor true - - - + + org.springdoc + springdoc-openapi-starter-webmvc-ui + ${springdoc.version} + org.projectlombok lombok @@ -120,7 +122,8 @@ 1.5.2.Final - com.baeldung.sample.TodoApplication + 2.0.0 + 3.0.0-M7 - \ No newline at end of file + From 790974461ff6039874f9258c5154e883fb06896c Mon Sep 17 00:00:00 2001 From: pedrolopes Date: Sun, 27 Nov 2022 09:08:38 -0300 Subject: [PATCH 050/592] BAEL-5922 User for Optional in Java (#13051) * repositories. model class. initial tests * tests declarative api * removing from module java 11 * copy to optional module * fix assertEquals import --- .../java/com/baeldung/optionaluses/User.java | 21 ++++++ .../optionaluses/UserRepositoryWithNull.java | 20 ++++++ .../UserRepositoryWithOptional.java | 21 ++++++ .../optionaluses/UsesForOptionalUnitTest.java | 64 +++++++++++++++++++ 4 files changed, 126 insertions(+) create mode 100644 core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/User.java create mode 100644 core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/UserRepositoryWithNull.java create mode 100644 core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/UserRepositoryWithOptional.java create mode 100644 core-java-modules/core-java-optional/src/test/java/com/baeldung/optionaluses/UsesForOptionalUnitTest.java diff --git a/core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/User.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/User.java new file mode 100644 index 0000000000..99a8810d5b --- /dev/null +++ b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/User.java @@ -0,0 +1,21 @@ +package com.baeldung.optionaluses; + +public class User { + + public User(String id, String name) { + this.id = id; + this.name = name; + } + + private String id; + + private String name; + + public String getName() { + return name; + } + + public String getId() { + return id; + } +} diff --git a/core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/UserRepositoryWithNull.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/UserRepositoryWithNull.java new file mode 100644 index 0000000000..c41de1b5f5 --- /dev/null +++ b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/UserRepositoryWithNull.java @@ -0,0 +1,20 @@ +package com.baeldung.optionaluses; + +import java.util.Arrays; +import java.util.List; + +public class UserRepositoryWithNull { + + private final List dbUsers = Arrays.asList(new User("1", "John"), new User("2", "Maria"), new User("3", "Daniel")); + + public User findById(String id) { + + for (User u : dbUsers) { + if (u.getId().equals(id)) { + return u; + } + } + + return null; + } +} diff --git a/core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/UserRepositoryWithOptional.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/UserRepositoryWithOptional.java new file mode 100644 index 0000000000..f31e35d85f --- /dev/null +++ b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/UserRepositoryWithOptional.java @@ -0,0 +1,21 @@ +package com.baeldung.optionaluses; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +public class UserRepositoryWithOptional { + + private final List dbUsers = Arrays.asList(new User("1", "John"), new User("2", "Maria"), new User("3", "Daniel")); + + public Optional findById(String id) { + + for (User u : dbUsers) { + if (u.getId().equals(id)) { + return Optional.of(u); + } + } + + return Optional.empty(); + } +} diff --git a/core-java-modules/core-java-optional/src/test/java/com/baeldung/optionaluses/UsesForOptionalUnitTest.java b/core-java-modules/core-java-optional/src/test/java/com/baeldung/optionaluses/UsesForOptionalUnitTest.java new file mode 100644 index 0000000000..d0f92be097 --- /dev/null +++ b/core-java-modules/core-java-optional/src/test/java/com/baeldung/optionaluses/UsesForOptionalUnitTest.java @@ -0,0 +1,64 @@ +package com.baeldung.optionaluses; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class UsesForOptionalUnitTest { + + @Test + public void givenNonExistentUserId_whenSearchForUser_andNoNullCheck_thenThrowException() { + + UserRepositoryWithNull userRepositoryWithNull = new UserRepositoryWithNull(); + String nonExistentUserId = "4"; + + assertThrows(NullPointerException.class, () -> { + System.out.println("User name: " + userRepositoryWithNull.findById(nonExistentUserId) + .getName()); + }); + } + + @Test + public void givenNonExistentUserId_whenSearchForUser_thenOptionalShouldBeTreatedProperly() { + + UserRepositoryWithOptional userRepositoryWithOptional = new UserRepositoryWithOptional(); + String nonExistentUserId = "4"; + + String userName = userRepositoryWithOptional.findById(nonExistentUserId) + .orElse(new User("0", "admin")) + .getName(); + + assertEquals("admin", userName); + } + + @Test + public void givenExistentUserId_whenFoundUserWithNameStartingWithMInRepositoryUsingNull_thenNameShouldBeUpperCased() { + + UserRepositoryWithNull userRepositoryWithNull = new UserRepositoryWithNull(); + + User user = userRepositoryWithNull.findById("2"); + String upperCasedName = ""; + + if (user != null) { + if (user.getName().startsWith("M")) { + upperCasedName = user.getName().toUpperCase(); + } + } + + assertEquals("MARIA", upperCasedName); + } + + @Test + public void givenExistentUserId_whenFoundUserWithNameStartingWithMInRepositoryUsingOptional_thenNameShouldBeUpperCased() { + + UserRepositoryWithOptional userRepositoryWithOptional = new UserRepositoryWithOptional(); + + String upperCasedName = userRepositoryWithOptional.findById("2") + .filter(u -> u.getName().startsWith("M")) + .map(u -> u.getName().toUpperCase()) + .orElse(""); + + assertEquals("MARIA", upperCasedName); + } +} From f191427bead5042c28083ecb677bc46a9a0ca352 Mon Sep 17 00:00:00 2001 From: Olu <56642018+olu-damilare@users.noreply.github.com> Date: Sun, 27 Nov 2022 13:46:22 +0100 Subject: [PATCH 051/592] Convert between LocalDateTime and ZonedDateTime - BAEL-5879 (#13057) * Creating a Deep vs Shallow Copy of an Object in Java * completed tests for LinkedHashSet * update * updated PR * swapped the order of arguments for assertEquals() * completed code for Convert between LocalDateTime and ZonedDateTime * fixed module name * update * update * added more assertions * update * added more example * update * jenkin build error fix * jenkin build error fix * jenkins build fix * fixed suggested comments * update * update --- .../LocalDateTimeToZonedDateTimeUnitTest.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/localdatetimetozoneddatetime/LocalDateTimeToZonedDateTimeUnitTest.java diff --git a/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/localdatetimetozoneddatetime/LocalDateTimeToZonedDateTimeUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/localdatetimetozoneddatetime/LocalDateTimeToZonedDateTimeUnitTest.java new file mode 100644 index 0000000000..10a2e75372 --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/localdatetimetozoneddatetime/LocalDateTimeToZonedDateTimeUnitTest.java @@ -0,0 +1,89 @@ +import org.junit.jupiter.api.Test; + +import java.time.*; + +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + + +public class LocalDateTimeToZonedDateTimeUnitTest { + + @Test + void whenConvertLocalDateTimeToZonedDateTimeWithAtZoneMethod_shouldConvertAndMaintainDateTimeValues(){ + LocalDateTime localDateTime = LocalDateTime.of(2022, 1, 1, 0, 30, 22); + ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Canada/Atlantic")); + + assertEquals(localDateTime.getYear(), zonedDateTime.getYear()); + assertEquals(localDateTime.getMonth(), zonedDateTime.getMonth()); + assertEquals(localDateTime.getDayOfMonth(), zonedDateTime.getDayOfMonth()); + assertEquals(localDateTime.getHour(), zonedDateTime.getHour()); + assertEquals(localDateTime.getMinute(), zonedDateTime.getMinute()); + assertEquals(localDateTime.getSecond(), zonedDateTime.getSecond()); + } + + @Test + void whenConvertLocalDateTimeToZonedDateTimeWithAtZoneAndwithZoneSameInstantMethods_shouldConvert(){ + LocalDateTime localDateTime = LocalDateTime.of(2022, 1, 1, 0, 30, 22); + ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Africa/Lagos")).withZoneSameInstant(ZoneId.of("Canada/Atlantic")); + + assertEquals("2021-12-31T19:30:22-04:00[Canada/Atlantic]", zonedDateTime.toString()); + assertEquals("-04:00", zonedDateTime.getOffset().toString()); + } + + @Test + void whenConvertLocalDateTimeToZonedDateTimeWithOfMethod_shouldConvert(){ + LocalDateTime localDateTime = LocalDateTime.of(2022, 11, 5, 7, 30, 22); + ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("Africa/Accra")).withZoneSameInstant(ZoneId.of("Africa/Lagos")); + + assertEquals("2022-11-05T08:30:22+01:00[Africa/Lagos]", zonedDateTime.toString()); + assertEquals(localDateTime.getYear(), zonedDateTime.getYear()); + } + + @Test + void whenConvertLocalDateTimeToZonedDateTimeWithOfInstantMethod_shouldConvert(){ + LocalDateTime localDateTime = LocalDateTime.of(2022, 1, 5, 17, 30, 22); + ZoneId zoneId = ZoneId.of("Africa/Lagos"); + ZoneOffset zoneOffset = zoneId.getRules().getOffset(localDateTime); + ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(localDateTime, zoneOffset, zoneId); + + assertEquals("2022-01-05T17:30:22+01:00[Africa/Lagos]", zonedDateTime.toString()); + } + + @Test + void whenConvertLocalDateTimeToZonedDateTimeWithOfLocalMethod_shouldConvert(){ + LocalDateTime localDateTime = LocalDateTime.of(2022, 8, 25, 8, 35, 22); + ZoneId zoneId = ZoneId.of("Africa/Lagos"); + ZoneOffset zoneOffset = zoneId.getRules().getOffset(localDateTime); + ZonedDateTime zonedDateTime = ZonedDateTime.ofLocal(localDateTime, zoneId, zoneOffset); + + assertEquals("2022-08-25T08:35:22+01:00[Africa/Lagos]", zonedDateTime.toString()); + } + + @Test + void whenConvertLocalDateTimeToZonedDateTimeWithOfStrictMethod_shouldConvert(){ + LocalDateTime localDateTime = LocalDateTime.of(2002, 12, 25, 6, 18, 2); + ZoneId zoneId = ZoneId.of("Asia/Tokyo"); + ZoneOffset zoneOffset = zoneId.getRules().getOffset(localDateTime); + ZonedDateTime zonedDateTime = ZonedDateTime.ofStrict(localDateTime, zoneOffset, zoneId); + + assertEquals("2002-12-25T06:18:02+09:00[Asia/Tokyo]", zonedDateTime.toString()); + } + + @Test + void whenConvertLocalDateTimeToZonedDateTimeWithInvalidZoneOffSet_shouldThrowDateTimeException(){ + LocalDateTime localDateTime = LocalDateTime.of(2022, 12, 25, 6, 18, 2);; + ZoneId zoneId = ZoneId.of("Asia/Tokyo"); + ZoneOffset zoneOffset = ZoneOffset.UTC; + assertThrows(DateTimeException.class, () -> ZonedDateTime.ofStrict(localDateTime, zoneOffset, zoneId)); + } + + + @Test + void whenConvertZonedDateTimeToLocalDateTimeWithToLocalDateTimeMethod_shouldConvert(){ + ZonedDateTime zonedDateTime = ZonedDateTime.of(2011, 2, 12, 6, 14, 1, 58086000, ZoneId.of("Asia/Tokyo")); + LocalDateTime localDateTime = zonedDateTime.toLocalDateTime(); + + assertEquals("2011-02-12T06:14:01.058086+09:00[Asia/Tokyo]", zonedDateTime.toString()); + } +} \ No newline at end of file From 30eccf2ae85eb3ed6f59f37a9bb7ccc5d5b3ecd7 Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Sun, 27 Nov 2022 15:50:55 +0100 Subject: [PATCH 052/592] BAEL-5978: Case Insensitive Enum Mapping in Spring Boot (#13061) * BAEL-5978: Case Insensitive Enum Mapping in Spring Boot * Move code to a new module: spring-boot-request-params --- .../spring-boot-request-params/README.md | 5 ++ .../spring-boot-request-params/pom.xml | 28 ++++++++++ .../EnumMappingMainApplication.java | 13 +++++ .../enummapping/config/EnumMappingConfig.java | 17 ++++++ .../controllers/EnumMappingController.java | 30 +++++++++++ .../converters/StringToLevelConverter.java | 19 +++++++ .../enummapping/editors/LevelEditor.java | 22 ++++++++ .../com/baeldung/enummapping/enums/Level.java | 7 +++ .../EnumMappingIntegrationTest.java | 52 +++++++++++++++++++ ...StringToLevelConverterIntegrationTest.java | 37 +++++++++++++ .../editors/LevelEditorIntegrationTest.java | 34 ++++++++++++ 11 files changed, 264 insertions(+) create mode 100644 spring-boot-modules/spring-boot-request-params/README.md create mode 100644 spring-boot-modules/spring-boot-request-params/pom.xml create mode 100644 spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/EnumMappingMainApplication.java create mode 100644 spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/config/EnumMappingConfig.java create mode 100644 spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/controllers/EnumMappingController.java create mode 100644 spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/converters/StringToLevelConverter.java create mode 100644 spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/editors/LevelEditor.java create mode 100644 spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/enums/Level.java create mode 100644 spring-boot-modules/spring-boot-request-params/src/test/java/com/baeldung/enummapping/EnumMappingIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-request-params/src/test/java/com/baeldung/enummapping/converters/StringToLevelConverterIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-request-params/src/test/java/com/baeldung/enummapping/editors/LevelEditorIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-request-params/README.md b/spring-boot-modules/spring-boot-request-params/README.md new file mode 100644 index 0000000000..f3ced26455 --- /dev/null +++ b/spring-boot-modules/spring-boot-request-params/README.md @@ -0,0 +1,5 @@ +## Spring Boot Request Params + +This module contains articles about Spring Boot Request Params + +### Relevant Articles: diff --git a/spring-boot-modules/spring-boot-request-params/pom.xml b/spring-boot-modules/spring-boot-request-params/pom.xml new file mode 100644 index 0000000000..526938860a --- /dev/null +++ b/spring-boot-modules/spring-boot-request-params/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + spring-boot-request-params + spring-boot-request-params + jar + Module For Spring Boot Request Params + + + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/EnumMappingMainApplication.java b/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/EnumMappingMainApplication.java new file mode 100644 index 0000000000..43145f13ad --- /dev/null +++ b/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/EnumMappingMainApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.enummapping; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class EnumMappingMainApplication { + + public static void main(String[] args) { + SpringApplication.run(EnumMappingMainApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/config/EnumMappingConfig.java b/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/config/EnumMappingConfig.java new file mode 100644 index 0000000000..8078a3cb47 --- /dev/null +++ b/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/config/EnumMappingConfig.java @@ -0,0 +1,17 @@ +package com.baeldung.enummapping.config; + +import org.springframework.boot.convert.ApplicationConversionService; +import org.springframework.context.annotation.Configuration; +import org.springframework.format.FormatterRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import com.baeldung.enummapping.converters.StringToLevelConverter; + +@Configuration +public class EnumMappingConfig implements WebMvcConfigurer { + @Override + public void addFormatters(FormatterRegistry registry) { + ApplicationConversionService.configure(registry); + registry.addConverter(new StringToLevelConverter()); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/controllers/EnumMappingController.java b/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/controllers/EnumMappingController.java new file mode 100644 index 0000000000..d006b8f149 --- /dev/null +++ b/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/controllers/EnumMappingController.java @@ -0,0 +1,30 @@ +package com.baeldung.enummapping.controllers; + +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.enummapping.editors.LevelEditor; +import com.baeldung.enummapping.enums.Level; + +@RestController +@RequestMapping("enummapping") +public class EnumMappingController { + + @InitBinder + public void initBinder(WebDataBinder dataBinder) { + dataBinder.registerCustomEditor(Level.class, new LevelEditor()); + } + + @GetMapping("/get") + public String getByLevel(@RequestParam(required = false) Level level) { + if (level != null) { + return level.name(); + } + return "undefined"; + } + +} diff --git a/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/converters/StringToLevelConverter.java b/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/converters/StringToLevelConverter.java new file mode 100644 index 0000000000..8adee1c4e5 --- /dev/null +++ b/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/converters/StringToLevelConverter.java @@ -0,0 +1,19 @@ +package com.baeldung.enummapping.converters; + +import org.apache.commons.lang3.EnumUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.core.convert.converter.Converter; + +import com.baeldung.enummapping.enums.Level; + +public class StringToLevelConverter implements Converter { + + @Override + public Level convert(String source) { + if (StringUtils.isBlank(source)) { + return null; + } + return EnumUtils.getEnum(Level.class, source.toUpperCase()); + } + +} diff --git a/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/editors/LevelEditor.java b/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/editors/LevelEditor.java new file mode 100644 index 0000000000..d4f8e96ad8 --- /dev/null +++ b/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/editors/LevelEditor.java @@ -0,0 +1,22 @@ +package com.baeldung.enummapping.editors; + +import java.beans.PropertyEditorSupport; + +import org.apache.commons.lang3.EnumUtils; +import org.apache.commons.lang3.StringUtils; + +import com.baeldung.enummapping.enums.Level; + +public class LevelEditor extends PropertyEditorSupport { + + @Override + public void setAsText(String text) { + if (StringUtils.isBlank(text)) { + setValue(null); + } else { + setValue(EnumUtils.getEnum(Level.class, text.toUpperCase())); + } + + } + +} diff --git a/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/enums/Level.java b/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/enums/Level.java new file mode 100644 index 0000000000..471e9c2f5c --- /dev/null +++ b/spring-boot-modules/spring-boot-request-params/src/main/java/com/baeldung/enummapping/enums/Level.java @@ -0,0 +1,7 @@ +package com.baeldung.enummapping.enums; + +public enum Level { + + LOW, MEDIUM, HIGH + +} diff --git a/spring-boot-modules/spring-boot-request-params/src/test/java/com/baeldung/enummapping/EnumMappingIntegrationTest.java b/spring-boot-modules/spring-boot-request-params/src/test/java/com/baeldung/enummapping/EnumMappingIntegrationTest.java new file mode 100644 index 0000000000..0fd1ce72d7 --- /dev/null +++ b/spring-boot-modules/spring-boot-request-params/src/test/java/com/baeldung/enummapping/EnumMappingIntegrationTest.java @@ -0,0 +1,52 @@ +package com.baeldung.enummapping; + +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.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; + +import com.baeldung.enummapping.controllers.EnumMappingController; +import com.baeldung.enummapping.enums.Level; + +@RunWith(SpringRunner.class) +@WebMvcTest(EnumMappingController.class) +public class EnumMappingIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @Test + public void whenPassingLowerCaseEnumConstant_thenConvert() throws Exception { + mockMvc.perform(get("/enummapping/get?level=medium")) + .andExpect(status().isOk()) + .andExpect(content().string(Level.MEDIUM.name())); + } + + @Test + public void whenPassingUnknownEnumConstant_thenReturnUndefined() throws Exception { + mockMvc.perform(get("/enummapping/get?level=unknown")) + .andExpect(status().isOk()) + .andExpect(content().string("undefined")); + } + + @Test + public void whenPassingEmptyParameter_thenReturnUndefined() throws Exception { + mockMvc.perform(get("/enummapping/get?level=")) + .andExpect(status().isOk()) + .andExpect(content().string("undefined")); + } + + @Test + public void whenPassingNoParameter_thenReturnUndefined() throws Exception { + mockMvc.perform(get("/enummapping/get")) + .andExpect(status().isOk()) + .andExpect(content().string("undefined")); + } + +} diff --git a/spring-boot-modules/spring-boot-request-params/src/test/java/com/baeldung/enummapping/converters/StringToLevelConverterIntegrationTest.java b/spring-boot-modules/spring-boot-request-params/src/test/java/com/baeldung/enummapping/converters/StringToLevelConverterIntegrationTest.java new file mode 100644 index 0000000000..100f742f40 --- /dev/null +++ b/spring-boot-modules/spring-boot-request-params/src/test/java/com/baeldung/enummapping/converters/StringToLevelConverterIntegrationTest.java @@ -0,0 +1,37 @@ +package com.baeldung.enummapping.converters; + +import static org.assertj.core.api.Assertions.assertThat; + +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.core.convert.ConversionService; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.enummapping.EnumMappingMainApplication; +import com.baeldung.enummapping.enums.Level; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = EnumMappingMainApplication.class) +public class StringToLevelConverterIntegrationTest { + + @Autowired + ConversionService conversionService; + + @Test + public void whenConvertStringToLevelEnumUsingCustomConverter_thenSuccess() { + assertThat(conversionService.convert("low", Level.class)).isEqualTo(Level.LOW); + } + + @Test + public void whenStringIsEmpty_thenReturnNull() { + assertThat(conversionService.convert("", Level.class)).isNull(); + } + + @Test + public void whenStringIsNull_thenReturnNull() { + assertThat(conversionService.convert(null, Level.class)).isNull(); + } + +} diff --git a/spring-boot-modules/spring-boot-request-params/src/test/java/com/baeldung/enummapping/editors/LevelEditorIntegrationTest.java b/spring-boot-modules/spring-boot-request-params/src/test/java/com/baeldung/enummapping/editors/LevelEditorIntegrationTest.java new file mode 100644 index 0000000000..ab01cbc1ed --- /dev/null +++ b/spring-boot-modules/spring-boot-request-params/src/test/java/com/baeldung/enummapping/editors/LevelEditorIntegrationTest.java @@ -0,0 +1,34 @@ +package com.baeldung.enummapping.editors; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +import com.baeldung.enummapping.enums.Level; + +public class LevelEditorIntegrationTest { + + private final LevelEditor levelEditor = new LevelEditor(); + + @Test + public void whenConvertStringToLevelEnumUsingCustomPropertyEditor_thenSuccess() { + levelEditor.setAsText("lOw"); + + assertThat(levelEditor.getValue()).isEqualTo(Level.LOW); + } + + @Test + public void whenStringIsEmpty_thenReturnNull() { + levelEditor.setAsText(""); + + assertThat(levelEditor.getValue()).isNull(); + } + + @Test + public void whenStringIsNull_thenReturnNull() { + levelEditor.setAsText(null); + + assertThat(levelEditor.getValue()).isNull(); + } + +} From d54d4768c0f6f9047e0e3176f81846e96c3dbdb7 Mon Sep 17 00:00:00 2001 From: Gerard Klijs Date: Sun, 27 Nov 2022 18:00:47 +0100 Subject: [PATCH 053/592] BAEL-5855 Persisting the Query Model (#12976) * BAEL-5855 Persisting the Query Model * BAEL-5855 Persisting the Query Model, apply baeldung code style. --- axon/README.md | 9 +- axon/pom.xml | 19 +- .../com/baeldung/axon/OrderApplication.java | 1 - .../axon/OrderApplicationConfiguration.java | 3 +- .../commandmodel/order/OrderAggregate.java | 1 + .../axon/commandmodel/order/OrderLine.java | 1 + .../coreapi/commands/AddProductCommand.java | 5 +- .../coreapi/commands/ConfirmOrderCommand.java | 4 +- .../coreapi/commands/CreateOrderCommand.java | 4 +- .../DecrementProductCountCommand.java | 5 +- .../IncrementProductCountCommand.java | 5 +- .../coreapi/commands/ShipOrderCommand.java | 4 +- .../coreapi/events/OrderConfirmedEvent.java | 4 +- .../coreapi/events/OrderCreatedEvent.java | 4 +- .../coreapi/events/OrderShippedEvent.java | 4 +- .../coreapi/events/ProductAddedEvent.java | 5 +- .../events/ProductCountDecrementedEvent.java | 5 +- .../events/ProductCountIncrementedEvent.java | 5 +- .../coreapi/events/ProductRemovedEvent.java | 5 +- .../baeldung/axon/coreapi/queries/Order.java | 11 +- .../coreapi/queries/OrderUpdatesQuery.java | 4 +- .../queries/TotalProductsShippedQuery.java | 4 +- .../baeldung/axon/gui/OrderRestEndpoint.java | 32 +-- .../InMemoryOrdersEventHandler.java | 6 +- .../axon/querymodel/MongoConfiguration.java | 26 +++ .../querymodel/MongoOrdersEventHandler.java | 194 ++++++++++++++++++ .../axon/querymodel/OrderQueryService.java | 6 +- .../axon/querymodel/OrderStatusResponse.java | 3 +- .../axon/querymodel/OrdersEventHandler.java | 1 + .../resources/application-mongo.properties | 6 + .../commandmodel/OrderAggregateUnitTest.java | 79 ++++--- .../AbstractOrdersEventHandlerUnitTest.java | 52 +++-- .../MongoOrdersEventHandlerUnitTest.java | 20 ++ .../OrderQueryServiceIntegrationTest.java | 7 +- .../src/test/resources/application.properties | 1 + axon/start_mongo.sh | 7 + 36 files changed, 405 insertions(+), 147 deletions(-) create mode 100644 axon/src/main/java/com/baeldung/axon/querymodel/MongoConfiguration.java create mode 100644 axon/src/main/java/com/baeldung/axon/querymodel/MongoOrdersEventHandler.java create mode 100644 axon/src/main/resources/application-mongo.properties create mode 100644 axon/src/test/java/com/baeldung/axon/querymodel/MongoOrdersEventHandlerUnitTest.java create mode 100755 axon/start_mongo.sh diff --git a/axon/README.md b/axon/README.md index 40547a68b8..5db38a7c94 100644 --- a/axon/README.md +++ b/axon/README.md @@ -2,11 +2,17 @@ This module contains articles about Axon +## Profiles + +Optionally the code can be run with the 'mongo' profile to use Mongo to store the projection. Otherwise, an in-memory +projection is used. + ## Scripts -One script is included to easily start middleware using Docker: +Two scripts are included to easily start middleware using Docker matching the properties files: - `start_axon_server.sh` to start an Axon Server instance +- `start_mongo.sh` to start a MongoDB instance ### Relevant articles @@ -14,3 +20,4 @@ One script is included to easily start middleware using Docker: - [Multi-Entity Aggregates in Axon](https://www.baeldung.com/java-axon-multi-entity-aggregates) - [Snapshotting Aggregates in Axon](https://www.baeldung.com/axon-snapshotting-aggregates) - [Dispatching Queries in Axon Framework](https://www.baeldung.com/axon-query-dispatching) +- [Persisting the Query Model](https://www.baeldung.com/persisting-the-query-model) diff --git a/axon/pom.xml b/axon/pom.xml index df14233863..cfdd24ff3c 100644 --- a/axon/pom.xml +++ b/axon/pom.xml @@ -44,6 +44,10 @@ org.springframework.boot spring-boot-starter-data-jpa + + org.axonframework.extensions.mongo + axon-mongo + io.projectreactor reactor-core @@ -68,10 +72,23 @@ reactor-test test + + de.flapdoodle.embed + de.flapdoodle.embed.mongo + ${de.flapdoodle.embed.mongo.version} + test + + + org.awaitility + awaitility + 4.2.0 + test + - 4.6.0 + 4.6.2 + 3.4.8 \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/OrderApplication.java b/axon/src/main/java/com/baeldung/axon/OrderApplication.java index 8f507e141c..9e5334c3a3 100644 --- a/axon/src/main/java/com/baeldung/axon/OrderApplication.java +++ b/axon/src/main/java/com/baeldung/axon/OrderApplication.java @@ -9,5 +9,4 @@ public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } - } \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/OrderApplicationConfiguration.java b/axon/src/main/java/com/baeldung/axon/OrderApplicationConfiguration.java index 8b743144b4..e1b7d5b14c 100644 --- a/axon/src/main/java/com/baeldung/axon/OrderApplicationConfiguration.java +++ b/axon/src/main/java/com/baeldung/axon/OrderApplicationConfiguration.java @@ -11,8 +11,7 @@ import org.springframework.context.annotation.Configuration; public class OrderApplicationConfiguration { @Bean - public SnapshotTriggerDefinition orderAggregateSnapshotTriggerDefinition(Snapshotter snapshotter, - @Value("${axon.aggregate.order.snapshot-threshold:250}") int threshold) { + public SnapshotTriggerDefinition orderAggregateSnapshotTriggerDefinition(Snapshotter snapshotter, @Value("${axon.aggregate.order.snapshot-threshold:250}") int threshold) { return new EventCountSnapshotTriggerDefinition(snapshotter, threshold); } } diff --git a/axon/src/main/java/com/baeldung/axon/commandmodel/order/OrderAggregate.java b/axon/src/main/java/com/baeldung/axon/commandmodel/order/OrderAggregate.java index 1065e9d22b..c58c0b27ac 100644 --- a/axon/src/main/java/com/baeldung/axon/commandmodel/order/OrderAggregate.java +++ b/axon/src/main/java/com/baeldung/axon/commandmodel/order/OrderAggregate.java @@ -12,6 +12,7 @@ import com.baeldung.axon.coreapi.events.ProductRemovedEvent; import com.baeldung.axon.coreapi.exceptions.DuplicateOrderLineException; import com.baeldung.axon.coreapi.exceptions.OrderAlreadyConfirmedException; import com.baeldung.axon.coreapi.exceptions.UnconfirmedOrderException; + import org.axonframework.commandhandling.CommandHandler; import org.axonframework.eventsourcing.EventSourcingHandler; import org.axonframework.modelling.command.AggregateIdentifier; diff --git a/axon/src/main/java/com/baeldung/axon/commandmodel/order/OrderLine.java b/axon/src/main/java/com/baeldung/axon/commandmodel/order/OrderLine.java index e471ecbfe0..aa774070c0 100644 --- a/axon/src/main/java/com/baeldung/axon/commandmodel/order/OrderLine.java +++ b/axon/src/main/java/com/baeldung/axon/commandmodel/order/OrderLine.java @@ -7,6 +7,7 @@ import com.baeldung.axon.coreapi.events.ProductCountDecrementedEvent; import com.baeldung.axon.coreapi.events.ProductCountIncrementedEvent; import com.baeldung.axon.coreapi.events.ProductRemovedEvent; import com.baeldung.axon.coreapi.exceptions.OrderAlreadyConfirmedException; + import org.axonframework.commandhandling.CommandHandler; import org.axonframework.eventsourcing.EventSourcingHandler; import org.axonframework.modelling.command.EntityId; diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/AddProductCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/AddProductCommand.java index 28736aaadc..8f2babc2dc 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/commands/AddProductCommand.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/AddProductCommand.java @@ -42,9 +42,6 @@ public class AddProductCommand { @Override public String toString() { - return "AddProductCommand{" + - "orderId='" + orderId + '\'' + - ", productId='" + productId + '\'' + - '}'; + return "AddProductCommand{" + "orderId='" + orderId + '\'' + ", productId='" + productId + '\'' + '}'; } } diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java index 244b69f3b7..37f1df2725 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java @@ -36,8 +36,6 @@ public class ConfirmOrderCommand { @Override public String toString() { - return "ConfirmOrderCommand{" + - "orderId='" + orderId + '\'' + - '}'; + return "ConfirmOrderCommand{" + "orderId='" + orderId + '\'' + '}'; } } diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/CreateOrderCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/CreateOrderCommand.java index ceb7fd6a08..294d53cab8 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/commands/CreateOrderCommand.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/CreateOrderCommand.java @@ -36,8 +36,6 @@ public class CreateOrderCommand { @Override public String toString() { - return "CreateOrderCommand{" + - "orderId='" + orderId + '\'' + - '}'; + return "CreateOrderCommand{" + "orderId='" + orderId + '\'' + '}'; } } \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/DecrementProductCountCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/DecrementProductCountCommand.java index f6f4db00fc..0874f88df8 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/commands/DecrementProductCountCommand.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/DecrementProductCountCommand.java @@ -42,9 +42,6 @@ public class DecrementProductCountCommand { @Override public String toString() { - return "DecrementProductCountCommand{" + - "orderId='" + orderId + '\'' + - ", productId='" + productId + '\'' + - '}'; + return "DecrementProductCountCommand{" + "orderId='" + orderId + '\'' + ", productId='" + productId + '\'' + '}'; } } diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/IncrementProductCountCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/IncrementProductCountCommand.java index 548faabe37..aceb93e478 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/commands/IncrementProductCountCommand.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/IncrementProductCountCommand.java @@ -42,9 +42,6 @@ public class IncrementProductCountCommand { @Override public String toString() { - return "IncrementProductCountCommand{" + - "orderId='" + orderId + '\'' + - ", productId='" + productId + '\'' + - '}'; + return "IncrementProductCountCommand{" + "orderId='" + orderId + '\'' + ", productId='" + productId + '\'' + '}'; } } diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java index 7312bc1fdb..f0f3a6e071 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java @@ -36,8 +36,6 @@ public class ShipOrderCommand { @Override public String toString() { - return "ShipOrderCommand{" + - "orderId='" + orderId + '\'' + - '}'; + return "ShipOrderCommand{" + "orderId='" + orderId + '\'' + '}'; } } \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java index d2b7d58435..3253c2f1d5 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java @@ -33,8 +33,6 @@ public class OrderConfirmedEvent { @Override public String toString() { - return "OrderConfirmedEvent{" + - "orderId='" + orderId + '\'' + - '}'; + return "OrderConfirmedEvent{" + "orderId='" + orderId + '\'' + '}'; } } diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderCreatedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderCreatedEvent.java index 5d2d8b7f55..2bb86108f9 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderCreatedEvent.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderCreatedEvent.java @@ -33,8 +33,6 @@ public class OrderCreatedEvent { @Override public String toString() { - return "OrderCreatedEvent{" + - "orderId='" + orderId + '\'' + - '}'; + return "OrderCreatedEvent{" + "orderId='" + orderId + '\'' + '}'; } } \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java index 76aa684629..5161bc7bf1 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java @@ -33,8 +33,6 @@ public class OrderShippedEvent { @Override public String toString() { - return "OrderShippedEvent{" + - "orderId='" + orderId + '\'' + - '}'; + return "OrderShippedEvent{" + "orderId='" + orderId + '\'' + '}'; } } \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductAddedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductAddedEvent.java index 091ef2a570..14510cb161 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductAddedEvent.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductAddedEvent.java @@ -39,9 +39,6 @@ public class ProductAddedEvent { @Override public String toString() { - return "ProductAddedEvent{" + - "orderId='" + orderId + '\'' + - ", productId='" + productId + '\'' + - '}'; + return "ProductAddedEvent{" + "orderId='" + orderId + '\'' + ", productId='" + productId + '\'' + '}'; } } diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductCountDecrementedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductCountDecrementedEvent.java index 4017916791..eec424cb24 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductCountDecrementedEvent.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductCountDecrementedEvent.java @@ -39,9 +39,6 @@ public class ProductCountDecrementedEvent { @Override public String toString() { - return "ProductCountDecrementedEvent{" + - "orderId='" + orderId + '\'' + - ", productId='" + productId + '\'' + - '}'; + return "ProductCountDecrementedEvent{" + "orderId='" + orderId + '\'' + ", productId='" + productId + '\'' + '}'; } } diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductCountIncrementedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductCountIncrementedEvent.java index 2910a9ea6f..0d008758c7 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductCountIncrementedEvent.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductCountIncrementedEvent.java @@ -39,9 +39,6 @@ public class ProductCountIncrementedEvent { @Override public String toString() { - return "ProductCountIncrementedEvent{" + - "orderId='" + orderId + '\'' + - ", productId='" + productId + '\'' + - '}'; + return "ProductCountIncrementedEvent{" + "orderId='" + orderId + '\'' + ", productId='" + productId + '\'' + '}'; } } diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductRemovedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductRemovedEvent.java index 7f89ccd1cc..13ff77db26 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductRemovedEvent.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductRemovedEvent.java @@ -39,9 +39,6 @@ public class ProductRemovedEvent { @Override public String toString() { - return "ProductRemovedEvent{" + - "orderId='" + orderId + '\'' + - ", productId='" + productId + '\'' + - '}'; + return "ProductRemovedEvent{" + "orderId='" + orderId + '\'' + ", productId='" + productId + '\'' + '}'; } } diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/queries/Order.java b/axon/src/main/java/com/baeldung/axon/coreapi/queries/Order.java index 1810a053d3..9cef3e84ee 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/queries/Order.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/queries/Order.java @@ -40,7 +40,6 @@ public class Order { products.computeIfPresent(productId, (id, count) -> --count); } - public void removeProduct(String productId) { products.remove(productId); } @@ -62,9 +61,7 @@ public class Order { return false; } Order that = (Order) o; - return Objects.equals(orderId, that.orderId) - && Objects.equals(products, that.products) - && orderStatus == that.orderStatus; + return Objects.equals(orderId, that.orderId) && Objects.equals(products, that.products) && orderStatus == that.orderStatus; } @Override @@ -74,10 +71,6 @@ public class Order { @Override public String toString() { - return "Order{" + - "orderId='" + orderId + '\'' + - ", products=" + products + - ", orderStatus=" + orderStatus + - '}'; + return "Order{" + "orderId='" + orderId + '\'' + ", products=" + products + ", orderStatus=" + orderStatus + '}'; } } diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderUpdatesQuery.java b/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderUpdatesQuery.java index 37d2e67445..b4e66289b4 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderUpdatesQuery.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderUpdatesQuery.java @@ -32,8 +32,6 @@ public class OrderUpdatesQuery { @Override public String toString() { - return "OrderUpdatesQuery{" + - "orderId='" + orderId + '\'' + - '}'; + return "OrderUpdatesQuery{" + "orderId='" + orderId + '\'' + '}'; } } diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/queries/TotalProductsShippedQuery.java b/axon/src/main/java/com/baeldung/axon/coreapi/queries/TotalProductsShippedQuery.java index 3a4129685b..8c3bbf3528 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/queries/TotalProductsShippedQuery.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/queries/TotalProductsShippedQuery.java @@ -32,8 +32,6 @@ public class TotalProductsShippedQuery { @Override public String toString() { - return "TotalProductsShippedQuery{" + - "productId='" + productId + '\'' + - '}'; + return "TotalProductsShippedQuery{" + "productId='" + productId + '\'' + '}'; } } diff --git a/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java b/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java index 64058d5eca..186aab3c0c 100644 --- a/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java +++ b/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java @@ -8,12 +8,14 @@ import com.baeldung.axon.coreapi.commands.IncrementProductCountCommand; import com.baeldung.axon.coreapi.commands.ShipOrderCommand; import com.baeldung.axon.querymodel.OrderQueryService; import com.baeldung.axon.querymodel.OrderResponse; + import org.axonframework.commandhandling.gateway.CommandGateway; import org.springframework.http.MediaType; 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.RestController; + import reactor.core.publisher.Flux; import java.util.List; @@ -33,25 +35,28 @@ public class OrderRestEndpoint { @PostMapping("/ship-order") public CompletableFuture shipOrder() { - String orderId = UUID.randomUUID().toString(); + String orderId = UUID.randomUUID() + .toString(); return commandGateway.send(new CreateOrderCommand(orderId)) - .thenCompose(result -> commandGateway.send(new AddProductCommand(orderId, "Deluxe Chair"))) - .thenCompose(result -> commandGateway.send(new ConfirmOrderCommand(orderId))) - .thenCompose(result -> commandGateway.send(new ShipOrderCommand(orderId))); + .thenCompose(result -> commandGateway.send(new AddProductCommand(orderId, "Deluxe Chair"))) + .thenCompose(result -> commandGateway.send(new ConfirmOrderCommand(orderId))) + .thenCompose(result -> commandGateway.send(new ShipOrderCommand(orderId))); } @PostMapping("/ship-unconfirmed-order") public CompletableFuture shipUnconfirmedOrder() { - String orderId = UUID.randomUUID().toString(); + String orderId = UUID.randomUUID() + .toString(); return commandGateway.send(new CreateOrderCommand(orderId)) - .thenCompose(result -> commandGateway.send(new AddProductCommand(orderId, "Deluxe Chair"))) - // This throws an exception, as an Order cannot be shipped if it has not been confirmed yet. - .thenCompose(result -> commandGateway.send(new ShipOrderCommand(orderId))); + .thenCompose(result -> commandGateway.send(new AddProductCommand(orderId, "Deluxe Chair"))) + // This throws an exception, as an Order cannot be shipped if it has not been confirmed yet. + .thenCompose(result -> commandGateway.send(new ShipOrderCommand(orderId))); } @PostMapping("/order") public CompletableFuture createOrder() { - return createOrder(UUID.randomUUID().toString()); + return createOrder(UUID.randomUUID() + .toString()); } @PostMapping("/order/{order-id}") @@ -60,20 +65,17 @@ public class OrderRestEndpoint { } @PostMapping("/order/{order-id}/product/{product-id}") - public CompletableFuture addProduct(@PathVariable("order-id") String orderId, - @PathVariable("product-id") String productId) { + public CompletableFuture addProduct(@PathVariable("order-id") String orderId, @PathVariable("product-id") String productId) { return commandGateway.send(new AddProductCommand(orderId, productId)); } @PostMapping("/order/{order-id}/product/{product-id}/increment") - public CompletableFuture incrementProduct(@PathVariable("order-id") String orderId, - @PathVariable("product-id") String productId) { + public CompletableFuture incrementProduct(@PathVariable("order-id") String orderId, @PathVariable("product-id") String productId) { return commandGateway.send(new IncrementProductCountCommand(orderId, productId)); } @PostMapping("/order/{order-id}/product/{product-id}/decrement") - public CompletableFuture decrementProduct(@PathVariable("order-id") String orderId, - @PathVariable("product-id") String productId) { + public CompletableFuture decrementProduct(@PathVariable("order-id") String orderId, @PathVariable("product-id") String productId) { return commandGateway.send(new DecrementProductCountCommand(orderId, productId)); } diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/InMemoryOrdersEventHandler.java b/axon/src/main/java/com/baeldung/axon/querymodel/InMemoryOrdersEventHandler.java index fbdf819961..6e9dbbb335 100644 --- a/axon/src/main/java/com/baeldung/axon/querymodel/InMemoryOrdersEventHandler.java +++ b/axon/src/main/java/com/baeldung/axon/querymodel/InMemoryOrdersEventHandler.java @@ -18,7 +18,9 @@ import org.axonframework.eventhandling.EventHandler; import org.axonframework.queryhandling.QueryHandler; import org.axonframework.queryhandling.QueryUpdateEmitter; import org.reactivestreams.Publisher; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -30,6 +32,7 @@ import java.util.Optional; @Service @ProcessingGroup("orders") +@Profile("!mongo") public class InMemoryOrdersEventHandler implements OrdersEventHandler { private final Map orders = new HashMap<>(); @@ -106,7 +109,8 @@ public class InMemoryOrdersEventHandler implements OrdersEventHandler { @QueryHandler public Publisher handleStreaming(FindAllOrderedProductsQuery query) { - return Mono.fromCallable(orders::values).flatMapMany(Flux::fromIterable); + return Mono.fromCallable(orders::values) + .flatMapMany(Flux::fromIterable); } @QueryHandler diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/MongoConfiguration.java b/axon/src/main/java/com/baeldung/axon/querymodel/MongoConfiguration.java new file mode 100644 index 0000000000..d68569efc8 --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/querymodel/MongoConfiguration.java @@ -0,0 +1,26 @@ +package com.baeldung.axon.querymodel; + +import com.mongodb.client.MongoClient; + +import org.axonframework.eventhandling.tokenstore.TokenStore; +import org.axonframework.extensions.mongo.DefaultMongoTemplate; +import org.axonframework.extensions.mongo.eventsourcing.tokenstore.MongoTokenStore; +import org.axonframework.serialization.Serializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Configuration +@Profile("mongo") +public class MongoConfiguration { + + @Bean + public TokenStore getTokenStore(MongoClient client, Serializer serializer) { + return MongoTokenStore.builder() + .mongoTemplate(DefaultMongoTemplate.builder() + .mongoDatabase(client) + .build()) + .serializer(serializer) + .build(); + } +} diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/MongoOrdersEventHandler.java b/axon/src/main/java/com/baeldung/axon/querymodel/MongoOrdersEventHandler.java new file mode 100644 index 0000000000..4da98a9f97 --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/querymodel/MongoOrdersEventHandler.java @@ -0,0 +1,194 @@ +package com.baeldung.axon.querymodel; + +import com.baeldung.axon.coreapi.events.OrderConfirmedEvent; +import com.baeldung.axon.coreapi.events.OrderCreatedEvent; +import com.baeldung.axon.coreapi.events.OrderShippedEvent; +import com.baeldung.axon.coreapi.events.ProductAddedEvent; +import com.baeldung.axon.coreapi.events.ProductCountDecrementedEvent; +import com.baeldung.axon.coreapi.events.ProductCountIncrementedEvent; +import com.baeldung.axon.coreapi.events.ProductRemovedEvent; +import com.baeldung.axon.coreapi.queries.FindAllOrderedProductsQuery; +import com.baeldung.axon.coreapi.queries.Order; +import com.baeldung.axon.coreapi.queries.OrderStatus; +import com.baeldung.axon.coreapi.queries.OrderUpdatesQuery; +import com.baeldung.axon.coreapi.queries.TotalProductsShippedQuery; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.model.IndexOptions; +import com.mongodb.client.model.Indexes; +import com.mongodb.client.result.UpdateResult; + +import groovyjarjarantlr4.v4.runtime.misc.NotNull; + +import org.axonframework.config.ProcessingGroup; +import org.axonframework.eventhandling.EventHandler; +import org.axonframework.queryhandling.QueryHandler; +import org.axonframework.queryhandling.QueryUpdateEmitter; +import org.bson.Document; +import org.bson.conversions.Bson; +import org.reactivestreams.Publisher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Service; + +import reactor.core.publisher.Flux; + +import java.lang.invoke.MethodHandles; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; + +import static com.mongodb.client.model.Filters.*; + +@Service +@ProcessingGroup("orders") +@Profile("mongo") +public class MongoOrdersEventHandler implements OrdersEventHandler { + + static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup() + .lookupClass()); + + private final MongoCollection orders; + private final QueryUpdateEmitter emitter; + private static final String ORDER_COLLECTION_NAME = "orders"; + private static final String AXON_FRAMEWORK_DATABASE_NAME = "axonframework"; + + private static final String ORDER_ID_PROPERTY_NAME = "orderId"; + private static final String PRODUCTS_PROPERTY_NAME = "products"; + private static final String ORDER_STATUS_PROPERTY_NAME = "orderStatus"; + + public MongoOrdersEventHandler(MongoClient client, QueryUpdateEmitter emitter) { + orders = client.getDatabase(AXON_FRAMEWORK_DATABASE_NAME) + .getCollection(ORDER_COLLECTION_NAME); + orders.createIndex(Indexes.ascending(ORDER_ID_PROPERTY_NAME), new IndexOptions().unique(true)); + this.emitter = emitter; + } + + @EventHandler + public void on(OrderCreatedEvent event) { + orders.insertOne(orderToDocument(new Order(event.getOrderId()))); + } + + @EventHandler + public void on(ProductAddedEvent event) { + update(event.getOrderId(), o -> o.addProduct(event.getProductId())); + } + + @EventHandler + public void on(ProductCountIncrementedEvent event) { + update(event.getOrderId(), o -> o.incrementProductInstance(event.getProductId())); + } + + @EventHandler + public void on(ProductCountDecrementedEvent event) { + update(event.getOrderId(), o -> o.decrementProductInstance(event.getProductId())); + } + + @EventHandler + public void on(ProductRemovedEvent event) { + update(event.getOrderId(), o -> o.removeProduct(event.getProductId())); + } + + @EventHandler + public void on(OrderConfirmedEvent event) { + update(event.getOrderId(), Order::setOrderConfirmed); + } + + @EventHandler + public void on(OrderShippedEvent event) { + update(event.getOrderId(), Order::setOrderShipped); + } + + @QueryHandler + public List handle(FindAllOrderedProductsQuery query) { + List orderList = new ArrayList<>(); + orders.find() + .forEach(d -> orderList.add(documentToOrder(d))); + return orderList; + } + + @Override + public Publisher handleStreaming(FindAllOrderedProductsQuery query) { + return Flux.fromIterable(orders.find()) + .map(this::documentToOrder); + } + + @QueryHandler + public Integer handle(TotalProductsShippedQuery query) { + AtomicInteger result = new AtomicInteger(); + orders.find(shippedProductFilter(query.getProductId())) + .map(d -> d.get(PRODUCTS_PROPERTY_NAME, Document.class)) + .map(d -> d.getInteger(query.getProductId(), 0)) + .forEach(result::addAndGet); + return result.get(); + } + + @QueryHandler + public Order handle(OrderUpdatesQuery query) { + return getOrder(query.getOrderId()).orElse(null); + } + + @Override + public void reset(List orderList) { + orders.deleteMany(new Document()); + orderList.forEach(o -> orders.insertOne(orderToDocument(o))); + } + + private Optional getOrder(String orderId) { + return Optional.ofNullable(orders.find(eq(ORDER_ID_PROPERTY_NAME, orderId)) + .first()) + .map(this::documentToOrder); + } + + private Order emitUpdate(Order order) { + emitter.emit(OrderUpdatesQuery.class, q -> order.getOrderId() + .equals(q.getOrderId()), order); + return order; + } + + private Order updateOrder(Order order, Consumer updateFunction) { + updateFunction.accept(order); + return order; + } + + private UpdateResult persistUpdate(Order order) { + return orders.replaceOne(eq(ORDER_ID_PROPERTY_NAME, order.getOrderId()), orderToDocument(order)); + } + + private void update(String orderId, Consumer updateFunction) { + UpdateResult result = getOrder(orderId).map(o -> updateOrder(o, updateFunction)) + .map(this::emitUpdate) + .map(this::persistUpdate) + .orElse(null); + logger.info("Result of updating order with orderId '{}': {}", orderId, result); + } + + private Document orderToDocument(Order order) { + return new Document(ORDER_ID_PROPERTY_NAME, order.getOrderId()).append(PRODUCTS_PROPERTY_NAME, order.getProducts()) + .append(ORDER_STATUS_PROPERTY_NAME, order.getOrderStatus() + .toString()); + } + + private Order documentToOrder(@NotNull Document document) { + Order order = new Order(document.getString(ORDER_ID_PROPERTY_NAME)); + Document products = document.get(PRODUCTS_PROPERTY_NAME, Document.class); + products.forEach((k, v) -> order.getProducts() + .put(k, (Integer) v)); + String status = document.getString(ORDER_STATUS_PROPERTY_NAME); + if (OrderStatus.CONFIRMED.toString() + .equals(status)) { + order.setOrderConfirmed(); + } else if (OrderStatus.SHIPPED.toString() + .equals(status)) { + order.setOrderShipped(); + } + return order; + } + + private Bson shippedProductFilter(String productId) { + return and(eq(ORDER_STATUS_PROPERTY_NAME, OrderStatus.SHIPPED.toString()), exists(String.format(PRODUCTS_PROPERTY_NAME + ".%s", productId))); + } +} \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/OrderQueryService.java b/axon/src/main/java/com/baeldung/axon/querymodel/OrderQueryService.java index ae391c3cb1..8196a98957 100644 --- a/axon/src/main/java/com/baeldung/axon/querymodel/OrderQueryService.java +++ b/axon/src/main/java/com/baeldung/axon/querymodel/OrderQueryService.java @@ -37,12 +37,12 @@ public class OrderQueryService { public Flux allOrdersStreaming() { Publisher publisher = queryGateway.streamingQuery(new FindAllOrderedProductsQuery(), Order.class); - return Flux.from(publisher).map(OrderResponse::new); + return Flux.from(publisher) + .map(OrderResponse::new); } public Integer totalShipped(String productId) { - return queryGateway.scatterGather(new TotalProductsShippedQuery(productId), - ResponseTypes.instanceOf(Integer.class), 10L, TimeUnit.SECONDS) + return queryGateway.scatterGather(new TotalProductsShippedQuery(productId), ResponseTypes.instanceOf(Integer.class), 10L, TimeUnit.SECONDS) .reduce(0, Integer::sum); } diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/OrderStatusResponse.java b/axon/src/main/java/com/baeldung/axon/querymodel/OrderStatusResponse.java index 90430b1e3d..2c4d32bff3 100644 --- a/axon/src/main/java/com/baeldung/axon/querymodel/OrderStatusResponse.java +++ b/axon/src/main/java/com/baeldung/axon/querymodel/OrderStatusResponse.java @@ -7,7 +7,8 @@ public enum OrderStatusResponse { static OrderStatusResponse toResponse(OrderStatus status) { for (OrderStatusResponse response : values()) { - if (response.toString().equals(status.toString())) { + if (response.toString() + .equals(status.toString())) { return response; } } diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/OrdersEventHandler.java b/axon/src/main/java/com/baeldung/axon/querymodel/OrdersEventHandler.java index 7e49abf93b..740e00cf72 100644 --- a/axon/src/main/java/com/baeldung/axon/querymodel/OrdersEventHandler.java +++ b/axon/src/main/java/com/baeldung/axon/querymodel/OrdersEventHandler.java @@ -11,6 +11,7 @@ import com.baeldung.axon.coreapi.queries.FindAllOrderedProductsQuery; import com.baeldung.axon.coreapi.queries.Order; import com.baeldung.axon.coreapi.queries.OrderUpdatesQuery; import com.baeldung.axon.coreapi.queries.TotalProductsShippedQuery; + import org.reactivestreams.Publisher; import java.util.List; diff --git a/axon/src/main/resources/application-mongo.properties b/axon/src/main/resources/application-mongo.properties new file mode 100644 index 0000000000..f642d1591c --- /dev/null +++ b/axon/src/main/resources/application-mongo.properties @@ -0,0 +1,6 @@ +spring.data.mongodb.host=localhost +spring.data.mongodb.port=27017 +spring.data.mongodb.authentication-database=admin +spring.data.mongodb.username=admin1234 +spring.data.mongodb.password=somepassword +spring.data.mongodb.database=order-projection \ No newline at end of file diff --git a/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java b/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java index c1d6bdccc2..fe7f57f854 100644 --- a/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java +++ b/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java @@ -17,6 +17,7 @@ import com.baeldung.axon.coreapi.events.ProductRemovedEvent; import com.baeldung.axon.coreapi.exceptions.DuplicateOrderLineException; import com.baeldung.axon.coreapi.exceptions.OrderAlreadyConfirmedException; import com.baeldung.axon.coreapi.exceptions.UnconfirmedOrderException; + import org.axonframework.test.aggregate.AggregateTestFixture; import org.axonframework.test.aggregate.FixtureConfiguration; import org.axonframework.test.matchers.Matchers; @@ -26,8 +27,10 @@ import java.util.UUID; class OrderAggregateUnitTest { - private static final String ORDER_ID = UUID.randomUUID().toString(); - private static final String PRODUCT_ID = UUID.randomUUID().toString(); + private static final String ORDER_ID = UUID.randomUUID() + .toString(); + private static final String PRODUCT_ID = UUID.randomUUID() + .toString(); private FixtureConfiguration fixture; @@ -39,101 +42,95 @@ class OrderAggregateUnitTest { @Test void giveNoPriorActivity_whenCreateOrderCommand_thenShouldPublishOrderCreatedEvent() { fixture.givenNoPriorActivity() - .when(new CreateOrderCommand(ORDER_ID)) - .expectEvents(new OrderCreatedEvent(ORDER_ID)); + .when(new CreateOrderCommand(ORDER_ID)) + .expectEvents(new OrderCreatedEvent(ORDER_ID)); } @Test void givenOrderCreatedEvent_whenAddProductCommand_thenShouldPublishProductAddedEvent() { fixture.given(new OrderCreatedEvent(ORDER_ID)) - .when(new AddProductCommand(ORDER_ID, PRODUCT_ID)) - .expectEvents(new ProductAddedEvent(ORDER_ID, PRODUCT_ID)); + .when(new AddProductCommand(ORDER_ID, PRODUCT_ID)) + .expectEvents(new ProductAddedEvent(ORDER_ID, PRODUCT_ID)); } @Test void givenOrderCreatedEventAndProductAddedEvent_whenAddProductCommandForSameProductId_thenShouldThrowDuplicateOrderLineException() { fixture.given(new OrderCreatedEvent(ORDER_ID), new ProductAddedEvent(ORDER_ID, PRODUCT_ID)) - .when(new AddProductCommand(ORDER_ID, PRODUCT_ID)) - .expectException(DuplicateOrderLineException.class) - .expectExceptionMessage(Matchers.predicate(message -> ((String) message).contains(PRODUCT_ID))); + .when(new AddProductCommand(ORDER_ID, PRODUCT_ID)) + .expectException(DuplicateOrderLineException.class) + .expectExceptionMessage(Matchers.predicate(message -> ((String) message).contains(PRODUCT_ID))); } @Test void givenOrderCreatedEventAndProductAddedEvent_whenIncrementProductCountCommand_thenShouldPublishProductCountIncrementedEvent() { fixture.given(new OrderCreatedEvent(ORDER_ID), new ProductAddedEvent(ORDER_ID, PRODUCT_ID)) - .when(new IncrementProductCountCommand(ORDER_ID, PRODUCT_ID)) - .expectEvents(new ProductCountIncrementedEvent(ORDER_ID, PRODUCT_ID)); + .when(new IncrementProductCountCommand(ORDER_ID, PRODUCT_ID)) + .expectEvents(new ProductCountIncrementedEvent(ORDER_ID, PRODUCT_ID)); } @Test void givenOrderCreatedEventProductAddedEventAndProductCountIncrementedEvent_whenDecrementProductCountCommand_thenShouldPublishProductCountDecrementedEvent() { - fixture.given(new OrderCreatedEvent(ORDER_ID), - new ProductAddedEvent(ORDER_ID, PRODUCT_ID), - new ProductCountIncrementedEvent(ORDER_ID, PRODUCT_ID)) - .when(new DecrementProductCountCommand(ORDER_ID, PRODUCT_ID)) - .expectEvents(new ProductCountDecrementedEvent(ORDER_ID, PRODUCT_ID)); + fixture.given(new OrderCreatedEvent(ORDER_ID), new ProductAddedEvent(ORDER_ID, PRODUCT_ID), new ProductCountIncrementedEvent(ORDER_ID, PRODUCT_ID)) + .when(new DecrementProductCountCommand(ORDER_ID, PRODUCT_ID)) + .expectEvents(new ProductCountDecrementedEvent(ORDER_ID, PRODUCT_ID)); } @Test void givenOrderCreatedEventAndProductAddedEvent_whenDecrementProductCountCommand_thenShouldPublishProductRemovedEvent() { fixture.given(new OrderCreatedEvent(ORDER_ID), new ProductAddedEvent(ORDER_ID, PRODUCT_ID)) - .when(new DecrementProductCountCommand(ORDER_ID, PRODUCT_ID)) - .expectEvents(new ProductRemovedEvent(ORDER_ID, PRODUCT_ID)); + .when(new DecrementProductCountCommand(ORDER_ID, PRODUCT_ID)) + .expectEvents(new ProductRemovedEvent(ORDER_ID, PRODUCT_ID)); } @Test void givenOrderCreatedEvent_whenConfirmOrderCommand_thenShouldPublishOrderConfirmedEvent() { fixture.given(new OrderCreatedEvent(ORDER_ID)) - .when(new ConfirmOrderCommand(ORDER_ID)) - .expectEvents(new OrderConfirmedEvent(ORDER_ID)); + .when(new ConfirmOrderCommand(ORDER_ID)) + .expectEvents(new OrderConfirmedEvent(ORDER_ID)); } @Test void givenOrderCreatedEventAndOrderConfirmedEvent_whenConfirmOrderCommand_thenExpectNoEvents() { fixture.given(new OrderCreatedEvent(ORDER_ID), new OrderConfirmedEvent(ORDER_ID)) - .when(new ConfirmOrderCommand(ORDER_ID)) - .expectNoEvents(); + .when(new ConfirmOrderCommand(ORDER_ID)) + .expectNoEvents(); } @Test void givenOrderCreatedEvent_whenShipOrderCommand_thenShouldThrowUnconfirmedOrderException() { fixture.given(new OrderCreatedEvent(ORDER_ID)) - .when(new ShipOrderCommand(ORDER_ID)) - .expectException(UnconfirmedOrderException.class); + .when(new ShipOrderCommand(ORDER_ID)) + .expectException(UnconfirmedOrderException.class); } @Test void givenOrderCreatedEventAndOrderConfirmedEvent_whenShipOrderCommand_thenShouldPublishOrderShippedEvent() { fixture.given(new OrderCreatedEvent(ORDER_ID), new OrderConfirmedEvent(ORDER_ID)) - .when(new ShipOrderCommand(ORDER_ID)) - .expectEvents(new OrderShippedEvent(ORDER_ID)); + .when(new ShipOrderCommand(ORDER_ID)) + .expectEvents(new OrderShippedEvent(ORDER_ID)); } @Test void givenOrderCreatedEventProductAndOrderConfirmedEvent_whenAddProductCommand_thenShouldThrowOrderAlreadyConfirmedException() { fixture.given(new OrderCreatedEvent(ORDER_ID), new OrderConfirmedEvent(ORDER_ID)) - .when(new AddProductCommand(ORDER_ID, PRODUCT_ID)) - .expectException(OrderAlreadyConfirmedException.class) - .expectExceptionMessage(Matchers.predicate(message -> ((String) message).contains(ORDER_ID))); + .when(new AddProductCommand(ORDER_ID, PRODUCT_ID)) + .expectException(OrderAlreadyConfirmedException.class) + .expectExceptionMessage(Matchers.predicate(message -> ((String) message).contains(ORDER_ID))); } @Test void givenOrderCreatedEventProductAddedEventAndOrderConfirmedEvent_whenIncrementProductCountCommand_thenShouldThrowOrderAlreadyConfirmedException() { - fixture.given(new OrderCreatedEvent(ORDER_ID), - new ProductAddedEvent(ORDER_ID, PRODUCT_ID), - new OrderConfirmedEvent(ORDER_ID)) - .when(new IncrementProductCountCommand(ORDER_ID, PRODUCT_ID)) - .expectException(OrderAlreadyConfirmedException.class) - .expectExceptionMessage(Matchers.predicate(message -> ((String) message).contains(ORDER_ID))); + fixture.given(new OrderCreatedEvent(ORDER_ID), new ProductAddedEvent(ORDER_ID, PRODUCT_ID), new OrderConfirmedEvent(ORDER_ID)) + .when(new IncrementProductCountCommand(ORDER_ID, PRODUCT_ID)) + .expectException(OrderAlreadyConfirmedException.class) + .expectExceptionMessage(Matchers.predicate(message -> ((String) message).contains(ORDER_ID))); } @Test void givenOrderCreatedEventProductAddedEventAndOrderConfirmedEvent_whenDecrementProductCountCommand_thenShouldThrowOrderAlreadyConfirmedException() { - fixture.given(new OrderCreatedEvent(ORDER_ID), - new ProductAddedEvent(ORDER_ID, PRODUCT_ID), - new OrderConfirmedEvent(ORDER_ID)) - .when(new DecrementProductCountCommand(ORDER_ID, PRODUCT_ID)) - .expectException(OrderAlreadyConfirmedException.class) - .expectExceptionMessage(Matchers.predicate(message -> ((String) message).contains(ORDER_ID))); + fixture.given(new OrderCreatedEvent(ORDER_ID), new ProductAddedEvent(ORDER_ID, PRODUCT_ID), new OrderConfirmedEvent(ORDER_ID)) + .when(new DecrementProductCountCommand(ORDER_ID, PRODUCT_ID)) + .expectException(OrderAlreadyConfirmedException.class) + .expectExceptionMessage(Matchers.predicate(message -> ((String) message).contains(ORDER_ID))); } } \ No newline at end of file diff --git a/axon/src/test/java/com/baeldung/axon/querymodel/AbstractOrdersEventHandlerUnitTest.java b/axon/src/test/java/com/baeldung/axon/querymodel/AbstractOrdersEventHandlerUnitTest.java index 2396d0f10b..fb7833a3f6 100644 --- a/axon/src/test/java/com/baeldung/axon/querymodel/AbstractOrdersEventHandlerUnitTest.java +++ b/axon/src/test/java/com/baeldung/axon/querymodel/AbstractOrdersEventHandlerUnitTest.java @@ -12,8 +12,10 @@ import com.baeldung.axon.coreapi.queries.Order; import com.baeldung.axon.coreapi.queries.OrderStatus; import com.baeldung.axon.coreapi.queries.OrderUpdatesQuery; import com.baeldung.axon.coreapi.queries.TotalProductsShippedQuery; + import org.axonframework.queryhandling.QueryUpdateEmitter; import org.junit.jupiter.api.*; + import reactor.core.publisher.Flux; import reactor.test.StepVerifier; @@ -27,10 +29,14 @@ import static org.mockito.Mockito.*; public abstract class AbstractOrdersEventHandlerUnitTest { - private static final String ORDER_ID_1 = UUID.randomUUID().toString(); - private static final String ORDER_ID_2 = UUID.randomUUID().toString(); - private static final String PRODUCT_ID_1 = UUID.randomUUID().toString(); - private static final String PRODUCT_ID_2 = UUID.randomUUID().toString(); + private static final String ORDER_ID_1 = UUID.randomUUID() + .toString(); + private static final String ORDER_ID_2 = UUID.randomUUID() + .toString(); + private static final String PRODUCT_ID_1 = UUID.randomUUID() + .toString(); + private static final String PRODUCT_ID_2 = UUID.randomUUID() + .toString(); private OrdersEventHandler handler; private static Order orderOne; private static Order orderTwo; @@ -39,12 +45,15 @@ public abstract class AbstractOrdersEventHandlerUnitTest { @BeforeAll static void createOrders() { orderOne = new Order(ORDER_ID_1); - orderOne.getProducts().put(PRODUCT_ID_1, 3); + orderOne.getProducts() + .put(PRODUCT_ID_1, 3); orderOne.setOrderShipped(); orderTwo = new Order(ORDER_ID_2); - orderTwo.getProducts().put(PRODUCT_ID_1, 1); - orderTwo.getProducts().put(PRODUCT_ID_2, 1); + orderTwo.getProducts() + .put(PRODUCT_ID_1, 1); + orderTwo.getProducts() + .put(PRODUCT_ID_2, 1); orderTwo.setOrderConfirmed(); } @@ -64,10 +73,18 @@ public abstract class AbstractOrdersEventHandlerUnitTest { assertNotNull(result); assertEquals(2, result.size()); - Order order_1 = result.stream().filter(o -> o.getOrderId().equals(ORDER_ID_1)).findFirst().orElse(null); + Order order_1 = result.stream() + .filter(o -> o.getOrderId() + .equals(ORDER_ID_1)) + .findFirst() + .orElse(null); assertEquals(orderOne, order_1); - Order order_2 = result.stream().filter(o -> o.getOrderId().equals(ORDER_ID_2)).findFirst().orElse(null); + Order order_2 = result.stream() + .filter(o -> o.getOrderId() + .equals(ORDER_ID_2)) + .findFirst() + .orElse(null); assertEquals(orderTwo, order_2); } @@ -75,9 +92,11 @@ public abstract class AbstractOrdersEventHandlerUnitTest { void givenTwoOrdersPlacedOfWhichOneNotShipped_whenFindAllOrderedProductsQueryStreaming_thenCorrectOrdersAreReturned() { resetWithTwoOrders(); final Consumer orderVerifier = order -> { - if (order.getOrderId().equals(orderOne.getOrderId())) { + if (order.getOrderId() + .equals(orderOne.getOrderId())) { assertEquals(orderOne, order); - } else if (order.getOrderId().equals(orderTwo.getOrderId())) { + } else if (order.getOrderId() + .equals(orderTwo.getOrderId())) { assertEquals(orderTwo, order); } else { throw new RuntimeException("Would expect either order one or order two"); @@ -85,10 +104,10 @@ public abstract class AbstractOrdersEventHandlerUnitTest { }; StepVerifier.create(Flux.from(handler.handleStreaming(new FindAllOrderedProductsQuery()))) - .assertNext(orderVerifier) - .assertNext(orderVerifier) - .expectComplete() - .verify(); + .assertNext(orderVerifier) + .assertNext(orderVerifier) + .expectComplete() + .verify(); } @Test @@ -120,7 +139,8 @@ public abstract class AbstractOrdersEventHandlerUnitTest { Order result = handler.handle(new OrderUpdatesQuery(ORDER_ID_1)); assertNotNull(result); assertEquals(ORDER_ID_1, result.getOrderId()); - assertEquals(3, result.getProducts().get(PRODUCT_ID_1)); + assertEquals(3, result.getProducts() + .get(PRODUCT_ID_1)); assertEquals(OrderStatus.SHIPPED, result.getOrderStatus()); } diff --git a/axon/src/test/java/com/baeldung/axon/querymodel/MongoOrdersEventHandlerUnitTest.java b/axon/src/test/java/com/baeldung/axon/querymodel/MongoOrdersEventHandlerUnitTest.java new file mode 100644 index 0000000000..c183294dc1 --- /dev/null +++ b/axon/src/test/java/com/baeldung/axon/querymodel/MongoOrdersEventHandlerUnitTest.java @@ -0,0 +1,20 @@ +package com.baeldung.axon.querymodel; + +import com.mongodb.client.MongoClient; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; + +@DataMongoTest +public class MongoOrdersEventHandlerUnitTest extends AbstractOrdersEventHandlerUnitTest { + + @Autowired + MongoClient mongoClient; + + @Override + protected OrdersEventHandler getHandler() { + mongoClient.getDatabase("axonframework") + .drop(); + return new MongoOrdersEventHandler(mongoClient, emitter); + } +} diff --git a/axon/src/test/java/com/baeldung/axon/querymodel/OrderQueryServiceIntegrationTest.java b/axon/src/test/java/com/baeldung/axon/querymodel/OrderQueryServiceIntegrationTest.java index dfb4881fdc..4a89fe0e4e 100644 --- a/axon/src/test/java/com/baeldung/axon/querymodel/OrderQueryServiceIntegrationTest.java +++ b/axon/src/test/java/com/baeldung/axon/querymodel/OrderQueryServiceIntegrationTest.java @@ -6,7 +6,6 @@ import com.baeldung.axon.coreapi.events.OrderShippedEvent; import com.baeldung.axon.coreapi.events.ProductAddedEvent; import com.baeldung.axon.coreapi.events.ProductCountDecrementedEvent; import com.baeldung.axon.coreapi.events.ProductCountIncrementedEvent; -import com.baeldung.axon.coreapi.queries.FindAllOrderedProductsQuery; import com.baeldung.axon.coreapi.queries.Order; import org.axonframework.eventhandling.gateway.EventGateway; @@ -66,9 +65,9 @@ class OrderQueryServiceIntegrationTest { void givenOrderCreatedEventSend_whenCallingAllOrdersStreaming_thenOneOrderIsReturned() { Flux result = queryService.allOrdersStreaming(); StepVerifier.create(result) - .assertNext(order -> assertEquals(orderId, order.getOrderId())) - .expectComplete() - .verify(); + .assertNext(order -> assertEquals(orderId, order.getOrderId())) + .expectComplete() + .verify(); } @Test diff --git a/axon/src/test/resources/application.properties b/axon/src/test/resources/application.properties index 35b5452b57..c42b7a4e90 100644 --- a/axon/src/test/resources/application.properties +++ b/axon/src/test/resources/application.properties @@ -1 +1,2 @@ +spring.mongodb.embedded.version=5.0.6 axon.axonserver.enabled=false \ No newline at end of file diff --git a/axon/start_mongo.sh b/axon/start_mongo.sh new file mode 100755 index 0000000000..2cc5a3a7cf --- /dev/null +++ b/axon/start_mongo.sh @@ -0,0 +1,7 @@ +docker run \ + -d \ + --name order_projection \ + -p 27017:27017 \ + -e MONGO_INITDB_ROOT_USERNAME=admin1234 \ + -e MONGO_INITDB_ROOT_PASSWORD=somepassword \ + mongo \ No newline at end of file From d80406004081e20c71059ef0a6f71cebd2d5ae50 Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Sun, 27 Nov 2022 19:02:37 +0100 Subject: [PATCH 054/592] BAEL-5819: java collections pecs --- .../pecs/ProducerExtendsConsumerSupers.java | 59 +++++++++++++++++++ .../collections/pecs/model/Customer.java | 7 +++ .../collections/pecs/model/Operator.java | 7 +++ .../baeldung/collections/pecs/model/User.java | 9 +++ 4 files changed, 82 insertions(+) create mode 100644 core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/pecs/ProducerExtendsConsumerSupers.java create mode 100644 core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/pecs/model/Customer.java create mode 100644 core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/pecs/model/Operator.java create mode 100644 core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/pecs/model/User.java diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/pecs/ProducerExtendsConsumerSupers.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/pecs/ProducerExtendsConsumerSupers.java new file mode 100644 index 0000000000..3c4b136b09 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/pecs/ProducerExtendsConsumerSupers.java @@ -0,0 +1,59 @@ +package com.baeldung.collections.pecs; + +import java.util.Arrays; +import java.util.List; + +import com.baeldung.collections.pecs.model.Customer; +import com.baeldung.collections.pecs.model.Operator; +import com.baeldung.collections.pecs.model.User; + +public class ProducerExtendsConsumerSupers { + + public void producerExtends() { + List operators = Arrays.asList(new Operator("sam"), new Operator("daniel")); + List customers = Arrays.asList(new Customer("arys"), new Customer("cristiana")); + + // sendEmails(operators); --> will not compile! + sendEmailsFixed(operators); + sendEmailsFixed(customers); + } + + private void sendEmails(List users) { + for (User user : users) { + System.out.println("sending email to " + user); + } + } + + private void sendEmailsFixed(List users) { + for (User user : users) { + System.out.println("sending email to " + user); + } + } + + public void consumerSupers() { + List allOperators = Arrays.asList(new Operator("tom")); + List allUsers = Arrays.asList(new Operator("tom"), new Customer("spencer")); + + // addUsersFromMarketingDepartment(allUsers); --> will not compile! + addUsersFromMarketingDepartmentFixed(allOperators); + addUsersFromMarketingDepartmentFixed(allUsers); + } + + private void addUsersFromMarketingDepartment(List users) { + users.add(new Operator("john doe")); + users.add(new Operator("jane doe")); + } + + private void addUsersFromMarketingDepartmentFixed(List users) { + users.add(new Operator("john doe")); + users.add(new Operator("jane doe")); + } + + private void addUsersAndSendEmails(List users) { + users.add(new Operator("john doe")); + for (User user : users) { + System.out.println("sending email to: " + user); + } + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/pecs/model/Customer.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/pecs/model/Customer.java new file mode 100644 index 0000000000..b3e97deddb --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/pecs/model/Customer.java @@ -0,0 +1,7 @@ +package com.baeldung.collections.pecs.model; + +public class Customer extends User { + public Customer(String name) { + super(name); + } +} diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/pecs/model/Operator.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/pecs/model/Operator.java new file mode 100644 index 0000000000..e998088496 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/pecs/model/Operator.java @@ -0,0 +1,7 @@ +package com.baeldung.collections.pecs.model; + +public class Operator extends User { + public Operator(String name) { + super(name); + } +} diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/pecs/model/User.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/pecs/model/User.java new file mode 100644 index 0000000000..a0d9d6a9b7 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/pecs/model/User.java @@ -0,0 +1,9 @@ +package com.baeldung.collections.pecs.model; + +public class User { + private final String name; + + public User(String name) { + this.name = name; + } +} From 53dbea8d568045bc501da756d720e202368c2da7 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Sun, 27 Nov 2022 20:00:09 +0100 Subject: [PATCH 055/592] BAEL-5921 | Guide to Java Priority Queue (#13087) * BAEL-5921 | Guide to Java Priority Queue * BAEL-5921 | Adressed comments * BAEL-5921 | Fixed test * BAEL-5921 | Fixed test --- .../priorityqueue/ColoredNumber.java | 27 +++++++ .../ColoredNumberComparable.java | 44 +++++++++++ .../PriorityQueueComparatorUnitTest.java | 74 +++++++++++++++++++ 3 files changed, 145 insertions(+) create mode 100644 core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/priorityqueue/ColoredNumber.java create mode 100644 core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/priorityqueue/ColoredNumberComparable.java create mode 100644 core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/priorityqueue/PriorityQueueComparatorUnitTest.java diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/priorityqueue/ColoredNumber.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/priorityqueue/ColoredNumber.java new file mode 100644 index 0000000000..554a13d642 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/priorityqueue/ColoredNumber.java @@ -0,0 +1,27 @@ +package com.baeldung.collections.priorityqueue; + +public final class ColoredNumber { + private int value; + private String color; + + public ColoredNumber(int value, String color) { + this.value = value; + this.color = color; + } + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } +} diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/priorityqueue/ColoredNumberComparable.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/priorityqueue/ColoredNumberComparable.java new file mode 100644 index 0000000000..0e9a5ec498 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/priorityqueue/ColoredNumberComparable.java @@ -0,0 +1,44 @@ +package com.baeldung.collections.priorityqueue; + +public final class ColoredNumberComparable implements Comparable { + private int value; + private String color; + + public ColoredNumberComparable(int value, String color) { + this.value = value; + this.color = color; + } + + @Override + public int compareTo(ColoredNumberComparable o) { + // (both numbers are red) or (both numbers are not red) + if ((this.color.equals("red") && o.color.equals("red")) || + (!this.color.equals("red") && !o.color.equals("red"))) { + return Integer.compare(this.value, o.value); + } + // only the first number is red + else if (this.color.equals("red")) { + return -1; + } + // only the second number is red + else { + return 1; + } + } + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/priorityqueue/PriorityQueueComparatorUnitTest.java b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/priorityqueue/PriorityQueueComparatorUnitTest.java new file mode 100644 index 0000000000..db10fa1ae8 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/priorityqueue/PriorityQueueComparatorUnitTest.java @@ -0,0 +1,74 @@ +package com.baeldung.collections.priorityqueue; + +import org.junit.jupiter.api.Test; + +import java.util.Collections; +import java.util.PriorityQueue; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class PriorityQueueComparatorUnitTest { + + @Test + void givenIntegerQueue_defaultComparator_followsNaturalOrdering() { + PriorityQueue integerQueue = new PriorityQueue<>(); + PriorityQueue integerQueueWithComparator = new PriorityQueue<>((Integer c1, Integer c2) -> Integer.compare(c1, c2)); + + integerQueueWithComparator.add(3); + integerQueue.add(3); + + integerQueueWithComparator.add(2); + integerQueue.add(2); + + integerQueueWithComparator.add(1); + integerQueue.add(1); + + assertThat(integerQueue.poll()).isEqualTo(1).isEqualTo(integerQueueWithComparator.poll()); + assertThat(integerQueue.poll()).isEqualTo(2).isEqualTo(integerQueueWithComparator.poll()); + assertThat(integerQueue.poll()).isEqualTo(3).isEqualTo(integerQueueWithComparator.poll()); + } + + @Test + void givenIntegerQueue_reverseOrderComparator_followsInverseNaturalOrdering() { + PriorityQueue reversedQueue = new PriorityQueue<>(Collections.reverseOrder()); + + reversedQueue.add(1); + reversedQueue.add(2); + reversedQueue.add(3); + + assertThat(reversedQueue.poll()).isEqualTo(3); + assertThat(reversedQueue.poll()).isEqualTo(2); + assertThat(reversedQueue.poll()).isEqualTo(1); + } + + @Test + void givenNotComparableQueue_classCastException() { + assertThatThrownBy(() -> { + PriorityQueue queue = new PriorityQueue<>(); + queue.add(new ColoredNumber(3, "red")); + queue.add(new ColoredNumber(2, "blue")); + }).isInstanceOf(ClassCastException.class); + } + + @Test + void givenCustomOrderingQueue_orderIsCorrect() { + PriorityQueue queue = new PriorityQueue<>(); + queue.add(new ColoredNumberComparable(10, "red")); + queue.add(new ColoredNumberComparable(20, "red")); + queue.add(new ColoredNumberComparable(1, "blue")); + queue.add(new ColoredNumberComparable(2, "blue")); + + ColoredNumberComparable first = queue.poll(); + assertThat(first.getColor()).isEqualTo("red"); + assertThat(first.getValue()).isEqualTo(10); + + queue.poll(); + + ColoredNumberComparable third = queue.poll(); + assertThat(third.getColor()).isEqualTo("blue"); + assertThat(third.getValue()).isEqualTo(1); + } + +} + From 965cf501f57daafc345adafef0de8dcbcd3baa5d Mon Sep 17 00:00:00 2001 From: alemoles Date: Sun, 27 Nov 2022 19:28:44 -0300 Subject: [PATCH 056/592] BAEL-5981 - String Interpolation in Java (#13092) --- .../core-java-string-operations-5/pom.xml | 6 ++ .../StringInterpolationUnitTest.java | 84 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/string_interpolation/StringInterpolationUnitTest.java diff --git a/core-java-modules/core-java-string-operations-5/pom.xml b/core-java-modules/core-java-string-operations-5/pom.xml index d7eade0145..efb32c73b9 100644 --- a/core-java-modules/core-java-string-operations-5/pom.xml +++ b/core-java-modules/core-java-string-operations-5/pom.xml @@ -20,6 +20,11 @@ commons-lang3 ${apache.commons.lang3.version} + + org.apache.commons + commons-text + ${commons-text.version} + @@ -39,6 +44,7 @@ 11 11 3.12.0 + 1.10.0 \ No newline at end of file diff --git a/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/string_interpolation/StringInterpolationUnitTest.java b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/string_interpolation/StringInterpolationUnitTest.java new file mode 100644 index 0000000000..7b2fa2ce97 --- /dev/null +++ b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/string_interpolation/StringInterpolationUnitTest.java @@ -0,0 +1,84 @@ +package com.baeldung.string_interpolation; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.text.MessageFormat; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.text.StringSubstitutor; +import org.junit.jupiter.api.Test; + +public class StringInterpolationUnitTest { + private final String EXPECTED_STRING = "String Interpolation in Java with some Java examples."; + + @Test + public void givenTwoString_thenInterpolateWithPlusSign() { + String EXPECTED_STRING = "String Interpolation in Java with some Java examples."; + String first = "Interpolation"; + String second = "Java"; + String result = "String " + first + " in " + second + " with some " + second + " examples."; + assertEquals(EXPECTED_STRING, result); + } + + @Test + public void givenTwoString_thenInterpolateWithFormat() { + String first = "Interpolation"; + String second = "Java"; + String result = String.format("String %s in %s with some %s examples.", first, second, second); + assertEquals(EXPECTED_STRING, result); + } + + @Test + public void givenTwoString_thenInterpolateWithFormatted() { + String first = "Interpolation"; + String second = "Java"; + String result = String.format("String %s in %s with some %s examples.", first, second, second); + assertEquals(EXPECTED_STRING, result); + } + + @Test + public void givenTwoString_thenInterpolateWithFormatStringReference() { + String first = "Interpolation"; + String second = "Java"; + String result = String.format("String %1$s in %2$s with some %2$s examples.", first, second); + assertEquals(EXPECTED_STRING, result); + } + + @Test + public void givenTwoString_thenInterpolateWithStringBuilder() { + String first = "Interpolation"; + String second = "Java"; + StringBuilder builder = new StringBuilder(); + builder.append("String ") + .append(first) + .append(" in ") + .append(second) + .append(" with some ") + .append(second) + .append(" examples."); + String result = builder.toString(); + assertEquals(EXPECTED_STRING, result); + } + + @Test + public void givenTwoString_thenInterpolateWithMessageFormat() { + String first = "Interpolation"; + String second = "Java"; + String result = MessageFormat.format("String {0} in {1} with some {1} examples.", first, second); + assertEquals(EXPECTED_STRING, result); + } + + @Test + public void givenTwoString_thenInterpolateWithStringSubstitutor() { + String baseString = "String ${first} in ${second} with some ${second} examples."; + String first = "Interpolation"; + String second = "Java"; + Map parameters = new HashMap<>(); + parameters.put("first", first); + parameters.put("second", second); + StringSubstitutor substitutor = new StringSubstitutor(parameters); + String result = substitutor.replace(baseString); + assertEquals(EXPECTED_STRING, result); + } +} From aaf070cd557729bebca0290ecbc647e034b84da4 Mon Sep 17 00:00:00 2001 From: Arya <108480101+drafii@users.noreply.github.com> Date: Mon, 28 Nov 2022 01:59:34 +0330 Subject: [PATCH 057/592] Changed module name. (#13098) --- .../README.md | 0 .../pom.xml | 4 ++-- .../com/baeldung/serializable_singleton/EnumSingleton.java | 0 .../java/com/baeldung/serializable_singleton/Singleton.java | 0 .../serializable_singleton/EnumSingletonUnitTest.java | 0 .../baeldung/serializable_singleton/SingletonUnitTest.java | 0 6 files changed, 2 insertions(+), 2 deletions(-) rename patterns-modules/{design-patterns-creational-2 => design-patterns-singleton}/README.md (100%) rename patterns-modules/{design-patterns-creational-2 => design-patterns-singleton}/pom.xml (81%) rename patterns-modules/{design-patterns-creational-2 => design-patterns-singleton}/src/main/java/com/baeldung/serializable_singleton/EnumSingleton.java (100%) rename patterns-modules/{design-patterns-creational-2 => design-patterns-singleton}/src/main/java/com/baeldung/serializable_singleton/Singleton.java (100%) rename patterns-modules/{design-patterns-creational-2 => design-patterns-singleton}/src/test/java/com/baeldung/serializable_singleton/EnumSingletonUnitTest.java (100%) rename patterns-modules/{design-patterns-creational-2 => design-patterns-singleton}/src/test/java/com/baeldung/serializable_singleton/SingletonUnitTest.java (100%) diff --git a/patterns-modules/design-patterns-creational-2/README.md b/patterns-modules/design-patterns-singleton/README.md similarity index 100% rename from patterns-modules/design-patterns-creational-2/README.md rename to patterns-modules/design-patterns-singleton/README.md diff --git a/patterns-modules/design-patterns-creational-2/pom.xml b/patterns-modules/design-patterns-singleton/pom.xml similarity index 81% rename from patterns-modules/design-patterns-creational-2/pom.xml rename to patterns-modules/design-patterns-singleton/pom.xml index 2e67b346f2..362f7f83c1 100644 --- a/patterns-modules/design-patterns-creational-2/pom.xml +++ b/patterns-modules/design-patterns-singleton/pom.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - design-patterns-creational-2 + design-patterns-singleton 1.0 - design-patterns-creational-2 + design-patterns-singleton jar diff --git a/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/serializable_singleton/EnumSingleton.java b/patterns-modules/design-patterns-singleton/src/main/java/com/baeldung/serializable_singleton/EnumSingleton.java similarity index 100% rename from patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/serializable_singleton/EnumSingleton.java rename to patterns-modules/design-patterns-singleton/src/main/java/com/baeldung/serializable_singleton/EnumSingleton.java diff --git a/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/serializable_singleton/Singleton.java b/patterns-modules/design-patterns-singleton/src/main/java/com/baeldung/serializable_singleton/Singleton.java similarity index 100% rename from patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/serializable_singleton/Singleton.java rename to patterns-modules/design-patterns-singleton/src/main/java/com/baeldung/serializable_singleton/Singleton.java diff --git a/patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/serializable_singleton/EnumSingletonUnitTest.java b/patterns-modules/design-patterns-singleton/src/test/java/com/baeldung/serializable_singleton/EnumSingletonUnitTest.java similarity index 100% rename from patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/serializable_singleton/EnumSingletonUnitTest.java rename to patterns-modules/design-patterns-singleton/src/test/java/com/baeldung/serializable_singleton/EnumSingletonUnitTest.java diff --git a/patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/serializable_singleton/SingletonUnitTest.java b/patterns-modules/design-patterns-singleton/src/test/java/com/baeldung/serializable_singleton/SingletonUnitTest.java similarity index 100% rename from patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/serializable_singleton/SingletonUnitTest.java rename to patterns-modules/design-patterns-singleton/src/test/java/com/baeldung/serializable_singleton/SingletonUnitTest.java From f6ae9ceefae654848e5dc4efb10a52f63ecbe649 Mon Sep 17 00:00:00 2001 From: psevestre Date: Mon, 28 Nov 2022 01:15:01 -0300 Subject: [PATCH 058/592] BAEL-5900: Using Firebase Cloud Messaging in SpringBoot Applications (#13102) * [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-5900] Initial commit --- gcp-firebase/.gitignore | 1 + gcp-firebase/pom.xml | 48 ++++++++ .../FirebasePublisherApplication.java | 12 ++ .../config/FirebaseConfiguration.java | 57 +++++++++ .../publisher/config/FirebaseProperties.java | 25 ++++ .../ConditionMessageRepresentation.java | 35 ++++++ .../FirebasePublisherController.java | 109 ++++++++++++++++++ .../MulticastMessageRepresentation.java | 33 ++++++ .../src/main/resources/application.properties | 2 + .../FirebasePublisherControllerLiveTest.java | 48 ++++++++ messaging-modules/rabbitmq/README.md | 1 + 11 files changed, 371 insertions(+) create mode 100644 gcp-firebase/.gitignore create mode 100644 gcp-firebase/pom.xml create mode 100644 gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/FirebasePublisherApplication.java create mode 100644 gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/config/FirebaseConfiguration.java create mode 100644 gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/config/FirebaseProperties.java create mode 100644 gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/controller/ConditionMessageRepresentation.java create mode 100644 gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/controller/FirebasePublisherController.java create mode 100644 gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/controller/MulticastMessageRepresentation.java create mode 100644 gcp-firebase/src/main/resources/application.properties create mode 100644 gcp-firebase/src/test/java/com/baeldung/gcp/firebase/publisher/controller/FirebasePublisherControllerLiveTest.java diff --git a/gcp-firebase/.gitignore b/gcp-firebase/.gitignore new file mode 100644 index 0000000000..d0c04ea3fe --- /dev/null +++ b/gcp-firebase/.gitignore @@ -0,0 +1 @@ +/firebase-service-account.json diff --git a/gcp-firebase/pom.xml b/gcp-firebase/pom.xml new file mode 100644 index 0000000000..c563099ad6 --- /dev/null +++ b/gcp-firebase/pom.xml @@ -0,0 +1,48 @@ + + 4.0.0 + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + gcp-firebase + + + 9.1.1 + + + + + com.google.firebase + firebase-admin + ${firebase-admin.version} + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/FirebasePublisherApplication.java b/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/FirebasePublisherApplication.java new file mode 100644 index 0000000000..904ae88f00 --- /dev/null +++ b/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/FirebasePublisherApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.gcp.firebase.publisher; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class FirebasePublisherApplication { + + public static void main(String[] args ) { + SpringApplication.run(FirebasePublisherApplication.class,args); + } +} diff --git a/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/config/FirebaseConfiguration.java b/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/config/FirebaseConfiguration.java new file mode 100644 index 0000000000..bbfb63d089 --- /dev/null +++ b/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/config/FirebaseConfiguration.java @@ -0,0 +1,57 @@ +package com.baeldung.gcp.firebase.publisher.config; + +import java.io.IOException; +import java.io.InputStream; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.google.api.client.http.HttpTransport; +import com.google.auth.oauth2.GoogleCredentials; +import com.google.firebase.FirebaseApp; +import com.google.firebase.FirebaseOptions; +import com.google.firebase.messaging.FirebaseMessaging; + +@Configuration +@EnableConfigurationProperties(FirebaseProperties.class) +public class FirebaseConfiguration { + + private final FirebaseProperties firebaseProperties; + + public FirebaseConfiguration(FirebaseProperties firebaseProperties) { + this.firebaseProperties = firebaseProperties; + } + + @Bean + GoogleCredentials googleCredentials() { + try { + if (firebaseProperties.getServiceAccount() != null) { + try( InputStream is = firebaseProperties.getServiceAccount().getInputStream()) { + return GoogleCredentials.fromStream(is); + } + } + else { + // Use standard credentials chain. Useful when running inside GKE + return GoogleCredentials.getApplicationDefault(); + } + } + catch (IOException ioe) { + throw new RuntimeException(ioe); + } + } + + @Bean + FirebaseApp firebaseApp(GoogleCredentials credentials) { + FirebaseOptions options = FirebaseOptions.builder() + .setCredentials(credentials) + .build(); + + return FirebaseApp.initializeApp(options); + } + + @Bean + FirebaseMessaging firebaseMessaging(FirebaseApp firebaseApp) { + return FirebaseMessaging.getInstance(firebaseApp); + } +} diff --git a/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/config/FirebaseProperties.java b/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/config/FirebaseProperties.java new file mode 100644 index 0000000000..44be70cc5d --- /dev/null +++ b/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/config/FirebaseProperties.java @@ -0,0 +1,25 @@ +package com.baeldung.gcp.firebase.publisher.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.core.io.Resource; + +@ConfigurationProperties(prefix = "gcp.firebase") +public class FirebaseProperties { + private Resource serviceAccount; + + + /** + * @return the serviceAccount + */ + public Resource getServiceAccount() { + return serviceAccount; + } + + /** + * @param serviceAccount the serviceAccount to set + */ + public void setServiceAccount(Resource serviceAccount) { + this.serviceAccount = serviceAccount; + } + +} diff --git a/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/controller/ConditionMessageRepresentation.java b/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/controller/ConditionMessageRepresentation.java new file mode 100644 index 0000000000..f0d470a44c --- /dev/null +++ b/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/controller/ConditionMessageRepresentation.java @@ -0,0 +1,35 @@ +package com.baeldung.gcp.firebase.publisher.controller; + +public class ConditionMessageRepresentation { + + private String condition; + private String data; + + /** + * @return the condition + */ + public String getCondition() { + return condition; + } + + /** + * @param condition the condition to set + */ + public void setCondition(String condition) { + this.condition = condition; + } + + /** + * @return the data + */ + public String getData() { + return data; + } + + /** + * @param data the data to set + */ + public void setData(String data) { + this.data = data; + } +} diff --git a/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/controller/FirebasePublisherController.java b/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/controller/FirebasePublisherController.java new file mode 100644 index 0000000000..ca7467531e --- /dev/null +++ b/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/controller/FirebasePublisherController.java @@ -0,0 +1,109 @@ +package com.baeldung.gcp.firebase.publisher.controller; + + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.google.firebase.messaging.AndroidConfig; +import com.google.firebase.messaging.AndroidFcmOptions; +import com.google.firebase.messaging.ApnsConfig; +import com.google.firebase.messaging.BatchResponse; +import com.google.firebase.messaging.FcmOptions; +import com.google.firebase.messaging.FirebaseMessaging; +import com.google.firebase.messaging.FirebaseMessagingException; +import com.google.firebase.messaging.Message; +import com.google.firebase.messaging.MulticastMessage; +import com.google.firebase.messaging.Notification; + +@RestController +public class FirebasePublisherController { + + private final FirebaseMessaging fcm; + + public FirebasePublisherController(FirebaseMessaging fcm) { + this.fcm = fcm; + } + + @PostMapping("/topics/{topic}") + public ResponseEntity postToTopic(@RequestBody String message, @PathVariable("topic") String topic) throws FirebaseMessagingException { + + Message msg = Message.builder() + .setTopic(topic) + .putData("body", message) + .build(); + + String id = fcm.send(msg); + return ResponseEntity + .status(HttpStatus.ACCEPTED) + .body(id); + } + + @PostMapping("/condition") + public ResponseEntity postToCondition(@RequestBody ConditionMessageRepresentation message ) throws FirebaseMessagingException { + + Message msg = Message.builder() + .setCondition(message.getCondition()) + .putData("body", message.getData()) + .build(); + + String id = fcm.send(msg); + return ResponseEntity + .status(HttpStatus.ACCEPTED) + .body(id); + } + + + @PostMapping("/clients/{registrationToken}") + public ResponseEntity postToClient(@RequestBody String message, @PathVariable("registrationToken") String registrationToken) throws FirebaseMessagingException { + + Message msg = Message.builder() + .setToken(registrationToken) + .putData("body", message) + .build(); + + String id = fcm.send(msg); + return ResponseEntity + .status(HttpStatus.ACCEPTED) + .body(id); + } + + @PostMapping("/clients") + public ResponseEntity> postToClients(@RequestBody MulticastMessageRepresentation message) throws FirebaseMessagingException { + + MulticastMessage msg = MulticastMessage.builder() + .addAllTokens(message.getRegistrationTokens()) + .putData("body", message.getData()) + .build(); + + BatchResponse response = fcm.sendMulticast(msg); + + List ids = response.getResponses() + .stream() + .map(r->r.getMessageId()) + .collect(Collectors.toList()); + + return ResponseEntity + .status(HttpStatus.ACCEPTED) + .body(ids); + } + + @PostMapping("/subscriptions/{topic}") + public ResponseEntity createSubscription(@PathVariable("topic") String topic,@RequestBody List registrationTokens) throws FirebaseMessagingException { + fcm.subscribeToTopic(registrationTokens, topic); + return ResponseEntity.ok().build(); + } + + @DeleteMapping("/subscriptions/{topic}/{registrationToken}") + public ResponseEntity deleteSubscription(@PathVariable String topic, @PathVariable String registrationToken) throws FirebaseMessagingException { + fcm.subscribeToTopic(List.of(registrationToken), topic); + return ResponseEntity.ok().build(); + } +} diff --git a/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/controller/MulticastMessageRepresentation.java b/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/controller/MulticastMessageRepresentation.java new file mode 100644 index 0000000000..5d86e160e0 --- /dev/null +++ b/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/controller/MulticastMessageRepresentation.java @@ -0,0 +1,33 @@ +package com.baeldung.gcp.firebase.publisher.controller; + +import java.util.List; + +public class MulticastMessageRepresentation { + + private String data; + private List registrationTokens; + /** + * @return the message + */ + public String getData() { + return data; + } + /** + * @param message the message to set + */ + public void setData(String data) { + this.data = data; + } + /** + * @return the registrationTokens + */ + public List getRegistrationTokens() { + return registrationTokens; + } + /** + * @param registrationTokens the registrationTokens to set + */ + public void setRegistrationTokens(List registrationTokens) { + this.registrationTokens = registrationTokens; + } +} diff --git a/gcp-firebase/src/main/resources/application.properties b/gcp-firebase/src/main/resources/application.properties new file mode 100644 index 0000000000..aacbde0d92 --- /dev/null +++ b/gcp-firebase/src/main/resources/application.properties @@ -0,0 +1,2 @@ +# Service account location. Can be a filesystem path or a classpath resource +gcp.firebase.service-account=file:firebase-service-account.json \ No newline at end of file diff --git a/gcp-firebase/src/test/java/com/baeldung/gcp/firebase/publisher/controller/FirebasePublisherControllerLiveTest.java b/gcp-firebase/src/test/java/com/baeldung/gcp/firebase/publisher/controller/FirebasePublisherControllerLiveTest.java new file mode 100644 index 0000000000..eae4fc0e57 --- /dev/null +++ b/gcp-firebase/src/test/java/com/baeldung/gcp/firebase/publisher/controller/FirebasePublisherControllerLiveTest.java @@ -0,0 +1,48 @@ +package com.baeldung.gcp.firebase.publisher.controller; + +import static org.junit.jupiter.api.Assertions.*; + +import java.net.URI; +import java.util.Map; + +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.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +class FirebasePublisherControllerLiveTest { + + @LocalServerPort + int serverPort; + + @Autowired + TestRestTemplate restTemplate; + + @Test + void testWhenPostTopicMessage_thenSucess() throws Exception{ + + URI uri = new URI("http://localhost:" + serverPort + "/topics/my-topic"); + ResponseEntity response = restTemplate.postForEntity(uri, "Hello, world", String.class); + + assertNotNull(response); + assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); + assertNotNull(response.getBody()); + } + + @Test + void testWhenPostClientMessage_thenSucess() throws Exception{ + + URI uri = new URI("http://localhost:" + serverPort + "/clients/fake-registration1"); + ResponseEntity response = restTemplate.postForEntity(uri, "Hello, world", String.class); + + assertNotNull(response); + assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); + assertNotNull(response.getBody()); + } + +} diff --git a/messaging-modules/rabbitmq/README.md b/messaging-modules/rabbitmq/README.md index d91d268b2b..6a74c297fc 100644 --- a/messaging-modules/rabbitmq/README.md +++ b/messaging-modules/rabbitmq/README.md @@ -8,3 +8,4 @@ This module contains articles about RabbitMQ. - [Pub-Sub vs. Message Queues](https://www.baeldung.com/pub-sub-vs-message-queues) - [Channels and Connections in RabbitMQ](https://www.baeldung.com/java-rabbitmq-channels-connections) + From 28c0b9569e1f0aef7496fc1f6e529d4e0ba97999 Mon Sep 17 00:00:00 2001 From: Vlad Fernoaga Date: Tue, 29 Nov 2022 04:23:11 +0200 Subject: [PATCH 059/592] Feing client vs web client (#12968) * implement code example for feignClient vs WebClient * refactor code example for feignClient vs WebClient with /products endpoint * fix PR comment --- .../spring-5-reactive-3/pom.xml | 25 ++++++++ .../java/com/baeldung/webclient/Product.java | 13 ++++ .../webclient/ProductsFeignClient.java | 15 +++++ .../ProductsSlowServiceController.java | 21 +++++++ .../webclient/WebClientApplication.java | 15 +++++ .../com/baeldung/webclient/WebController.java | 59 +++++++++++++++++++ .../DataBufferToInputStreamUnitTest.java | 2 +- .../WebControllerIntegrationTest.java | 49 +++++++++++++++ 8 files changed, 198 insertions(+), 1 deletion(-) create mode 100644 spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/Product.java create mode 100644 spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/ProductsFeignClient.java create mode 100644 spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/ProductsSlowServiceController.java create mode 100644 spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/WebClientApplication.java create mode 100644 spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/WebController.java rename spring-reactive-modules/spring-5-reactive-3/src/test/java/{ => com/baeldung}/databuffer/DataBufferToInputStreamUnitTest.java (98%) create mode 100644 spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/webclient/WebControllerIntegrationTest.java diff --git a/spring-reactive-modules/spring-5-reactive-3/pom.xml b/spring-reactive-modules/spring-5-reactive-3/pom.xml index 5d5bfbdc5b..d33b63e921 100644 --- a/spring-reactive-modules/spring-5-reactive-3/pom.xml +++ b/spring-reactive-modules/spring-5-reactive-3/pom.xml @@ -20,6 +20,14 @@ org.springframework.boot spring-boot-starter-webflux + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-openfeign + org.projectreactor reactor-spring @@ -35,10 +43,27 @@ reactor-test test + + org.projectlombok + lombok + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + 1.0.1.RELEASE + 2021.0.4 \ No newline at end of file diff --git a/spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/Product.java b/spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/Product.java new file mode 100644 index 0000000000..f915792a31 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/Product.java @@ -0,0 +1,13 @@ +package com.baeldung.webclient; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Product { + private String title; + private String description; +} diff --git a/spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/ProductsFeignClient.java b/spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/ProductsFeignClient.java new file mode 100644 index 0000000000..d3f7f8118f --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/ProductsFeignClient.java @@ -0,0 +1,15 @@ +package com.baeldung.webclient; + +import java.net.URI; +import java.util.List; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@FeignClient(value = "productsBlocking", url = "http://localhost:8080") +public interface ProductsFeignClient { + + @RequestMapping(method = RequestMethod.GET, value = "/slow-service-products", produces = "application/json") + List getProductsBlocking(URI baseUrl); +} diff --git a/spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/ProductsSlowServiceController.java b/spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/ProductsSlowServiceController.java new file mode 100644 index 0000000000..8f70c3b228 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/ProductsSlowServiceController.java @@ -0,0 +1,21 @@ +package com.baeldung.webclient; + +import java.util.Arrays; +import java.util.List; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class ProductsSlowServiceController { + + @GetMapping("/slow-service-products") + private List getAllProducts() throws InterruptedException { + Thread.sleep(2000L); // delay + return Arrays.asList( + new Product("Fancy Smartphone", "A stylish phone you need"), + new Product("Cool Watch", "The only device you need"), + new Product("Smart TV", "Cristal clean images") + ); + } +} \ No newline at end of file diff --git a/spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/WebClientApplication.java b/spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/WebClientApplication.java new file mode 100644 index 0000000000..9e55211b24 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/WebClientApplication.java @@ -0,0 +1,15 @@ +package com.baeldung.webclient; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; + +@SpringBootApplication +@EnableFeignClients +public class WebClientApplication { + + public static void main(String[] args) { + SpringApplication.run(WebClientApplication.class, args); + } +} + diff --git a/spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/WebController.java b/spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/WebController.java new file mode 100644 index 0000000000..7ab6754d44 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-3/src/main/java/com/baeldung/webclient/WebController.java @@ -0,0 +1,59 @@ +package com.baeldung.webclient; + +import java.net.URI; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.reactive.function.client.WebClient; + +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import reactor.core.publisher.Flux; + +@Slf4j +@RestController +public class WebController { + + private static final int DEFAULT_PORT = 8080; + + public static final String SLOW_SERVICE_PRODUCTS_ENDPOINT_NAME = "/slow-service-products"; + + @Setter + private int serverPort = DEFAULT_PORT; + + @Autowired + private ProductsFeignClient productsFeignClient; + + @GetMapping("/products-blocking") + public List getProductsBlocking() { + log.info("Starting BLOCKING Controller!"); + final URI uri = URI.create(getSlowServiceBaseUri()); + + List result = productsFeignClient.getProductsBlocking(uri); + result.forEach(product -> log.info(product.toString())); + log.info("Exiting BLOCKING Controller!"); + return result; + } + + @GetMapping(value = "/products-non-blocking", produces = MediaType.TEXT_EVENT_STREAM_VALUE) + public Flux getProductsNonBlocking() { + log.info("Starting NON-BLOCKING Controller!"); + Flux productFlux = WebClient.create() + .get() + .uri(getSlowServiceBaseUri() + SLOW_SERVICE_PRODUCTS_ENDPOINT_NAME) + .retrieve() + .bodyToFlux(Product.class); + + productFlux.subscribe(product -> log.info(product.toString())); + log.info("Exiting NON-BLOCKING Controller!"); + return productFlux; + } + + private String getSlowServiceBaseUri() { + return "http://localhost:" + serverPort; + } + +} diff --git a/spring-reactive-modules/spring-5-reactive-3/src/test/java/databuffer/DataBufferToInputStreamUnitTest.java b/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/databuffer/DataBufferToInputStreamUnitTest.java similarity index 98% rename from spring-reactive-modules/spring-5-reactive-3/src/test/java/databuffer/DataBufferToInputStreamUnitTest.java rename to spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/databuffer/DataBufferToInputStreamUnitTest.java index b885919bbb..f30b4a8a3b 100644 --- a/spring-reactive-modules/spring-5-reactive-3/src/test/java/databuffer/DataBufferToInputStreamUnitTest.java +++ b/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/databuffer/DataBufferToInputStreamUnitTest.java @@ -1,4 +1,4 @@ -package databuffer; +package com.baeldung.databuffer; import com.baeldung.databuffer.DataBufferToInputStream; diff --git a/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/webclient/WebControllerIntegrationTest.java b/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/webclient/WebControllerIntegrationTest.java new file mode 100644 index 0000000000..e401fb649d --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-3/src/test/java/com/baeldung/webclient/WebControllerIntegrationTest.java @@ -0,0 +1,49 @@ +package com.baeldung.webclient; + +import static org.springframework.test.annotation.DirtiesContext.ClassMode.BEFORE_CLASS; + +import org.junit.jupiter.api.BeforeEach; +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.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.web.reactive.server.WebTestClient; + +@DirtiesContext(classMode = BEFORE_CLASS) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = WebClientApplication.class) +class WebControllerIntegrationTest { + + @LocalServerPort + private int randomServerPort; + + @Autowired + private WebTestClient testClient; + + @Autowired + private WebController webController; + + @BeforeEach + void setup() { + webController.setServerPort(randomServerPort); + } + + @Test + void whenEndpointWithBlockingClientIsCalled_thenThreeProductsAreReceived() { + testClient.get() + .uri("/products-blocking") + .exchange() + .expectStatus().isOk() + .expectBodyList(Product.class).hasSize(3); + } + + @Test + void whenEndpointWithNonBlockingClientIsCalled_thenThreeProductsAreReceived() { + testClient.get() + .uri("/products-non-blocking") + .exchange() + .expectStatus().isOk() + .expectBodyList(Product.class).hasSize(3); + } +} \ No newline at end of file From 4d330a1b8514003d81f7f5df402aaf8341aa0bf7 Mon Sep 17 00:00:00 2001 From: Kilian Schneider <48420258+Basler182@users.noreply.github.com> Date: Tue, 29 Nov 2022 03:33:35 +0100 Subject: [PATCH 060/592] BAEL-5785 Map.of() vs Map.ofEntries() test (#13064) * BAEL-5785 Map.of() vs Map.ofEntries() test * Update pom.xml * Update pom.xml * Add immutable test case * Update map naming --- .../core-java-collections-maps-5/pom.xml | 12 +++++ .../MapOfEntriesVsMapOfUnitTest.java | 52 +++++++++++++++++++ core-java-modules/pom.xml | 1 - pom.xml | 1 + 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 core-java-modules/core-java-collections-maps-5/src/test/java/com/baeldung/map/mapofvsmapofentries/MapOfEntriesVsMapOfUnitTest.java diff --git a/core-java-modules/core-java-collections-maps-5/pom.xml b/core-java-modules/core-java-collections-maps-5/pom.xml index ba7083e42e..516a0de4be 100644 --- a/core-java-modules/core-java-collections-maps-5/pom.xml +++ b/core-java-modules/core-java-collections-maps-5/pom.xml @@ -5,6 +5,18 @@ 4.0.0 core-java-collections-maps-5 0.1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + + + core-java-collections-maps-5 jar diff --git a/core-java-modules/core-java-collections-maps-5/src/test/java/com/baeldung/map/mapofvsmapofentries/MapOfEntriesVsMapOfUnitTest.java b/core-java-modules/core-java-collections-maps-5/src/test/java/com/baeldung/map/mapofvsmapofentries/MapOfEntriesVsMapOfUnitTest.java new file mode 100644 index 0000000000..f8a8e33139 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-5/src/test/java/com/baeldung/map/mapofvsmapofentries/MapOfEntriesVsMapOfUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.map.mapofvsmapofentries; + +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class MapOfEntriesVsMapOfUnitTest { + + @Test + void mapOf() { + // Use Map.of() to create an empty immutable map + Map map = Map.of(); + assertNotNull(map); + + // Use Map.of() to create an immutable map with one entry + Map mapWithEntry = Map.of(1L, "value1"); + assertNotNull(mapWithEntry); + assertThat(mapWithEntry.size()).isEqualTo(1); + assertThat(mapWithEntry.get(1L)).isEqualTo("value1"); + + // Test if map is immutable + try { + mapWithEntry.put(2L, "value2"); + } catch (UnsupportedOperationException e) { + assertThat(e).isInstanceOf(UnsupportedOperationException.class); + } + } + + @Test + void mapOfEntries() { + // Use Map.ofEntries() to create an empty immutable map + Map map = Map.ofEntries(); + assertNotNull(map); + + // Use Map.ofEntries() to create an immutable map with two entries. + Map longUserMap = Map.ofEntries(Map.entry(1L, "User A"), Map.entry(2L, "User B")); + assertNotNull(longUserMap); + assertThat(longUserMap.size()).isEqualTo(2); + assertThat(longUserMap.get(1L)).isEqualTo("User A"); + assertThat(longUserMap.get(2L)).isEqualTo("User B"); + + // Test if map is immutable + try { + longUserMap.put(3L, "User C"); + } catch (UnsupportedOperationException e) { + assertThat(e).isInstanceOf(UnsupportedOperationException.class); + } + } +} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 74bf4c662c..53ad13a3c0 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -41,7 +41,6 @@ core-java-collections-maps core-java-collections-maps-2 core-java-collections-maps-3 - core-java-collections-maps-5 core-java-concurrency-2 core-java-concurrency-advanced core-java-concurrency-advanced-2 diff --git a/pom.xml b/pom.xml index adbccc6612..f51cdb4c73 100644 --- a/pom.xml +++ b/pom.xml @@ -1129,6 +1129,7 @@ core-java-modules/core-java-collections-set core-java-modules/core-java-collections-list-4 core-java-modules/core-java-collections-maps-4 + core-java-modules/core-java-collections-maps-5 core-java-modules/core-java-concurrency-simple core-java-modules/core-java-date-operations-1 core-java-modules/core-java-datetime-conversion From 842c31986329d50745284f6b911fbab0a5639f96 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:15:15 +0800 Subject: [PATCH 061/592] Update README.md [skip ci] --- tablesaw/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tablesaw/README.md b/tablesaw/README.md index e7409a0b6b..679e5c9a14 100644 --- a/tablesaw/README.md +++ b/tablesaw/README.md @@ -1,5 +1,5 @@ This module contains tutorials related to the tablesaw java library. ### Relevant Articles: - +- [Working with Tabular Data Using Tablesaw](https://www.baeldung.com/tablesaw) From 6f23af2703091c4f17172a3d4aa0a16fe1b9a112 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:17:30 +0800 Subject: [PATCH 062/592] Update README.md [skip ci] --- lombok-modules/lombok-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/lombok-modules/lombok-2/README.md b/lombok-modules/lombok-2/README.md index 632d676567..d3b1287346 100644 --- a/lombok-modules/lombok-2/README.md +++ b/lombok-modules/lombok-2/README.md @@ -8,4 +8,5 @@ This module contains articles about Project Lombok. - [Declaring Val and Var Variables in Lombok](https://www.baeldung.com/java-lombok-val-var) - [Lombok Using @With Annotations](https://www.baeldung.com/lombok-with-annotations) - [Lombok’s @ToString Annotation](https://www.baeldung.com/lombok-tostring) +- [Jackson’s Deserialization With Lombok](https://www.baeldung.com/java-jackson-deserialization-lombok) - More articles: [[<-- prev]](../lombok) From a8f68d47afa2c335041489120c262bdadb7369f3 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:19:54 +0800 Subject: [PATCH 063/592] 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 ba8509306e..622730c834 100644 --- a/core-java-modules/core-java-string-algorithms-3/README.md +++ b/core-java-modules/core-java-string-algorithms-3/README.md @@ -8,3 +8,4 @@ This module contains articles about string-related algorithms. - [Check if Two Strings are Anagrams in Java](https://www.baeldung.com/java-strings-anagrams) - [Email Validation in Java](https://www.baeldung.com/java-email-validation-regex) - [Check if the First Letter of a String is Uppercase](https://www.baeldung.com/java-check-first-letter-uppercase) +- [Find the First Non Repeating Character in a String in Java](https://www.baeldung.com/java-find-the-first-non-repeating-character) From 9b06e15e96c7c39a4cc43aef5bd7dd91f73a1223 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:24:05 +0800 Subject: [PATCH 064/592] Update README.md [skip ci] --- core-java-modules/core-java-optional/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-optional/README.md b/core-java-modules/core-java-optional/README.md index 6c83003ea2..674ab5a7cd 100644 --- a/core-java-modules/core-java-optional/README.md +++ b/core-java-modules/core-java-optional/README.md @@ -10,3 +10,4 @@ This module contains articles about Java Optional. - [Java 9 Optional API Additions](https://www.baeldung.com/java-9-optional) - [Throw Exception in Optional in Java 8](https://www.baeldung.com/java-optional-throw-exception) - [Optional orElse Optional](https://www.baeldung.com/java-optional-or-else-optional) +- [Uses for Optional in Java](https://www.baeldung.com/java-optional-uses) From 1ba60da892fd2f81d5ad9d56a6cc98f2fe5a9a8f Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:26:23 +0800 Subject: [PATCH 065/592] 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 2503459f50..11e4348838 100644 --- a/core-java-modules/core-java-datetime-conversion/README.md +++ b/core-java-modules/core-java-datetime-conversion/README.md @@ -7,3 +7,4 @@ This module contains articles about converting between Java date and time object - [Convert Time to Milliseconds in Java](https://www.baeldung.com/java-time-milliseconds) - [Convert Date to LocalDate or LocalDateTime and Back](http://www.baeldung.com/java-date-to-localdate-and-localdatetime) - [Convert Between java.time.Instant and java.sql.Timestamp](https://www.baeldung.com/java-time-instant-to-java-sql-timestamp) +- [Convert Between LocalDateTime and ZonedDateTime](https://www.baeldung.com/java-localdatetime-zoneddatetime) From b6db71aebb336b95ab803e82a933977ec24e6808 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:28:56 +0800 Subject: [PATCH 066/592] Update README.md [skip ci] --- spring-boot-modules/spring-boot-request-params/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-request-params/README.md b/spring-boot-modules/spring-boot-request-params/README.md index f3ced26455..2824083d8a 100644 --- a/spring-boot-modules/spring-boot-request-params/README.md +++ b/spring-boot-modules/spring-boot-request-params/README.md @@ -3,3 +3,4 @@ This module contains articles about Spring Boot Request Params ### Relevant Articles: +- [Enum Mapping in Spring Boot](https://www.baeldung.com/spring-boot-enum-mapping) From 8d20dad50fc730ec39f9f67ae6c6e39dd2ce0dfd Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:32:25 +0800 Subject: [PATCH 067/592] 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 7d843af9ea..edec116b93 100644 --- a/patterns-modules/design-patterns-singleton/README.md +++ b/patterns-modules/design-patterns-singleton/README.md @@ -1 +1,2 @@ ### Relevant Articles: +- [How to Serialize a Singleton in Java](https://www.baeldung.com/java-serialize-singleton) From 5e7e690dbe6f8bf92af73eb6a50102641ba83207 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:36:04 +0800 Subject: [PATCH 068/592] Update README.md [skip ci] --- spring-cloud-modules/spring-cloud-config/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud-modules/spring-cloud-config/README.md b/spring-cloud-modules/spring-cloud-config/README.md index 788889c8d6..f80b4b508c 100644 --- a/spring-cloud-modules/spring-cloud-config/README.md +++ b/spring-cloud-modules/spring-cloud-config/README.md @@ -1,2 +1,3 @@ ### Relevant Articles: - [Quick Intro to Spring Cloud Configuration](http://www.baeldung.com/spring-cloud-configuration) +- [Overriding the Values of Remote Properties in Spring Cloud Config](https://www.baeldung.com/spring-cloud-config-remote-properties-override) From aa19449d8f099adb585d86a57f6aa233d850ae92 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:40:23 +0800 Subject: [PATCH 069/592] Update README.md [skip ci] --- spring-reactive-modules/spring-5-reactive-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-reactive-modules/spring-5-reactive-3/README.md b/spring-reactive-modules/spring-5-reactive-3/README.md index 044b3db5f4..24a7c43ad3 100644 --- a/spring-reactive-modules/spring-5-reactive-3/README.md +++ b/spring-reactive-modules/spring-5-reactive-3/README.md @@ -4,4 +4,5 @@ This module contains articles about reactive Spring 5. - [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) +- [Spring Boot FeignClient vs. WebClient](https://www.baeldung.com/spring-boot-feignclient-vs-webclient) - More articles: [[<-- prev]](../spring-5-reactive-2) From de10836e6769e143e943d24076c4348957914558 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:43:45 +0800 Subject: [PATCH 070/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-maps-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-maps-5/README.md b/core-java-modules/core-java-collections-maps-5/README.md index a131c669c6..e1817c7ba4 100644 --- a/core-java-modules/core-java-collections-maps-5/README.md +++ b/core-java-modules/core-java-collections-maps-5/README.md @@ -9,4 +9,5 @@ - [Java IdentityHashMap Class and Its Use Cases](https://www.baeldung.com/java-identityhashmap) - [How to Invert a Map in Java](https://www.baeldung.com/java-invert-map) - [Implementing a Map with Multiple Keys in Java](https://www.baeldung.com/java-multiple-keys-map) +- [Difference Between Map.ofEntries() and Map.of()](https://www.baeldung.com/map-ofentries-and-map-of) - More articles: [[<-- prev]](../core-java-collections-maps-4) From c5d0dbfc1082a4e88b5db03abb5ba99548f6608e Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 30 Nov 2022 14:38:24 +0000 Subject: [PATCH 071/592] [JAVA-14987] Added missing code (#12983) * [JAVA-14987] Added missing code * [JAVA-14987] Added missing code Co-authored-by: panagiotiskakos --- .../main/java/com/baeldung/IpConsumer.java | 64 +++++++++++++++++++ .../main/java/com/baeldung/IpProcessor.java | 20 ++++++ .../java/com/baeldung/IpProcessorFactory.java | 11 ++++ .../main/java/com/baeldung/IpProducer.java | 55 ++++++++++++++++ .../java/com/baeldung/KinesisApplication.java | 28 +++++++- .../src/main/resources/application.properties | 14 ++-- 6 files changed, 185 insertions(+), 7 deletions(-) create mode 100644 spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpConsumer.java create mode 100644 spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProcessor.java create mode 100644 spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProcessorFactory.java create mode 100644 spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProducer.java diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpConsumer.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpConsumer.java new file mode 100644 index 0000000000..7549ca9c83 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpConsumer.java @@ -0,0 +1,64 @@ +package com.baeldung; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.StreamListener; +import org.springframework.cloud.stream.messaging.Sink; +import org.springframework.stereotype.Component; + +import com.amazonaws.services.kinesis.AmazonKinesis; +import com.amazonaws.services.kinesis.model.GetRecordsRequest; +import com.amazonaws.services.kinesis.model.GetRecordsResult; +import com.amazonaws.services.kinesis.model.GetShardIteratorRequest; +import com.amazonaws.services.kinesis.model.GetShardIteratorResult; +import com.amazonaws.services.kinesis.model.ShardIteratorType; + +@Component +@EnableBinding(Sink.class) +public class IpConsumer { + + @Value("${ips.stream}") + private String IPS_STREAM; + @Value("${ips.shard.id}") + private String IPS_SHARD_ID; + @Autowired + private AmazonKinesis kinesis; + private GetShardIteratorResult shardIterator; + + + @StreamListener(Sink.INPUT) + public void consume(String ip) { + System.out.println(ip); + } + + private void consumeWithKinesis() { + GetRecordsRequest recordsRequest = new GetRecordsRequest(); + recordsRequest.setShardIterator(shardIterator.getShardIterator()); + recordsRequest.setLimit(25); + + GetRecordsResult recordsResult = kinesis.getRecords(recordsRequest); + while (!recordsResult.getRecords() + .isEmpty()) { + recordsResult.getRecords() + .stream() + .map(record -> new String(record.getData() + .array())) + .forEach(System.out::println); + + recordsRequest.setShardIterator(recordsResult.getNextShardIterator()); + recordsResult = kinesis.getRecords(recordsRequest); + } + } + + @PostConstruct + private void buildShardIterator() { + GetShardIteratorRequest readShardsRequest = new GetShardIteratorRequest(); + readShardsRequest.setStreamName(IPS_STREAM); + readShardsRequest.setShardIteratorType(ShardIteratorType.LATEST); + readShardsRequest.setShardId(IPS_SHARD_ID); + this.shardIterator = kinesis.getShardIterator(readShardsRequest); + } +} \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProcessor.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProcessor.java new file mode 100644 index 0000000000..32e6babc86 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProcessor.java @@ -0,0 +1,20 @@ +package com.baeldung; + +import com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IRecordProcessor; +import com.amazonaws.services.kinesis.clientlibrary.types.InitializationInput; +import com.amazonaws.services.kinesis.clientlibrary.types.ProcessRecordsInput; +import com.amazonaws.services.kinesis.clientlibrary.types.ShutdownInput; + +public class IpProcessor implements IRecordProcessor { + @Override + public void initialize(InitializationInput initializationInput) { } + + @Override + public void processRecords(ProcessRecordsInput processRecordsInput) { + processRecordsInput.getRecords() + .forEach(record -> System.out.println(new String(record.getData().array()))); + } + + @Override + public void shutdown(ShutdownInput shutdownInput) { } +} \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProcessorFactory.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProcessorFactory.java new file mode 100644 index 0000000000..1ca774bb39 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProcessorFactory.java @@ -0,0 +1,11 @@ +package com.baeldung; + +import com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IRecordProcessor; +import com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IRecordProcessorFactory; + +public class IpProcessorFactory implements IRecordProcessorFactory { + @Override + public IRecordProcessor createProcessor() { + return new IpProcessor(); + } +} \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProducer.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProducer.java new file mode 100644 index 0000000000..3ba8f8e4b4 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProducer.java @@ -0,0 +1,55 @@ +package com.baeldung; + +import java.nio.ByteBuffer; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.messaging.Source; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import com.amazonaws.services.kinesis.AmazonKinesis; +import com.amazonaws.services.kinesis.model.PutRecordsRequest; +import com.amazonaws.services.kinesis.model.PutRecordsRequestEntry; + +@Component +@EnableBinding(Source.class) +public class IpProducer { + + @Value("${ips.partition.key}") + private String IPS_PARTITION_KEY; + @Value("${ips.stream}") + private String IPS_STREAM; + + @Autowired + private Source source; + @Autowired + private AmazonKinesis kinesis; + + @Scheduled(fixedDelay = 3000L) + private void produce() { + IntStream.range(1, 200).mapToObj(ipSuffix -> "192.168.0." + ipSuffix) + .forEach(entry -> source.output().send(MessageBuilder.withPayload(entry).build())); + } + + @Scheduled(fixedDelay = 3000L) + private void produceWithKinesis() { + List entries = IntStream.range(1, 200).mapToObj(ipSuffix -> { + PutRecordsRequestEntry entry = new PutRecordsRequestEntry(); + entry.setData(ByteBuffer.wrap(("192.168.0." + ipSuffix).getBytes())); + entry.setPartitionKey(IPS_PARTITION_KEY); + return entry; + }).collect(Collectors.toList()); + + PutRecordsRequest createRecordsRequest = new PutRecordsRequest(); + createRecordsRequest.setStreamName(IPS_STREAM); + createRecordsRequest.setRecords(entries); + + kinesis.putRecords(createRecordsRequest); + } +} \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java index c863cd8fe2..b748446600 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java @@ -1,23 +1,47 @@ package com.baeldung; +import javax.annotation.PostConstruct; + import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.stream.annotation.EnableBinding; import org.springframework.cloud.stream.annotation.StreamListener; import org.springframework.cloud.stream.messaging.Processor; +import org.springframework.context.annotation.Bean; import org.springframework.messaging.support.MessageBuilder; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.regions.Regions; +import com.amazonaws.services.kinesis.AmazonKinesis; +import com.amazonaws.services.kinesis.AmazonKinesisClientBuilder; + @SpringBootApplication @EnableBinding(Processor.class) public class KinesisApplication { + @Value("${aws.access.key}") + private String accessKey; + @Value("${aws.secret.key}") + private String secretKey; + @Autowired + private Processor processor; + public static void main(String[] args) { SpringApplication.run(KinesisApplication.class, args); } - @Autowired - private Processor processor; + + @Bean + public AmazonKinesis buildAmazonKinesis() { + BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey); + return AmazonKinesisClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)) + .withRegion(Regions.EU_CENTRAL_1) + .build(); + } @StreamListener(Processor.INPUT) public void consume(String val) { diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties index 1a966c64fb..32ab4da914 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties @@ -3,9 +3,13 @@ cloud.aws.credentials.secret-key=aws-secret cloud.aws.region.static=eu-central-1 cloud.aws.stack.auto=false -spring.cloud.stream.bindings.output.destination=myStream -spring.cloud.stream.bindings.output.content-type=text/plain +aws.access.key=my-aws-access-key-goes-here +aws.secret.key=my-aws-secret-key-goes-here -spring.cloud.stream.bindings.input.destination=myStream -spring.cloud.stream.bindings.input.group=myStream-group -spring.cloud.stream.bindings.input.content-type=text/plain \ No newline at end of file +spring.cloud.stream.bindings.output.destination=myStream +spring.cloud.stream.bindings.input.destination=live-ips +spring.cloud.stream.bindings.input.group=live-ips-group +spring.cloud.stream.bindings.input.content-type=text/plain + +ips.partition.key=ips-partition-key +ips.stream=ips-stream \ No newline at end of file From f1dfbf1f46a00d2a8d461099de9d11e2c3e896c7 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 30 Nov 2022 20:39:24 +0530 Subject: [PATCH 072/592] JAVA-14987 Minor cleanup (#13113) --- .../src/main/java/com/baeldung/IpConsumer.java | 7 ++++--- .../src/main/java/com/baeldung/IpProducer.java | 1 + .../main/java/com/baeldung/KinesisApplication.java | 5 ++--- .../src/main/resources/application.properties | 14 ++++++++------ 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpConsumer.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpConsumer.java index 7549ca9c83..949787b687 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpConsumer.java +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpConsumer.java @@ -22,13 +22,15 @@ public class IpConsumer { @Value("${ips.stream}") private String IPS_STREAM; + @Value("${ips.shard.id}") private String IPS_SHARD_ID; + @Autowired private AmazonKinesis kinesis; + private GetShardIteratorResult shardIterator; - @StreamListener(Sink.INPUT) public void consume(String ip) { System.out.println(ip); @@ -40,8 +42,7 @@ public class IpConsumer { recordsRequest.setLimit(25); GetRecordsResult recordsResult = kinesis.getRecords(recordsRequest); - while (!recordsResult.getRecords() - .isEmpty()) { + while (!recordsResult.getRecords().isEmpty()) { recordsResult.getRecords() .stream() .map(record -> new String(record.getData() diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProducer.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProducer.java index 3ba8f8e4b4..f59b2161f9 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProducer.java +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProducer.java @@ -23,6 +23,7 @@ public class IpProducer { @Value("${ips.partition.key}") private String IPS_PARTITION_KEY; + @Value("${ips.stream}") private String IPS_STREAM; diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java index b748446600..6926560244 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java @@ -1,7 +1,5 @@ package com.baeldung; -import javax.annotation.PostConstruct; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; @@ -24,8 +22,10 @@ public class KinesisApplication { @Value("${aws.access.key}") private String accessKey; + @Value("${aws.secret.key}") private String secretKey; + @Autowired private Processor processor; @@ -33,7 +33,6 @@ public class KinesisApplication { SpringApplication.run(KinesisApplication.class, args); } - @Bean public AmazonKinesis buildAmazonKinesis() { BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey); diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties index 32ab4da914..cc1f321453 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties @@ -1,15 +1,17 @@ -cloud.aws.credentials.access-key=aws-key -cloud.aws.credentials.secret-key=aws-secret -cloud.aws.region.static=eu-central-1 -cloud.aws.stack.auto=false - aws.access.key=my-aws-access-key-goes-here aws.secret.key=my-aws-secret-key-goes-here -spring.cloud.stream.bindings.output.destination=myStream +cloud.aws.credentials.access-key=my-aws-access-key +cloud.aws.credentials.secret-key=my-aws-secret-key +cloud.aws.region.static=eu-central-1 +cloud.aws.stack.auto=false + spring.cloud.stream.bindings.input.destination=live-ips spring.cloud.stream.bindings.input.group=live-ips-group spring.cloud.stream.bindings.input.content-type=text/plain +spring.cloud.stream.bindings.output.destination=myStream +spring.cloud.stream.bindings.output.content-type=text/plain + ips.partition.key=ips-partition-key ips.stream=ips-stream \ No newline at end of file From 0e594f1a74ac0d247ebb1edb95e0ea27d0afeabe Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Wed, 30 Nov 2022 17:13:56 +0000 Subject: [PATCH 073/592] [JAVA-15820] Enable spring-jinq module (#13090) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f51cdb4c73..fb257a033e 100644 --- a/pom.xml +++ b/pom.xml @@ -578,7 +578,7 @@ spring-jenkins-pipeline spring-jersey - + spring-jinq spring-kafka spring-katharsis From 21c42ebebc0ef10f2e0889be380fb00f87a6b5c1 Mon Sep 17 00:00:00 2001 From: jsgrah-spring Date: Wed, 30 Nov 2022 18:49:52 +0100 Subject: [PATCH 074/592] JAVA-12387. Correct/Rename THREADS to TASKS and int threads to int tasks. (#13084) --- .../concurrent/lock/ConcurrentAccessBenchmark.java | 10 +++++----- .../concurrent/lock/ConcurrentAccessExperiment.java | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java index ceb53ce077..28231a15a8 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessBenchmark.java @@ -19,7 +19,7 @@ import org.openjdk.jmh.annotations.Warmup; @Warmup(iterations = 0) public class ConcurrentAccessBenchmark { static final int SLOTS = 4; - static final int THREADS = 10000; + static final int TASKS = 10000; static final int BUCKETS = Runtime.getRuntime().availableProcessors() * SLOTS; SingleLock singleLock = new SingleLock(); StripedLock stripedLock = new StripedLock(BUCKETS); @@ -28,27 +28,27 @@ public class ConcurrentAccessBenchmark { @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) public Map singleLockHashMap() throws InterruptedException { - return singleLock.doWork(new HashMap(), THREADS, SLOTS); + return singleLock.doWork(new HashMap(), TASKS, SLOTS); } @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) public Map stripedLockHashMap() throws InterruptedException { - return stripedLock.doWork(new HashMap(), THREADS, SLOTS); + return stripedLock.doWork(new HashMap(), TASKS, SLOTS); } @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) public Map singleLockConcurrentHashMap() throws InterruptedException { - return singleLock.doWork(new ConcurrentHashMap(), THREADS, SLOTS); + return singleLock.doWork(new ConcurrentHashMap(), TASKS, SLOTS); } @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) public Map stripedLockConcurrentHashMap() throws InterruptedException { - return stripedLock.doWork(new ConcurrentHashMap(), THREADS, SLOTS); + return stripedLock.doWork(new ConcurrentHashMap(), TASKS, SLOTS); } } diff --git a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java index ec6d3895da..b24f0c8b19 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/main/java/com/baeldung/concurrent/lock/ConcurrentAccessExperiment.java @@ -7,10 +7,10 @@ import com.google.common.base.Supplier; public abstract class ConcurrentAccessExperiment { - public final Map doWork(Map map, int threads, int slots) { - CompletableFuture[] requests = new CompletableFuture[threads * slots]; + public final Map doWork(Map map, int tasks, int slots) { + CompletableFuture[] requests = new CompletableFuture[tasks * slots]; - for (int i = 0; i < threads; i++) { + for (int i = 0; i < tasks; i++) { requests[slots * i + 0] = CompletableFuture.supplyAsync(putSupplier(map, i)); requests[slots * i + 1] = CompletableFuture.supplyAsync(getSupplier(map, i)); requests[slots * i + 2] = CompletableFuture.supplyAsync(getSupplier(map, i)); From c22f09177187855253767afe324006eaa2e0b9df Mon Sep 17 00:00:00 2001 From: Arya <108480101+drafii@users.noreply.github.com> Date: Wed, 30 Nov 2022 23:21:46 +0330 Subject: [PATCH 075/592] Added the code for "Errors and Exceptions in Java". (#13104) * Added the code for "Errors and Exceptions in Java". * Added the unit tests. --- .../CheckedExceptionExcample.java | 15 +++++++++++++++ .../exceptions_vs_errors/ErrorExample.java | 14 ++++++++++++++ .../RuntimeExceptionExample.java | 11 +++++++++++ .../ErrorExampleUnitTest.java | 13 +++++++++++++ .../RuntimeExceptionExampleUnitTest.java | 13 +++++++++++++ 5 files changed, 66 insertions(+) create mode 100644 core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/exceptions_vs_errors/CheckedExceptionExcample.java create mode 100644 core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/exceptions_vs_errors/ErrorExample.java create mode 100644 core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/exceptions_vs_errors/RuntimeExceptionExample.java create mode 100644 core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/exceptions_vs_errors/ErrorExampleUnitTest.java create mode 100644 core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/exceptions_vs_errors/RuntimeExceptionExampleUnitTest.java diff --git a/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/exceptions_vs_errors/CheckedExceptionExcample.java b/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/exceptions_vs_errors/CheckedExceptionExcample.java new file mode 100644 index 0000000000..443f34265e --- /dev/null +++ b/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/exceptions_vs_errors/CheckedExceptionExcample.java @@ -0,0 +1,15 @@ +package com.baeldung.exception.exceptions_vs_errors; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public class CheckedExceptionExcample { + public static void main(String[] args) { + try (FileInputStream fis = new FileInputStream(new File("test.txt"))) { + fis.read(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/exceptions_vs_errors/ErrorExample.java b/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/exceptions_vs_errors/ErrorExample.java new file mode 100644 index 0000000000..143ca8c57e --- /dev/null +++ b/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/exceptions_vs_errors/ErrorExample.java @@ -0,0 +1,14 @@ +package com.baeldung.exception.exceptions_vs_errors; + +public class ErrorExample { + + public static void main(String[] args) { + overflow(); + } + + public static void overflow() { + System.out.println("overflow..."); + overflow(); + } + +} diff --git a/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/exceptions_vs_errors/RuntimeExceptionExample.java b/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/exceptions_vs_errors/RuntimeExceptionExample.java new file mode 100644 index 0000000000..3d5728c385 --- /dev/null +++ b/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/exceptions_vs_errors/RuntimeExceptionExample.java @@ -0,0 +1,11 @@ +package com.baeldung.exception.exceptions_vs_errors; + +public class RuntimeExceptionExample { + public static void main(String[] args) { + int[] arr = new int[20]; + + arr[20] = 20; + + System.out.println(arr[20]); + } +} diff --git a/core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/exceptions_vs_errors/ErrorExampleUnitTest.java b/core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/exceptions_vs_errors/ErrorExampleUnitTest.java new file mode 100644 index 0000000000..9fca24638d --- /dev/null +++ b/core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/exceptions_vs_errors/ErrorExampleUnitTest.java @@ -0,0 +1,13 @@ +package com.baeldung.exception.exceptions_vs_errors; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; + +// Unit test for the ErrorExample class. +public class ErrorExampleUnitTest { + @Test + public void whenMainMethodIsRun_thenStackOverflowError() { + Assertions.assertThrows(StackOverflowError.class, + () -> ErrorExample.main(null)); + } +} diff --git a/core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/exceptions_vs_errors/RuntimeExceptionExampleUnitTest.java b/core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/exceptions_vs_errors/RuntimeExceptionExampleUnitTest.java new file mode 100644 index 0000000000..9c2c1f478b --- /dev/null +++ b/core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/exceptions_vs_errors/RuntimeExceptionExampleUnitTest.java @@ -0,0 +1,13 @@ +package com.baeldung.exception.exceptions_vs_errors; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; + +// Unit test for the RuntimeExceptionExample class. +public class RuntimeExceptionExampleUnitTest { + @Test + public void whenMainMethodIsRun_thenArrayIndexOutOfBoundsExceptionIsThrown() { + Assertions.assertThrows(ArrayIndexOutOfBoundsException.class, + () -> RuntimeExceptionExample.main(null)); + } +} From 64134309d1ffba9178a06f3780ff6ce21a7d53df Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Wed, 30 Nov 2022 21:25:53 +0000 Subject: [PATCH 076/592] [JAVA-16367] Update modelmapper lib version --- spring-boot-rest/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-rest/pom.xml b/spring-boot-rest/pom.xml index cbd59ef78e..f81286adb6 100644 --- a/spring-boot-rest/pom.xml +++ b/spring-boot-rest/pom.xml @@ -87,7 +87,7 @@ com.baeldung.SpringBootRestApplication 1.4.11.1 - 2.4.5 + 3.1.0 \ No newline at end of file From afd6ccaa93bc4abddcb8a8e08a3db71231c8cac3 Mon Sep 17 00:00:00 2001 From: alemoles Date: Wed, 30 Nov 2022 20:42:11 -0300 Subject: [PATCH 077/592] BAEL-5850 - Abstract Factory vs Factory Method Pattern in Java (#13115) --- .../design-patterns-creational-2/pom.xml | 13 +++++++++++++ .../abstract_factory/Corporation.java | 0 .../abstract_factory/ElectricVehicle.java | 0 .../abstract_factory/FutureVehicleCorporation.java | 0 .../abstract_factory/FutureVehicleElectricCar.java | 0 .../abstract_factory/FutureVehicleMotorcycle.java | 0 .../abstract_factory/MotorVehicle.java | 0 .../abstract_factory/NextGenCorporation.java | 0 .../abstract_factory/NextGenElectricCar.java | 0 .../abstract_factory/NextGenMotorcycle.java | 0 .../com/baeldung/factory_pattern/method/Car.java | 0 .../baeldung/factory_pattern/method/CarFactory.java | 0 .../factory_pattern/method/MotorVehicle.java | 0 .../factory_pattern/method/MotorVehicleFactory.java | 0 .../baeldung/factory_pattern/method/Motorcycle.java | 0 .../factory_pattern/method/MotorcycleFactory.java | 0 .../abstract_factory/AbstractFactoryUnitTest.java | 0 .../method/FactoryMethodUnitTest.java | 0 patterns-modules/pom.xml | 1 + 19 files changed, 14 insertions(+) create mode 100644 patterns-modules/design-patterns-creational-2/pom.xml rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/main/java/com/baeldung/factory_pattern/abstract_factory/Corporation.java (100%) rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/main/java/com/baeldung/factory_pattern/abstract_factory/ElectricVehicle.java (100%) rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/main/java/com/baeldung/factory_pattern/abstract_factory/FutureVehicleCorporation.java (100%) rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/main/java/com/baeldung/factory_pattern/abstract_factory/FutureVehicleElectricCar.java (100%) rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/main/java/com/baeldung/factory_pattern/abstract_factory/FutureVehicleMotorcycle.java (100%) rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/main/java/com/baeldung/factory_pattern/abstract_factory/MotorVehicle.java (100%) rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/main/java/com/baeldung/factory_pattern/abstract_factory/NextGenCorporation.java (100%) rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/main/java/com/baeldung/factory_pattern/abstract_factory/NextGenElectricCar.java (100%) rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/main/java/com/baeldung/factory_pattern/abstract_factory/NextGenMotorcycle.java (100%) rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/main/java/com/baeldung/factory_pattern/method/Car.java (100%) rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/main/java/com/baeldung/factory_pattern/method/CarFactory.java (100%) rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/main/java/com/baeldung/factory_pattern/method/MotorVehicle.java (100%) rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/main/java/com/baeldung/factory_pattern/method/MotorVehicleFactory.java (100%) rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/main/java/com/baeldung/factory_pattern/method/Motorcycle.java (100%) rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/main/java/com/baeldung/factory_pattern/method/MotorcycleFactory.java (100%) rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/test/java/com/baeldung/factory_pattern/abstract_factory/AbstractFactoryUnitTest.java (100%) rename patterns-modules/{design-patterns-creational => design-patterns-creational-2}/src/test/java/com/baeldung/factory_pattern/method/FactoryMethodUnitTest.java (100%) diff --git a/patterns-modules/design-patterns-creational-2/pom.xml b/patterns-modules/design-patterns-creational-2/pom.xml new file mode 100644 index 0000000000..2a29a9cd6d --- /dev/null +++ b/patterns-modules/design-patterns-creational-2/pom.xml @@ -0,0 +1,13 @@ + + 4.0.0 + design-patterns-creational-2 + design-patterns-creational-2 + jar + + + patterns-modules + com.baeldung + 1.0.0-SNAPSHOT + + diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/Corporation.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/Corporation.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/Corporation.java rename to patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/Corporation.java diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/ElectricVehicle.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/ElectricVehicle.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/ElectricVehicle.java rename to patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/ElectricVehicle.java diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/FutureVehicleCorporation.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/FutureVehicleCorporation.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/FutureVehicleCorporation.java rename to patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/FutureVehicleCorporation.java diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/FutureVehicleElectricCar.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/FutureVehicleElectricCar.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/FutureVehicleElectricCar.java rename to patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/FutureVehicleElectricCar.java diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/FutureVehicleMotorcycle.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/FutureVehicleMotorcycle.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/FutureVehicleMotorcycle.java rename to patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/FutureVehicleMotorcycle.java diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/MotorVehicle.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/MotorVehicle.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/MotorVehicle.java rename to patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/MotorVehicle.java diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/NextGenCorporation.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/NextGenCorporation.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/NextGenCorporation.java rename to patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/NextGenCorporation.java diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/NextGenElectricCar.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/NextGenElectricCar.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/NextGenElectricCar.java rename to patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/NextGenElectricCar.java diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/NextGenMotorcycle.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/NextGenMotorcycle.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/abstract_factory/NextGenMotorcycle.java rename to patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/abstract_factory/NextGenMotorcycle.java diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/method/Car.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/method/Car.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/method/Car.java rename to patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/method/Car.java diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/method/CarFactory.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/method/CarFactory.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/method/CarFactory.java rename to patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/method/CarFactory.java diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/method/MotorVehicle.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/method/MotorVehicle.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/method/MotorVehicle.java rename to patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/method/MotorVehicle.java diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/method/MotorVehicleFactory.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/method/MotorVehicleFactory.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/method/MotorVehicleFactory.java rename to patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/method/MotorVehicleFactory.java diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/method/Motorcycle.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/method/Motorcycle.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/method/Motorcycle.java rename to patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/method/Motorcycle.java diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/method/MotorcycleFactory.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/method/MotorcycleFactory.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factory_pattern/method/MotorcycleFactory.java rename to patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/factory_pattern/method/MotorcycleFactory.java diff --git a/patterns-modules/design-patterns-creational/src/test/java/com/baeldung/factory_pattern/abstract_factory/AbstractFactoryUnitTest.java b/patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/factory_pattern/abstract_factory/AbstractFactoryUnitTest.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/test/java/com/baeldung/factory_pattern/abstract_factory/AbstractFactoryUnitTest.java rename to patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/factory_pattern/abstract_factory/AbstractFactoryUnitTest.java diff --git a/patterns-modules/design-patterns-creational/src/test/java/com/baeldung/factory_pattern/method/FactoryMethodUnitTest.java b/patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/factory_pattern/method/FactoryMethodUnitTest.java similarity index 100% rename from patterns-modules/design-patterns-creational/src/test/java/com/baeldung/factory_pattern/method/FactoryMethodUnitTest.java rename to patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/factory_pattern/method/FactoryMethodUnitTest.java diff --git a/patterns-modules/pom.xml b/patterns-modules/pom.xml index 4c020734bf..00625a9df3 100644 --- a/patterns-modules/pom.xml +++ b/patterns-modules/pom.xml @@ -19,6 +19,7 @@ design-patterns-behavioral-2 design-patterns-cloud design-patterns-creational + design-patterns-creational-2 design-patterns-functional design-patterns-structural dip From f8a341aaa80ab1ceba984f462c60fc05d0ae0aa1 Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Fri, 2 Dec 2022 00:48:50 +0100 Subject: [PATCH 078/592] BAEL-5908: Single.just vs fromCallable --- rxjava-modules/rxjava-core-2/README.md | 5 ++ rxjava-modules/rxjava-core-2/pom.xml | 16 +++++ .../justvscallable/EmployeeRepository.java | 5 ++ .../src/main/resources/logback.xml | 13 ++++ .../EmployeeRepositoryTest.java | 70 +++++++++++++++++++ 5 files changed, 109 insertions(+) create mode 100644 rxjava-modules/rxjava-core-2/README.md create mode 100644 rxjava-modules/rxjava-core-2/pom.xml create mode 100644 rxjava-modules/rxjava-core-2/src/main/java/com/baeldung/rxjava/justvscallable/EmployeeRepository.java create mode 100644 rxjava-modules/rxjava-core-2/src/main/resources/logback.xml create mode 100644 rxjava-modules/rxjava-core-2/src/test/java/com/baeldung/rxjava/justvscallable/EmployeeRepositoryTest.java diff --git a/rxjava-modules/rxjava-core-2/README.md b/rxjava-modules/rxjava-core-2/README.md new file mode 100644 index 0000000000..72c9fba62c --- /dev/null +++ b/rxjava-modules/rxjava-core-2/README.md @@ -0,0 +1,5 @@ +## RxJava + +This module contains articles about RxJava. + +### Relevant articles: diff --git a/rxjava-modules/rxjava-core-2/pom.xml b/rxjava-modules/rxjava-core-2/pom.xml new file mode 100644 index 0000000000..ccadf38ba3 --- /dev/null +++ b/rxjava-modules/rxjava-core-2/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + rxjava-core-2 + 1.0-SNAPSHOT + rxjava-core-2 + + + com.baeldung.rxjava-modules + rxjava-modules + 0.0.1-SNAPSHOT + + + \ No newline at end of file diff --git a/rxjava-modules/rxjava-core-2/src/main/java/com/baeldung/rxjava/justvscallable/EmployeeRepository.java b/rxjava-modules/rxjava-core-2/src/main/java/com/baeldung/rxjava/justvscallable/EmployeeRepository.java new file mode 100644 index 0000000000..03d95e2c8a --- /dev/null +++ b/rxjava-modules/rxjava-core-2/src/main/java/com/baeldung/rxjava/justvscallable/EmployeeRepository.java @@ -0,0 +1,5 @@ +package com.baeldung.rxjava.justvscallable; + +public interface EmployeeRepository { + String findById(Long id); +} diff --git a/rxjava-modules/rxjava-core-2/src/main/resources/logback.xml b/rxjava-modules/rxjava-core-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/rxjava-modules/rxjava-core-2/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/rxjava-modules/rxjava-core-2/src/test/java/com/baeldung/rxjava/justvscallable/EmployeeRepositoryTest.java b/rxjava-modules/rxjava-core-2/src/test/java/com/baeldung/rxjava/justvscallable/EmployeeRepositoryTest.java new file mode 100644 index 0000000000..0b1f98d50f --- /dev/null +++ b/rxjava-modules/rxjava-core-2/src/test/java/com/baeldung/rxjava/justvscallable/EmployeeRepositoryTest.java @@ -0,0 +1,70 @@ +package com.baeldung.rxjava.justvscallable; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.times; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import rx.Single; +import rx.observers.TestSubscriber; + +class EmployeeRepositoryTest { + + public EmployeeRepository repository = mock(EmployeeRepository.class); + + @BeforeEach + public void beforeEach() { + reset(repository); + } + + @Test + void givenNoSubscriber_whenUsingJust_thenDataIsFetched() { + Mockito.when(repository.findById(123L)) + .thenReturn("John Doe"); + + Single employee = Single.just(repository.findById(123L)); + + Mockito.verify(repository, times(1)) + .findById(123L); + } + + @Test + void givenASubscriber_whenUsingJust_thenReturnTheCorrectValue() { + TestSubscriber testSubscriber = new TestSubscriber<>(); + Mockito.when(repository.findById(123L)) + .thenReturn("John Doe"); + + Single employee = Single.just(repository.findById(123L)); + employee.subscribe(testSubscriber); + + testSubscriber.assertValue("John Doe"); + testSubscriber.assertCompleted(); + } + + @Test + void givenNoSubscriber_whenUsingFromCallable_thenNoDataIsFetched() { + Single employee = Single.fromCallable(() -> repository.findById(123L)); + + Mockito.verify(repository, never()) + .findById(123L); + } + + @Test + void givenASubscriber_whenUsingFromCallable_thenReturnCorrectValue() { + TestSubscriber testSubscriber = new TestSubscriber<>(); + Mockito.when(repository.findById(123L)) + .thenReturn("John Doe"); + + Single employee = Single.fromCallable(() -> repository.findById(123L)); + employee.subscribe(testSubscriber); + + Mockito.verify(repository, times(1)) + .findById(123L); + testSubscriber.assertCompleted(); + testSubscriber.assertValue("John Doe"); + } +} \ No newline at end of file From 490425adea11350e217160275877ce60704fa714 Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Fri, 2 Dec 2022 00:54:09 +0100 Subject: [PATCH 079/592] BAEL-5908: updated test class name --- ...yeeRepositoryTest.java => SingleJustVsFromCallableTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename rxjava-modules/rxjava-core-2/src/test/java/com/baeldung/rxjava/justvscallable/{EmployeeRepositoryTest.java => SingleJustVsFromCallableTest.java} (98%) diff --git a/rxjava-modules/rxjava-core-2/src/test/java/com/baeldung/rxjava/justvscallable/EmployeeRepositoryTest.java b/rxjava-modules/rxjava-core-2/src/test/java/com/baeldung/rxjava/justvscallable/SingleJustVsFromCallableTest.java similarity index 98% rename from rxjava-modules/rxjava-core-2/src/test/java/com/baeldung/rxjava/justvscallable/EmployeeRepositoryTest.java rename to rxjava-modules/rxjava-core-2/src/test/java/com/baeldung/rxjava/justvscallable/SingleJustVsFromCallableTest.java index 0b1f98d50f..d0de86fed8 100644 --- a/rxjava-modules/rxjava-core-2/src/test/java/com/baeldung/rxjava/justvscallable/EmployeeRepositoryTest.java +++ b/rxjava-modules/rxjava-core-2/src/test/java/com/baeldung/rxjava/justvscallable/SingleJustVsFromCallableTest.java @@ -12,7 +12,7 @@ import org.mockito.Mockito; import rx.Single; import rx.observers.TestSubscriber; -class EmployeeRepositoryTest { +class SingleJustVsFromCallableTest { public EmployeeRepository repository = mock(EmployeeRepository.class); From 998415cd471f02142ad81976e144bd1f475ebb1f Mon Sep 17 00:00:00 2001 From: freelansam Date: Fri, 2 Dec 2022 18:45:30 +0530 Subject: [PATCH 080/592] JAVA-16301: Check Article Code Matches GitHub --- .../model/Vehicle.java | 6 +++ .../main/java/com/baeldung/enums/Pizza.java | 9 +++++ .../com/baeldung/enums/PizzaUnitTest.java | 2 +- .../com/baeldung/reduce/entities/Rating.java | 39 +++++++++++++++++++ .../com/baeldung/reduce/entities/Review.java | 28 +++++++++++++ .../baeldung/s/{GoodBook.java => Book.java} | 2 +- .../cascading/CasCadeTypeUnitTest.java | 17 ++++---- .../repository/UserRepository.java | 4 ++ .../CircularDependencyIntegrationTest.java | 5 +++ .../main/java/com/baeldung/sample/Config.java | 22 +++++++++++ .../java/com/baeldung/sample/Employee.java | 20 ++++++++++ .../baeldung/mutation/PalindromeUnitTest.java | 8 ++-- 12 files changed, 149 insertions(+), 13 deletions(-) create mode 100644 core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/Rating.java create mode 100644 core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/Review.java rename patterns-modules/solid/src/main/java/com/baeldung/s/{GoodBook.java => Book.java} (94%) create mode 100644 spring-di/src/main/java/com/baeldung/sample/Config.java create mode 100644 spring-di/src/main/java/com/baeldung/sample/Employee.java diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java index b0bdd63c2c..c91d76345d 100644 --- a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java +++ b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java @@ -19,4 +19,10 @@ public interface Vehicle { static int getHorsePower(int rpm, int torque) { return (rpm * torque) / 5252; } + + double getSpeed(); + + default double getSpeedInKMH(double speed) { + return speed * 1.60934; + } } \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/enums/Pizza.java b/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/enums/Pizza.java index bad134bf00..a97f9eac57 100644 --- a/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/enums/Pizza.java +++ b/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/enums/Pizza.java @@ -84,5 +84,14 @@ public class Pizza { this.setStatus(PizzaStatusEnum.DELIVERED); } } + + public int getDeliveryTimeInDays() { + switch (status) { + case ORDERED: return 5; + case READY: return 2; + case DELIVERED: return 0; + } + return 0; + } } \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/enums/PizzaUnitTest.java b/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/enums/PizzaUnitTest.java index 70bfe168dd..e1f99e2173 100644 --- a/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/enums/PizzaUnitTest.java +++ b/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/enums/PizzaUnitTest.java @@ -70,7 +70,7 @@ public class PizzaUnitTest { } @Test - public void whenDelivered_thenPizzaGetsDeliveredAndStatusChanges() { + public void givenPizaOrder_whenDelivered_thenPizzaGetsDeliveredAndStatusChanges() { Pizza pz = new Pizza(); pz.setStatus(Pizza.PizzaStatusEnum.READY); pz.deliver(); 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-2/src/main/java/com/baeldung/reduce/entities/Rating.java new file mode 100644 index 0000000000..566691d442 --- /dev/null +++ b/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/Rating.java @@ -0,0 +1,39 @@ +package com.baeldung.reduce.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-streams-2/src/main/java/com/baeldung/reduce/entities/Review.java b/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/Review.java new file mode 100644 index 0000000000..b889a5f154 --- /dev/null +++ b/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/Review.java @@ -0,0 +1,28 @@ +package com.baeldung.reduce.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/patterns-modules/solid/src/main/java/com/baeldung/s/GoodBook.java b/patterns-modules/solid/src/main/java/com/baeldung/s/Book.java similarity index 94% rename from patterns-modules/solid/src/main/java/com/baeldung/s/GoodBook.java rename to patterns-modules/solid/src/main/java/com/baeldung/s/Book.java index 04606bcdcd..8e26c88655 100644 --- a/patterns-modules/solid/src/main/java/com/baeldung/s/GoodBook.java +++ b/patterns-modules/solid/src/main/java/com/baeldung/s/Book.java @@ -1,6 +1,6 @@ package com.baeldung.s; -public class GoodBook { +public class Book { private String name; private String author; diff --git a/persistence-modules/jpa-hibernate-cascade-type/src/test/java/com/baeldung/cascading/CasCadeTypeUnitTest.java b/persistence-modules/jpa-hibernate-cascade-type/src/test/java/com/baeldung/cascading/CasCadeTypeUnitTest.java index a196bdac12..88cc920a92 100644 --- a/persistence-modules/jpa-hibernate-cascade-type/src/test/java/com/baeldung/cascading/CasCadeTypeUnitTest.java +++ b/persistence-modules/jpa-hibernate-cascade-type/src/test/java/com/baeldung/cascading/CasCadeTypeUnitTest.java @@ -34,7 +34,7 @@ public class CasCadeTypeUnitTest { } @Test - public void testPersist() { + public void whenParentSavedThenChildSaved() { Person person = new Person(); Address address = new Address(); address.setPerson(person); @@ -45,7 +45,7 @@ public class CasCadeTypeUnitTest { } @Test - public void testMerge() { + public void whenParentSavedThenMerged() { int addressId; Person person = buildPerson("devender"); Address address = buildAddress(person); @@ -64,7 +64,7 @@ public class CasCadeTypeUnitTest { } @Test - public void testRemove() { + public void whenParentRemovedThenChildRemoved() { int personId; Person person = buildPerson("devender"); Address address = buildAddress(person); @@ -80,12 +80,13 @@ public class CasCadeTypeUnitTest { } @Test - public void testDetach() { + public void whenParentDetachedThenChildDetached() { Person person = buildPerson("devender"); Address address = buildAddress(person); person.setAddresses(Arrays.asList(address)); session.persist(person); session.flush(); + Assertions.assertThat(session.contains(person)).isTrue(); Assertions.assertThat(session.contains(address)).isTrue(); @@ -95,12 +96,13 @@ public class CasCadeTypeUnitTest { } @Test - public void testLock() { + public void whenDetachedAndLockedThenBothReattached() { Person person = buildPerson("devender"); Address address = buildAddress(person); person.setAddresses(Arrays.asList(address)); session.persist(person); session.flush(); + Assertions.assertThat(session.contains(person)).isTrue(); Assertions.assertThat(session.contains(address)).isTrue(); @@ -116,7 +118,7 @@ public class CasCadeTypeUnitTest { } @Test - public void testRefresh() { + public void whenParentRefreshedThenChildRefreshed() { Person person = buildPerson("devender"); Address address = buildAddress(person); person.setAddresses(Arrays.asList(address)); @@ -125,12 +127,13 @@ public class CasCadeTypeUnitTest { person.setName("Devender Kumar"); address.setHouseNumber(24); session.refresh(person); + Assertions.assertThat(person.getName()).isEqualTo("devender"); Assertions.assertThat(address.getHouseNumber()).isEqualTo(23); } @Test - public void testReplicate() { + public void whenParentReplicatedThenChildReplicated() { Person person = buildPerson("devender"); person.setId(2); Address address = buildAddress(person); diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java index e613ee1531..76cdf41d81 100644 --- a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java @@ -56,5 +56,9 @@ public interface UserRepository extends JpaRepository { List findByNameOrderByName(String name); List findByNameOrderByNameDesc(String name); + + List findByNameIsNotNull(); + + List findByNameOrderByNameAsc(String name); } diff --git a/spring-di-2/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java index 42847f4dd1..5ddd47bc28 100644 --- a/spring-di-2/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java +++ b/spring-di-2/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java @@ -32,4 +32,9 @@ public class CircularDependencyIntegrationTest { Assert.assertEquals("Hi!", circA.getCircB().getMessage()); } + + @Test + public void givenCircularDependency_whenConstructorInjection_thenItFails() { + // Empty test; we just want the context to load + } } diff --git a/spring-di/src/main/java/com/baeldung/sample/Config.java b/spring-di/src/main/java/com/baeldung/sample/Config.java new file mode 100644 index 0000000000..9d13573c8e --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/sample/Config.java @@ -0,0 +1,22 @@ +package com.baeldung.sample; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +@Configuration +@ComponentScan(basePackages="com.baeldung.primary") +public class Config { + + @Bean + public Employee johnEmployee(){ + return new Employee("John"); + } + + @Bean + @Primary + public Employee tonyEmployee(){ + return new Employee("Tony"); + } +} diff --git a/spring-di/src/main/java/com/baeldung/sample/Employee.java b/spring-di/src/main/java/com/baeldung/sample/Employee.java new file mode 100644 index 0000000000..a150aeb813 --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/sample/Employee.java @@ -0,0 +1,20 @@ +package com.baeldung.sample; + +/** + * Created by Gebruiker on 7/17/2018. + */ +public class Employee { + + private String name; + + public Employee(String name) { + this.name = name; + } + + @Override + public String toString() { + return "Employee{" + + "name='" + name + '\'' + + '}'; + } +} diff --git a/testing-modules/testing-libraries/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java index 207077158e..92ddda2b6c 100644 --- a/testing-modules/testing-libraries/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java +++ b/testing-modules/testing-libraries/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java @@ -9,25 +9,25 @@ import com.baeldung.mutation.Palindrome; public class PalindromeUnitTest { @Test - public void whenEmptyString_thanAccept() { + public void whenEmptyString_thenAccept() { Palindrome palindromeTester = new Palindrome(); assertTrue(palindromeTester.isPalindrome("")); } @Test - public void whenPalindrom_thanAccept() { + public void whenPalindrom_thenAccept() { Palindrome palindromeTester = new Palindrome(); assertTrue(palindromeTester.isPalindrome("noon")); } @Test - public void whenNotPalindrom_thanReject(){ + public void whenNotPalindrom_thenReject(){ Palindrome palindromeTester = new Palindrome(); assertFalse(palindromeTester.isPalindrome("box")); } @Test - public void whenNearPalindrom_thanReject(){ + public void whenNearPalindrom_thenReject(){ Palindrome palindromeTester = new Palindrome(); assertFalse(palindromeTester.isPalindrome("neon")); } From 290581f15bfe2a47df5c57fa68258b0cda6c9573 Mon Sep 17 00:00:00 2001 From: freelansam Date: Fri, 2 Dec 2022 18:53:08 +0530 Subject: [PATCH 081/592] JAVA-16301: Check Article Code Matches GitHub --- .../baeldung/defaultstaticinterfacemethods/model/Car.java | 5 +++++ .../defaultstaticinterfacemethods/model/Motorbike.java | 5 +++++ .../defaultstaticinterfacemethods/model/MultiAlarmCar.java | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java index 6ec6507e59..92dbec07e7 100644 --- a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java +++ b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java @@ -22,4 +22,9 @@ public class Car implements Vehicle { public String slowDown() { return "The car is slowing down."; } + + @Override + public double getSpeed() { + return 0; + } } \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java index b1de93059a..c3e17f63d5 100644 --- a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java +++ b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java @@ -22,4 +22,9 @@ public class Motorbike implements Vehicle { public String slowDown() { return "The motorbike is slowing down."; } + + @Override + public double getSpeed() { + return 0; + } } \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java index abf329fafd..85398ec488 100644 --- a/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java +++ b/core-java-modules/core-java-lang-oop-modifiers/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java @@ -32,4 +32,9 @@ public class MultiAlarmCar implements Vehicle, Alarm { public String turnAlarmOff() { return Vehicle.super.turnAlarmOff() + " " + Alarm.super.turnAlarmOff(); } + + @Override + public double getSpeed() { + return 0; + } } \ No newline at end of file From 5f939afaf09cd7c0e7ca6011868cc30d24b00941 Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Fri, 2 Dec 2022 18:50:50 +0100 Subject: [PATCH 082/592] BAEL-5931: Default Capacity of ArrayList (#13110) --- .../DefaultArrayListCapacity.java | 20 +++++++++++ .../DefaultArrayListCapacityUnitTest.java | 33 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/defaultarraylistcapacity/DefaultArrayListCapacity.java create mode 100644 core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/defaultarraylistcapacity/DefaultArrayListCapacityUnitTest.java diff --git a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/defaultarraylistcapacity/DefaultArrayListCapacity.java b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/defaultarraylistcapacity/DefaultArrayListCapacity.java new file mode 100644 index 0000000000..34f202a4dd --- /dev/null +++ b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/defaultarraylistcapacity/DefaultArrayListCapacity.java @@ -0,0 +1,20 @@ +package com.baeldung.defaultarraylistcapacity; + +import java.lang.reflect.Field; +import java.util.ArrayList; + +public class DefaultArrayListCapacity { + + public static int getDefaultCapacity(ArrayList arrayList) throws Exception { + + if (arrayList == null) { + return 0; + } + + Field field = ArrayList.class.getDeclaredField("elementData"); + field.setAccessible(true); + + return ((Object[]) field.get(arrayList)).length; + } + +} diff --git a/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/defaultarraylistcapacity/DefaultArrayListCapacityUnitTest.java b/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/defaultarraylistcapacity/DefaultArrayListCapacityUnitTest.java new file mode 100644 index 0000000000..0690e93879 --- /dev/null +++ b/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/defaultarraylistcapacity/DefaultArrayListCapacityUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.defaultarraylistcapacity; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; + +import org.junit.jupiter.api.Test; + +public class DefaultArrayListCapacityUnitTest { + + @Test + void givenEmptyArrayList_whenGetDefaultCapacity_thenReturnZero() throws Exception { + + ArrayList myList = new ArrayList<>(); + int defaultCapacity = DefaultArrayListCapacity.getDefaultCapacity(myList); + + assertEquals(0, defaultCapacity); + + } + + @Test + void givenEmptyArrayList_whenAddItemAndGetDefaultCapacity_thenReturn10() throws Exception { + + ArrayList myList = new ArrayList<>(); + myList.add("ITEM 1"); + + int defaultCapacity = DefaultArrayListCapacity.getDefaultCapacity(myList); + + assertEquals(10, defaultCapacity); + + } + +} From 16a81bf9f9474556a73db1846933f57d27475070 Mon Sep 17 00:00:00 2001 From: h_sharifi Date: Sat, 3 Dec 2022 10:27:08 +0330 Subject: [PATCH 083/592] #BAEL-5948:rename module name in parent pom --- spring-boot-modules/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index f17686752a..7fb14ed633 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -50,7 +50,7 @@ spring-boot-keycloak-2 spring-boot-libraries spring-boot-libraries-2 - spring-boot-libraries-3 + spring-boot-process-automation spring-boot-logging-log4j2 spring-boot-mvc spring-boot-mvc-2 From 010163e5411851eef185e5b599a481b65ce68b59 Mon Sep 17 00:00:00 2001 From: h_sharifi Date: Sat, 3 Dec 2022 10:28:19 +0330 Subject: [PATCH 084/592] #BAEL-5948:rename module name from spring-boot-libraries-3 to spring-boot-process-automation --- .../.gitignore | 0 .../pom.xml | 2 +- .../src/main/java/com/baeldung/camunda/CamundaApplication.java | 0 .../com/baeldung/camunda/task/CalculateInterestService.java | 0 .../src/main/resources/application.yaml | 0 .../src/main/resources/loanProcess.bpmn | 0 6 files changed, 1 insertion(+), 1 deletion(-) rename spring-boot-modules/{spring-boot-libraries-3 => spring-boot-process-automation}/.gitignore (100%) rename spring-boot-modules/{spring-boot-libraries-3 => spring-boot-process-automation}/pom.xml (96%) rename spring-boot-modules/{spring-boot-libraries-3 => spring-boot-process-automation}/src/main/java/com/baeldung/camunda/CamundaApplication.java (100%) rename spring-boot-modules/{spring-boot-libraries-3 => spring-boot-process-automation}/src/main/java/com/baeldung/camunda/task/CalculateInterestService.java (100%) rename spring-boot-modules/{spring-boot-libraries-3 => spring-boot-process-automation}/src/main/resources/application.yaml (100%) rename spring-boot-modules/{spring-boot-libraries-3 => spring-boot-process-automation}/src/main/resources/loanProcess.bpmn (100%) diff --git a/spring-boot-modules/spring-boot-libraries-3/.gitignore b/spring-boot-modules/spring-boot-process-automation/.gitignore similarity index 100% rename from spring-boot-modules/spring-boot-libraries-3/.gitignore rename to spring-boot-modules/spring-boot-process-automation/.gitignore diff --git a/spring-boot-modules/spring-boot-libraries-3/pom.xml b/spring-boot-modules/spring-boot-process-automation/pom.xml similarity index 96% rename from spring-boot-modules/spring-boot-libraries-3/pom.xml rename to spring-boot-modules/spring-boot-process-automation/pom.xml index 0a924a46c2..8ceb6c9a5c 100644 --- a/spring-boot-modules/spring-boot-libraries-3/pom.xml +++ b/spring-boot-modules/spring-boot-process-automation/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-libraries-3 + spring-boot-process-automation spring-boot-modules diff --git a/spring-boot-modules/spring-boot-libraries-3/src/main/java/com/baeldung/camunda/CamundaApplication.java b/spring-boot-modules/spring-boot-process-automation/src/main/java/com/baeldung/camunda/CamundaApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-libraries-3/src/main/java/com/baeldung/camunda/CamundaApplication.java rename to spring-boot-modules/spring-boot-process-automation/src/main/java/com/baeldung/camunda/CamundaApplication.java diff --git a/spring-boot-modules/spring-boot-libraries-3/src/main/java/com/baeldung/camunda/task/CalculateInterestService.java b/spring-boot-modules/spring-boot-process-automation/src/main/java/com/baeldung/camunda/task/CalculateInterestService.java similarity index 100% rename from spring-boot-modules/spring-boot-libraries-3/src/main/java/com/baeldung/camunda/task/CalculateInterestService.java rename to spring-boot-modules/spring-boot-process-automation/src/main/java/com/baeldung/camunda/task/CalculateInterestService.java diff --git a/spring-boot-modules/spring-boot-libraries-3/src/main/resources/application.yaml b/spring-boot-modules/spring-boot-process-automation/src/main/resources/application.yaml similarity index 100% rename from spring-boot-modules/spring-boot-libraries-3/src/main/resources/application.yaml rename to spring-boot-modules/spring-boot-process-automation/src/main/resources/application.yaml diff --git a/spring-boot-modules/spring-boot-libraries-3/src/main/resources/loanProcess.bpmn b/spring-boot-modules/spring-boot-process-automation/src/main/resources/loanProcess.bpmn similarity index 100% rename from spring-boot-modules/spring-boot-libraries-3/src/main/resources/loanProcess.bpmn rename to spring-boot-modules/spring-boot-process-automation/src/main/resources/loanProcess.bpmn From bcfa1ee4527279011b208927f98474939ded00d2 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Sat, 3 Dec 2022 16:50:12 +0530 Subject: [PATCH 085/592] Update README.md --- testing-modules/junit-5/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing-modules/junit-5/README.md b/testing-modules/junit-5/README.md index 9f1fd53ee5..6bd95cd9fc 100644 --- a/testing-modules/junit-5/README.md +++ b/testing-modules/junit-5/README.md @@ -8,4 +8,4 @@ - [Determine the Execution Time of JUnit Tests](https://www.baeldung.com/junit-test-execution-time) - [@BeforeAll and @AfterAll in Non-Static Methods](https://www.baeldung.com/java-beforeall-afterall-non-static) - [The java.lang.NoClassDefFoundError in JUnit](https://www.baeldung.com/junit-noclassdeffounderror) -- [assertAll() vs Multiple Assertions in JUnit5](https://github.com/eugenp/tutorials/tree/master/testing-modules/junit-5) +- [assertAll() vs Multiple Assertions in JUnit5](https://www.baeldung.com/junit5-assertall-vs-multiple-assertions) From 0f3c81c248eadd9f5fc0cf4f7659abcde3586d8e Mon Sep 17 00:00:00 2001 From: Daniel Strmecki Date: Sat, 3 Dec 2022 16:00:24 +0100 Subject: [PATCH 086/592] Feature/bael 5756 choose api (#13055) * BAEL-5756: Rest controller * BAEL-5756: GraphQL controller (without tests) * BAEL-5756: Fix GraphQL test * BAEL-5756: Fix GraphQL test 2 * BAEL-5756: GRPC working * BAEL-5756: GRPC with Spring Boot * BAEL-5756: Books proto service * BAEL-5756: Fix grpc integration test * BAEL-5756: Refactor * BAEL-5756: Revert some changes --- .../spring-boot-graphql/pom.xml | 68 +++++++++++++++++++ .../com/baeldung/chooseapi/ChooseApiApp.java | 14 ++++ .../controllers/BooksControllerGraphQL.java | 25 +++++++ .../controllers/BooksControllerRest.java | 24 +++++++ .../com/baeldung/chooseapi/dtos/Author.java | 40 +++++++++++ .../com/baeldung/chooseapi/dtos/Book.java | 46 +++++++++++++ .../chooseapi/grpc/BooksServiceGrpc.java | 32 +++++++++ .../chooseapi/grpc/GrpcBooksMapper.java | 26 +++++++ .../chooseapi/services/BooksService.java | 26 +++++++ .../src/main/proto/BooksService.proto | 23 +++++++ .../main/resources/application-chooseapi.yml | 9 +++ .../resources/chooseapi/chooseapi.graphqls | 14 ++++ .../resources/graphql-vs-rest/schema.graphqls | 1 - ...BooksControllerGraphQLIntegrationTest.java | 33 +++++++++ .../BooksControllerRestIntegrationTest.java | 36 ++++++++++ .../grpc/BooksServiceGrpcIntegrationTest.java | 55 +++++++++++++++ .../grpc/GrpcIntegrationTestConfig.java | 28 ++++++++ .../graphql-test/books_expected_response.json | 26 +++++++ 18 files changed, 525 insertions(+), 1 deletion(-) create mode 100644 spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/ChooseApiApp.java create mode 100644 spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/controllers/BooksControllerGraphQL.java create mode 100644 spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/controllers/BooksControllerRest.java create mode 100644 spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/dtos/Author.java create mode 100644 spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/dtos/Book.java create mode 100644 spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/grpc/BooksServiceGrpc.java create mode 100644 spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/grpc/GrpcBooksMapper.java create mode 100644 spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/services/BooksService.java create mode 100644 spring-boot-modules/spring-boot-graphql/src/main/proto/BooksService.proto create mode 100644 spring-boot-modules/spring-boot-graphql/src/main/resources/application-chooseapi.yml create mode 100644 spring-boot-modules/spring-boot-graphql/src/main/resources/chooseapi/chooseapi.graphqls create mode 100644 spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/controllers/BooksControllerGraphQLIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/controllers/BooksControllerRestIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/grpc/BooksServiceGrpcIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/grpc/GrpcIntegrationTestConfig.java create mode 100644 spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-test/books_expected_response.json diff --git a/spring-boot-modules/spring-boot-graphql/pom.xml b/spring-boot-modules/spring-boot-graphql/pom.xml index 32399f4123..628babbd3f 100644 --- a/spring-boot-modules/spring-boot-graphql/pom.xml +++ b/spring-boot-modules/spring-boot-graphql/pom.xml @@ -13,6 +13,47 @@ 1.0.0-SNAPSHOT + + + + kr.motd.maven + os-maven-plugin + 1.7.0 + + + + + org.xolstice.maven.plugins + protobuf-maven-plugin + ${protobuf-plugin.version} + + com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier} + grpc-java + io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier} + + + + + compile + compile-custom + + + + + + + + + 3.19.2 + 0.6.1 + 1.43.2 + 2.13.1.RELEASE + 1.5.1 + 1.3.5 + 1.6.2 + 3.3.2 + + org.springframework.boot @@ -34,6 +75,27 @@ com.h2database h2 + + io.grpc + grpc-stub + ${grpc.version} + + + io.grpc + grpc-protobuf + ${grpc.version} + + + jakarta.annotation + jakarta.annotation-api + ${jakarta.annotation.version} + true + + + net.devh + grpc-spring-boot-starter + ${grpc.spring.version} + org.springframework.boot spring-boot-starter-test @@ -49,6 +111,12 @@ spring-graphql-test test + + org.skyscreamer + jsonassert + ${jsonassert.version} + test + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/ChooseApiApp.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/ChooseApiApp.java new file mode 100644 index 0000000000..ded6a92597 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/ChooseApiApp.java @@ -0,0 +1,14 @@ +package com.baeldung.chooseapi; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ChooseApiApp { + + public static void main(String[] args) { + System.setProperty("spring.profiles.default", "chooseapi"); + SpringApplication.run(ChooseApiApp.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/controllers/BooksControllerGraphQL.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/controllers/BooksControllerGraphQL.java new file mode 100644 index 0000000000..1e5f226d45 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/controllers/BooksControllerGraphQL.java @@ -0,0 +1,25 @@ +package com.baeldung.chooseapi.controllers; + +import com.baeldung.chooseapi.dtos.Book; +import com.baeldung.chooseapi.services.BooksService; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import org.springframework.graphql.data.method.annotation.QueryMapping; + +@RestController +public class BooksControllerGraphQL { + + private final BooksService booksService; + + public BooksControllerGraphQL(BooksService booksService) { + this.booksService = booksService; + } + + @QueryMapping + public List books() { + return booksService.getBooks(); + } + +} + diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/controllers/BooksControllerRest.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/controllers/BooksControllerRest.java new file mode 100644 index 0000000000..78cc64b2f4 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/controllers/BooksControllerRest.java @@ -0,0 +1,24 @@ +package com.baeldung.chooseapi.controllers; + +import com.baeldung.chooseapi.dtos.Book; +import com.baeldung.chooseapi.services.BooksService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +public class BooksControllerRest { + + private final BooksService booksService; + + public BooksControllerRest(BooksService booksService) { + this.booksService = booksService; + } + + @GetMapping("/rest/books") + public List books() { + return booksService.getBooks(); + } + +} diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/dtos/Author.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/dtos/Author.java new file mode 100644 index 0000000000..498f727ec1 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/dtos/Author.java @@ -0,0 +1,40 @@ +package com.baeldung.chooseapi.dtos; + +import java.util.Objects; + +public class Author { + + private final String firstName; + private final String lastName; + + public Author(String firstName, String lastName) { + this.firstName = firstName; + 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; + } + Author author = (Author) o; + return firstName.equals(author.firstName) && lastName.equals(author.lastName); + } + + @Override + public int hashCode() { + return Objects.hash(firstName, lastName); + } + +} diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/dtos/Book.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/dtos/Book.java new file mode 100644 index 0000000000..0fd752c1ba --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/dtos/Book.java @@ -0,0 +1,46 @@ +package com.baeldung.chooseapi.dtos; + +import java.util.Objects; + +public class Book { + + private final String title; + private final Author author; + private final int year; + + public Book(String title, Author author, int year) { + this.title = title; + this.author = author; + this.year = year; + } + + public String getTitle() { + return title; + } + + public Author getAuthor() { + return author; + } + + public int getYear() { + return year; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Book book = (Book) o; + return year == book.year && title.equals(book.title) && author.equals(book.author); + } + + @Override + public int hashCode() { + return Objects.hash(title, author, year); + } + +} diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/grpc/BooksServiceGrpc.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/grpc/BooksServiceGrpc.java new file mode 100644 index 0000000000..c0b70e2adf --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/grpc/BooksServiceGrpc.java @@ -0,0 +1,32 @@ +package com.baeldung.chooseapi.grpc; + +import com.baeldung.chooseapi.BooksServiceGrpc.BooksServiceImplBase; +import com.baeldung.chooseapi.BooksServiceOuterClass.BooksRequest; +import com.baeldung.chooseapi.BooksServiceOuterClass.BooksResponse; + +import com.baeldung.chooseapi.dtos.Book; +import com.baeldung.chooseapi.services.BooksService; +import io.grpc.stub.StreamObserver; +import net.devh.boot.grpc.server.service.GrpcService; + +import java.util.List; + +@GrpcService +public class BooksServiceGrpc extends BooksServiceImplBase { + + private final BooksService booksService; + + public BooksServiceGrpc(BooksService booksService) { + this.booksService = booksService; + } + + @Override + public void books(BooksRequest request, StreamObserver responseObserver) { + List books = booksService.getBooks(); + BooksResponse.Builder responseBuilder = BooksResponse.newBuilder(); + books.forEach(book -> responseBuilder.addBook(GrpcBooksMapper.mapBookToProto(book))); + responseObserver.onNext(responseBuilder.build()); + responseObserver.onCompleted(); + } + +} diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/grpc/GrpcBooksMapper.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/grpc/GrpcBooksMapper.java new file mode 100644 index 0000000000..f66fb9c16c --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/grpc/GrpcBooksMapper.java @@ -0,0 +1,26 @@ +package com.baeldung.chooseapi.grpc; + +import com.baeldung.chooseapi.BooksServiceOuterClass; +import com.baeldung.chooseapi.dtos.Author; +import com.baeldung.chooseapi.dtos.Book; + +public class GrpcBooksMapper { + + public static BooksServiceOuterClass.BookProto mapBookToProto(Book book) { + return BooksServiceOuterClass.BookProto.newBuilder() + .setTitle(book.getTitle()) + .setAuthor(BooksServiceOuterClass.AuthorProto.newBuilder() + .setFirstName(book.getAuthor().getFirstName()) + .setLastName(book.getAuthor().getLastName()) + .build()) + .setYear(book.getYear()) + .build(); + } + + public static Book mapProtoToBook(BooksServiceOuterClass.BookProto bookProto) { + return new Book(bookProto.getTitle(), + new Author(bookProto.getAuthor().getFirstName(), bookProto.getAuthor().getLastName()), + bookProto.getYear()); + } + +} diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/services/BooksService.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/services/BooksService.java new file mode 100644 index 0000000000..d9094f53fd --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/chooseapi/services/BooksService.java @@ -0,0 +1,26 @@ +package com.baeldung.chooseapi.services; + +import com.baeldung.chooseapi.dtos.Author; +import com.baeldung.chooseapi.dtos.Book; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Service +public class BooksService { + + private static final Author AUTHOR = new Author("Joanne", "Rowling"); + + private static final List BOOKS = new ArrayList<>(Arrays.asList( + new Book("Philosopher's Stone", AUTHOR, 1997), + new Book("Goblet of Fire", AUTHOR, 2000), + new Book("Deathly Hallows", AUTHOR, 2007) + )); + + public List getBooks() { + return BOOKS; + } + +} diff --git a/spring-boot-modules/spring-boot-graphql/src/main/proto/BooksService.proto b/spring-boot-modules/spring-boot-graphql/src/main/proto/BooksService.proto new file mode 100644 index 0000000000..2bd2bd719d --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/proto/BooksService.proto @@ -0,0 +1,23 @@ +syntax = "proto3"; +package com.baeldung.chooseapi; + +message BooksRequest {} + +message AuthorProto { + string firstName = 1; + string lastName = 2; +} + +message BookProto { + string title = 1; + AuthorProto author = 2; + int32 year = 3; +} + +message BooksResponse { + repeated BookProto book = 1; +} + +service BooksService { + rpc books(BooksRequest) returns (BooksResponse); +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-graphql/src/main/resources/application-chooseapi.yml b/spring-boot-modules/spring-boot-graphql/src/main/resources/application-chooseapi.yml new file mode 100644 index 0000000000..889842df9f --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/resources/application-chooseapi.yml @@ -0,0 +1,9 @@ +server: + port: 8082 + +spring: + graphql: + graphiql: + enabled: true + schema: + locations: classpath:chooseapi/ \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-graphql/src/main/resources/chooseapi/chooseapi.graphqls b/spring-boot-modules/spring-boot-graphql/src/main/resources/chooseapi/chooseapi.graphqls new file mode 100644 index 0000000000..5b0e991d48 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/resources/chooseapi/chooseapi.graphqls @@ -0,0 +1,14 @@ +type Author { + firstName: String! + lastName: String! +} + +type Book { + title: String! + year: Int! + author: Author! +} + +type Query { + books: [Book] +} diff --git a/spring-boot-modules/spring-boot-graphql/src/main/resources/graphql-vs-rest/schema.graphqls b/spring-boot-modules/spring-boot-graphql/src/main/resources/graphql-vs-rest/schema.graphqls index 520f26648c..e11897fa6c 100644 --- a/spring-boot-modules/spring-boot-graphql/src/main/resources/graphql-vs-rest/schema.graphqls +++ b/spring-boot-modules/spring-boot-graphql/src/main/resources/graphql-vs-rest/schema.graphqls @@ -43,7 +43,6 @@ input ProductUpdateModel { stock: Int } - # The Root Query for the application type Query { products(size: Int, page: Int): [Product]! diff --git a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/controllers/BooksControllerGraphQLIntegrationTest.java b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/controllers/BooksControllerGraphQLIntegrationTest.java new file mode 100644 index 0000000000..c1ce711388 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/controllers/BooksControllerGraphQLIntegrationTest.java @@ -0,0 +1,33 @@ +package com.baeldung.chooseapi.controllers; + +import com.baeldung.chooseapi.ChooseApiApp; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.graphql.test.tester.HttpGraphQlTester; +import org.springframework.test.context.ActiveProfiles; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = ChooseApiApp.class) +@ActiveProfiles("chooseapi") +class BooksControllerGraphQLIntegrationTest { + + @Autowired + private HttpGraphQlTester graphQlTester; + + @Test + void givenBooksServiceThatReturnThreeBooks_whenCallingGraphQLEndpoint_thenThreeBooksAreReturned() throws Exception { + String document = "query { books { title year author { firstName lastName }}}"; + Path expectedResponse = Paths.get("src/test/resources/graphql-test/books_expected_response.json"); + String expectedJson = new String(Files.readAllBytes(expectedResponse)); + + this.graphQlTester.document(document) + .execute() + .path("books") + .matchesJson(expectedJson); + } + +} diff --git a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/controllers/BooksControllerRestIntegrationTest.java b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/controllers/BooksControllerRestIntegrationTest.java new file mode 100644 index 0000000000..977a132653 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/controllers/BooksControllerRestIntegrationTest.java @@ -0,0 +1,36 @@ +package com.baeldung.chooseapi.controllers; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +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 java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +@SpringBootTest +@AutoConfigureMockMvc +class BooksControllerRestIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @Test + void givenBooksServiceThatReturnThreeBooks_whenCallingRestEndpoint_thenThreeBooksAreReturned() throws Exception { + Path expectedResponse = Paths.get("src/test/resources/graphql-test/books_expected_response.json"); + String expectedJson = new String(Files.readAllBytes(expectedResponse)); + + this.mockMvc.perform(get("/rest/books")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().json(expectedJson)); + } + +} diff --git a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/grpc/BooksServiceGrpcIntegrationTest.java b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/grpc/BooksServiceGrpcIntegrationTest.java new file mode 100644 index 0000000000..e446073cea --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/grpc/BooksServiceGrpcIntegrationTest.java @@ -0,0 +1,55 @@ +package com.baeldung.chooseapi.grpc; + +import com.baeldung.chooseapi.dtos.Book; +import com.fasterxml.jackson.databind.ObjectMapper; +import net.devh.boot.grpc.client.inject.GrpcClient; +import org.json.JSONException; +import org.junit.jupiter.api.Test; +import org.skyscreamer.jsonassert.JSONAssert; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; + +import com.baeldung.chooseapi.BooksServiceOuterClass.BooksRequest; +import com.baeldung.chooseapi.BooksServiceOuterClass.BooksResponse; + +import com.baeldung.chooseapi.BooksServiceGrpc.BooksServiceBlockingStub; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.stream.Collectors; + +@SpringBootTest(properties = { + "grpc.server.inProcessName=test", // Enable inProcess server + "grpc.server.port=-1", // Disable external server + "grpc.client.inProcess.address=in-process:test" // Configure the client to connect to the inProcess server +}) +@SpringJUnitConfig(GrpcIntegrationTestConfig.class) +@DirtiesContext // Ensures that the grpc-server is properly shutdown after each test +class BooksServiceGrpcIntegrationTest { + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + @GrpcClient("inProcess") + private BooksServiceBlockingStub booksServiceGrpc; + + @Test + @DirtiesContext + void givenBooksServiceThatReturnThreeBooks_whenCallingGrpcEndpoint_thenThreeBooksAreReturned() throws IOException, JSONException { + Path expectedResponse = Paths.get("src/test/resources/graphql-test/books_expected_response.json"); + String expectedJson = new String(Files.readAllBytes(expectedResponse)); + + BooksRequest request = BooksRequest.newBuilder().build(); + BooksResponse response = booksServiceGrpc.books(request); + + List books = response.getBookList().stream() + .map(GrpcBooksMapper::mapProtoToBook) + .collect(Collectors.toList()); + + JSONAssert.assertEquals(objectMapper.writeValueAsString(books), expectedJson, true); + } + +} diff --git a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/grpc/GrpcIntegrationTestConfig.java b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/grpc/GrpcIntegrationTestConfig.java new file mode 100644 index 0000000000..d70c6e46a5 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/grpc/GrpcIntegrationTestConfig.java @@ -0,0 +1,28 @@ +package com.baeldung.chooseapi.grpc; + +import com.baeldung.chooseapi.services.BooksService; +import net.devh.boot.grpc.client.autoconfigure.GrpcClientAutoConfiguration; +import net.devh.boot.grpc.server.autoconfigure.GrpcServerAutoConfiguration; +import net.devh.boot.grpc.server.autoconfigure.GrpcServerFactoryAutoConfiguration; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ImportAutoConfiguration({ + GrpcServerAutoConfiguration.class, // Create required server beans + GrpcServerFactoryAutoConfiguration.class, // Select server implementation + GrpcClientAutoConfiguration.class}) // Support @GrpcClient annotation +class GrpcIntegrationTestConfig { + + @Bean + BooksService booksService() { + return new BooksService(); + } + + @Bean + BooksServiceGrpc booksServiceGrpc() { + return new BooksServiceGrpc(booksService()); + } + +} diff --git a/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-test/books_expected_response.json b/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-test/books_expected_response.json new file mode 100644 index 0000000000..066795ee91 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-test/books_expected_response.json @@ -0,0 +1,26 @@ +[ + { + "title": "Philosopher's Stone", + "year": 1997, + "author": { + "firstName": "Joanne", + "lastName": "Rowling" + } + }, + { + "title": "Goblet of Fire", + "year": 2000, + "author": { + "firstName": "Joanne", + "lastName": "Rowling" + } + }, + { + "title": "Deathly Hallows", + "year": 2007, + "author": { + "firstName": "Joanne", + "lastName": "Rowling" + } + } +] \ No newline at end of file From 316cd48b48fdbc129e47db0d55a89f1a07d24a19 Mon Sep 17 00:00:00 2001 From: alemoles Date: Mon, 5 Dec 2022 04:02:24 -0300 Subject: [PATCH 087/592] BAEL-5960 - Functors in Java (#13125) --- .../functional/functors/EnumFunctor.java | 23 +++++++++ .../baeldung/functional/functors/Functor.java | 23 +++++++++ .../functional/functors/FunctorsUnitTest.java | 50 +++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 core-java-modules/core-java-functional/src/main/java/com/baeldung/functional/functors/EnumFunctor.java create mode 100644 core-java-modules/core-java-functional/src/main/java/com/baeldung/functional/functors/Functor.java create mode 100644 core-java-modules/core-java-functional/src/test/java/com/baeldung/functional/functors/FunctorsUnitTest.java diff --git a/core-java-modules/core-java-functional/src/main/java/com/baeldung/functional/functors/EnumFunctor.java b/core-java-modules/core-java-functional/src/main/java/com/baeldung/functional/functors/EnumFunctor.java new file mode 100644 index 0000000000..380ebf6708 --- /dev/null +++ b/core-java-modules/core-java-functional/src/main/java/com/baeldung/functional/functors/EnumFunctor.java @@ -0,0 +1,23 @@ +package com.baeldung.functional.functors; + +public enum EnumFunctor { + PLUS { + public int apply(int a, int b) { + return a + b; + } + }, MINUS { + public int apply(int a, int b) { + return a - b; + } + }, MULTIPLY { + public int apply(int a, int b) { + return a * b; + } + }, DIVIDE { + public int apply(int a, int b) { + return a / b; + } + }; + + public abstract int apply(int a, int b); +} \ No newline at end of file diff --git a/core-java-modules/core-java-functional/src/main/java/com/baeldung/functional/functors/Functor.java b/core-java-modules/core-java-functional/src/main/java/com/baeldung/functional/functors/Functor.java new file mode 100644 index 0000000000..778d0aacb7 --- /dev/null +++ b/core-java-modules/core-java-functional/src/main/java/com/baeldung/functional/functors/Functor.java @@ -0,0 +1,23 @@ +package com.baeldung.functional.functors; + +import java.util.function.Function; + +public class Functor { + private final T value; + + public Functor(T value) { + this.value = value; + } + + public Functor map(Function mapper) { + return new Functor<>(mapper.apply(value)); + } + + boolean eq(T other) { + return value.equals(other); + } + + public T getValue() { + return value; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-functional/src/test/java/com/baeldung/functional/functors/FunctorsUnitTest.java b/core-java-modules/core-java-functional/src/test/java/com/baeldung/functional/functors/FunctorsUnitTest.java new file mode 100644 index 0000000000..c29851d9c3 --- /dev/null +++ b/core-java-modules/core-java-functional/src/test/java/com/baeldung/functional/functors/FunctorsUnitTest.java @@ -0,0 +1,50 @@ +package com.baeldung.functional.functors; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.function.Function; + +import org.junit.jupiter.api.Test; + +class FunctorsUnitTest { + @Test + public void whenProvideAValue_ShouldMapTheValue() { + Functor functor = new Functor<>(5); + Function addThree = (num) -> num + 3; + Functor mappedFunctor = functor.map(addThree); + assertEquals(8, mappedFunctor.getValue()); + } + + @Test + public void whenApplyAnIdentityToAFunctor_thenResultIsEqualsToInitialValue() { + String value = "baeldung"; + //Identity + Functor identity = new Functor<>(value).map(Function.identity()); + assertTrue(identity.eq(value)); + } + + @Test + public void whenApplyAFunctionToOtherFunction_thenResultIsEqualsBetweenBoth() { + int value = 100; + long expected = 100; + // Composition/Associativity + Function f = Object::toString; + Function g = Long::valueOf; + + Functor left = new Functor<>(value).map(f) + .map(g); + Functor right = new Functor<>(value).map(f.andThen(g)); + + assertTrue(left.eq(expected)); + assertTrue(right.eq(expected)); + } + + @Test + public void whenApplyOperationsToEnumFunctors_thenGetTheProperResult() { + assertEquals(15, EnumFunctor.PLUS.apply(10, 5)); + assertEquals(5, EnumFunctor.MINUS.apply(10, 5)); + assertEquals(50, EnumFunctor.MULTIPLY.apply(10, 5)); + assertEquals(2, EnumFunctor.DIVIDE.apply(10, 5)); + } +} \ No newline at end of file From 97c5ef677638bab72bf688912ee47cc326ea1ad6 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Mon, 5 Dec 2022 16:25:53 +0530 Subject: [PATCH 088/592] backlink fixed. --- spring-security-modules/spring-security-web-mvc/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-security-modules/spring-security-web-mvc/README.md b/spring-security-modules/spring-security-web-mvc/README.md index 49831ea970..db17b237c8 100644 --- a/spring-security-modules/spring-security-web-mvc/README.md +++ b/spring-security-modules/spring-security-web-mvc/README.md @@ -8,7 +8,7 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [HttpSessionListener Example – Monitoring](https://www.baeldung.com/httpsessionlistener_with_metrics) +- [HttpSessionListener Example – Monitoring](https://www.baeldung.com/java-httpsessionlistener-metrics) - [Control the Session with Spring Security](https://www.baeldung.com/spring-security-session) - [The Clear-Site-Data Header in Spring Security](https://www.baeldung.com/spring-security-clear-site-data-header) - [Spring Security – security none, filters none, access permitAll](https://www.baeldung.com/security-none-filters-none-access-permitAll) From 62e25fc0ab0950d2e90c40302796befed518b0f8 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Mon, 5 Dec 2022 16:28:32 +0530 Subject: [PATCH 089/592] backlink fixed. --- .../spring-security-web-mvc-custom/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-security-modules/spring-security-web-mvc-custom/README.md b/spring-security-modules/spring-security-web-mvc-custom/README.md index d7690257db..d8bd4cb3e0 100644 --- a/spring-security-modules/spring-security-web-mvc-custom/README.md +++ b/spring-security-modules/spring-security-web-mvc-custom/README.md @@ -9,7 +9,7 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com ### Relevant Articles: - [Spring Security Remember Me](https://www.baeldung.com/spring-security-remember-me) -- [Redirect to Different Pages after Login with Spring Security](https://www.baeldung.com/spring_redirect_after_login) +- [Redirect to Different Pages after Login with Spring Security](https://www.baeldung.com/spring-redirect-after-login) - [Changing Spring Model Parameters with Handler Interceptor](https://www.baeldung.com/spring-model-parameters-with-handler-interceptor) - [Introduction to Spring MVC HandlerInterceptor](https://www.baeldung.com/spring-mvc-handlerinterceptor) - [Using a Custom Spring MVC’s Handler Interceptor to Manage Sessions](https://www.baeldung.com/spring-mvc-custom-handler-interceptor) From 7945039f3e09393b98011d42e67dafed225836b4 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Mon, 5 Dec 2022 16:34:42 +0530 Subject: [PATCH 090/592] backlink added --- spring-ejb-modules/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-ejb-modules/README.md b/spring-ejb-modules/README.md index 84e01f95e9..dd293b92ea 100644 --- a/spring-ejb-modules/README.md +++ b/spring-ejb-modules/README.md @@ -8,4 +8,5 @@ This module contains articles about Spring with EJB - [A Guide to Message Driven Beans in EJB](https://www.baeldung.com/ejb-message-driven-beans) - [Integration Guide for Spring and EJB](https://www.baeldung.com/spring-ejb) - [Singleton Session Bean in Jakarta EE](https://www.baeldung.com/java-ee-singleton-session-bean) +- [Guide to EJB Set-up](https://www.baeldung.com/ejb-intro) From b68aaace0556d79811a7f5b69b6358b4719e24aa Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Mon, 5 Dec 2022 16:36:12 +0530 Subject: [PATCH 091/592] backlink fixed --- core-java-modules/core-java-collections-3/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-collections-3/README.md b/core-java-modules/core-java-collections-3/README.md index 4249d8ad30..4c0657da2d 100644 --- a/core-java-modules/core-java-collections-3/README.md +++ b/core-java-modules/core-java-collections-3/README.md @@ -6,7 +6,7 @@ - [Time Comparison of Arrays.sort(Object[]) and Arrays.sort(int[])](https://www.baeldung.com/arrays-sortobject-vs-sortint) - [Java ArrayList vs Vector](https://www.baeldung.com/java-arraylist-vs-vector) -- [Differences Between HashMap and Hashtable](https://www.baeldung.com/hashmap-hashtable-differences) +- [Differences Between HashMap and Hashtable in Java](https://www.baeldung.com/hashmap-hashtable-differences) - [Differences Between Collection.clear() and Collection.removeAll()](https://www.baeldung.com/java-collection-clear-vs-removeall) - [Performance of contains() in a HashSet vs ArrayList](https://www.baeldung.com/java-hashset-arraylist-contains-performance) - [Fail-Safe Iterator vs Fail-Fast Iterator](https://www.baeldung.com/java-fail-safe-vs-fail-fast-iterator) From 6b5bde98f5a2e17a5366e15694d14952b71224f6 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Mon, 5 Dec 2022 16:40:59 +0530 Subject: [PATCH 092/592] backlink removed --- spring-ejb-modules/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-ejb-modules/README.md b/spring-ejb-modules/README.md index dd293b92ea..dbef052791 100644 --- a/spring-ejb-modules/README.md +++ b/spring-ejb-modules/README.md @@ -5,7 +5,6 @@ This module contains articles about Spring with EJB ### Relevant Articles - [Java EE Session Beans](https://www.baeldung.com/ejb-session-beans) -- [A Guide to Message Driven Beans in EJB](https://www.baeldung.com/ejb-message-driven-beans) - [Integration Guide for Spring and EJB](https://www.baeldung.com/spring-ejb) - [Singleton Session Bean in Jakarta EE](https://www.baeldung.com/java-ee-singleton-session-bean) - [Guide to EJB Set-up](https://www.baeldung.com/ejb-intro) From a82e46bdcce45d0f4b99ccd52b05e8f586f1a7e3 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Mon, 5 Dec 2022 16:44:04 +0530 Subject: [PATCH 093/592] backlink added --- security-modules/cas/cas-server/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 security-modules/cas/cas-server/README.md diff --git a/security-modules/cas/cas-server/README.md b/security-modules/cas/cas-server/README.md new file mode 100644 index 0000000000..6c9372a729 --- /dev/null +++ b/security-modules/cas/cas-server/README.md @@ -0,0 +1,2 @@ +# Relevant Articles +- [CAS SSO With Spring Security](https://www.baeldung.com/spring-security-cas-sso) From 260511f92a6804c332061745678a0f6da6d275b0 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Mon, 5 Dec 2022 16:45:24 +0530 Subject: [PATCH 094/592] backlink removed --- jhipster-modules/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jhipster-modules/README.md b/jhipster-modules/README.md index 93322c146b..11c3d5397f 100644 --- a/jhipster-modules/README.md +++ b/jhipster-modules/README.md @@ -4,5 +4,4 @@ This module contains articles about JHipster. ### Relevant articles: -- [Intro to JHipster](https://www.baeldung.com/jhipster) -- [Building a Basic UAA-Secured JHipster Microservice](https://www.baeldung.com/jhipster-uaa-secured-micro-service) + From fd623cb9f8a4ac51bca653a2b65cddc63150ca68 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Mon, 5 Dec 2022 18:35:30 +0100 Subject: [PATCH 095/592] [JAVA-5805]: Logging to Graylog with Spring Boot Update (#12934) Co-authored-by: Harpal Singh --- spring-boot-modules/spring-boot-logging-log4j2/pom.xml | 7 ------- .../src/main/resources/log4j.xml | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml index 81a28725a7..7178aeca32 100644 --- a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml +++ b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml @@ -61,13 +61,6 @@ ${lombok.version} provided - - - - org.springframework.boot - spring-boot-starter-log4j - ${spring-boot-starter-log4j.version} - org.graylog2 gelfj diff --git a/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/log4j.xml b/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/log4j.xml index 61c1b7b229..524628b855 100644 --- a/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/log4j.xml +++ b/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/log4j.xml @@ -7,7 +7,7 @@ - + From 2ea3448efa0fafb185a5c46f3e4b8677a7c5f447 Mon Sep 17 00:00:00 2001 From: AndiCover <33127132+AndiCover@users.noreply.github.com> Date: Tue, 6 Dec 2022 01:08:01 +0100 Subject: [PATCH 096/592] Bael 4555 selenium tab switching (#13131) * BAEL-4555 Added Selenium TabHelper and tab switching live tests * BAEL-4555 Upgraded Selenium to 4.6.0 * BAEL-4555 fixed naming Co-authored-by: andicover --- testing-modules/selenium-junit-testng/pom.xml | 2 +- .../selenium/config/SeleniumConfig.java | 10 +- .../com/baeldung/selenium/tabs/TabHelper.java | 76 +++++++++++++++ .../SeleniumJavaScriptClickLiveTest.java | 6 +- .../cookies/SeleniumCookiesJUnitLiveTest.java | 12 +-- .../TakeScreenShotSeleniumLiveTest.java | 12 +-- .../selenium/tabs/SeleniumTabsLiveTest.java | 97 +++++++++++++++++++ .../selenium/tabs/SeleniumTestBase.java | 55 +++++++++++ 8 files changed, 247 insertions(+), 23 deletions(-) create mode 100644 testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/tabs/TabHelper.java create mode 100644 testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumTabsLiveTest.java create mode 100644 testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumTestBase.java diff --git a/testing-modules/selenium-junit-testng/pom.xml b/testing-modules/selenium-junit-testng/pom.xml index cf7c121dc8..f0a2e43eeb 100644 --- a/testing-modules/selenium-junit-testng/pom.xml +++ b/testing-modules/selenium-junit-testng/pom.xml @@ -57,7 +57,7 @@ 6.10 - 3.141.59 + 4.6.0 1.5.4 5.3.0 diff --git a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java index b1b7754648..14b2db7fc8 100644 --- a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java +++ b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java @@ -1,24 +1,22 @@ package com.baeldung.selenium.config; import java.io.File; +import java.time.Duration; import java.util.concurrent.TimeUnit; -import org.openqa.selenium.Capabilities; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.remote.DesiredCapabilities; public class SeleniumConfig { private WebDriver driver; public SeleniumConfig() { - Capabilities capabilities = DesiredCapabilities.firefox(); - driver = new FirefoxDriver(capabilities); + driver = new FirefoxDriver(); driver.manage() .timeouts() - .implicitlyWait(5, TimeUnit.SECONDS); + .implicitlyWait(Duration.ofSeconds(5)); } static { @@ -50,4 +48,4 @@ public class SeleniumConfig { public WebDriver getDriver() { return driver; } -} +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/tabs/TabHelper.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/tabs/TabHelper.java new file mode 100644 index 0000000000..0ad91c51f0 --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/tabs/TabHelper.java @@ -0,0 +1,76 @@ +package com.baeldung.selenium.tabs; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; + +import javax.annotation.Nonnull; +import java.util.Optional; +import java.util.Set; + +/** + * Helper class for browser tab handling. + */ +public class TabHelper { + + private final WebDriver driver; + + public TabHelper(@Nonnull final WebDriver driver) { + this.driver = driver; + } + + /** + * Switch to the given browser tab. + * + * @param destinationWindowHandle the window handle of the destination tab. + * @return the window handle of the current tab before switching. + */ + public String switchToTab(@Nonnull final String destinationWindowHandle) { + final String currentWindowHandle = driver.getWindowHandle(); + driver.switchTo().window(destinationWindowHandle); + return currentWindowHandle; + } + + /** + * Close all browser tabs except the given one. + * + * @param windowHandle the window handle of the tab that should stay open. + */ + public void closeAllTabsExcept(@Nonnull final String windowHandle) { + for (final String handle : driver.getWindowHandles()) { + if (!handle.equals(windowHandle)) { + driver.switchTo().window(handle); + driver.close(); + } + } + driver.switchTo().window(windowHandle); + } + + /** + * Close all browser tabs except the current active one. + */ + public void closeAllTabsExceptCurrent() { + final String currentWindow = driver.getWindowHandle(); + closeAllTabsExcept(currentWindow); + } + + /** + * Open the given link and switch to the new opened tab. + * If the link is not opened in a new tab then no switch will be performed. + * + * @param link By of the link to open. + * @return the window handle of the tab before switching. + */ + public String openLinkAndSwitchToNewTab(@Nonnull final By link) { + final String windowHandle = driver.getWindowHandle(); + final Set windowHandlesBefore = driver.getWindowHandles(); + + driver.findElement(link).click(); + final Set windowHandlesAfter = driver.getWindowHandles(); + windowHandlesAfter.removeAll(windowHandlesBefore); + + final Optional newWindowHandle = windowHandlesAfter.stream().findFirst(); + newWindowHandle.ifPresent(s -> driver.switchTo().window(s)); + + return windowHandle; + } +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/clickusingjavascript/SeleniumJavaScriptClickLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/clickusingjavascript/SeleniumJavaScriptClickLiveTest.java index de519a44fc..c6abda08ee 100644 --- a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/clickusingjavascript/SeleniumJavaScriptClickLiveTest.java +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/clickusingjavascript/SeleniumJavaScriptClickLiveTest.java @@ -15,6 +15,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; +import java.time.Duration; +import java.time.temporal.ChronoUnit; public class SeleniumJavaScriptClickLiveTest { @@ -25,7 +27,7 @@ public class SeleniumJavaScriptClickLiveTest { public void setUp() { System.setProperty("webdriver.chrome.driver", new File("src/main/resources/chromedriver.mac").getAbsolutePath()); driver = new ChromeDriver(); - wait = new WebDriverWait(driver, 20); + wait = new WebDriverWait(driver, Duration.of(20, ChronoUnit.SECONDS)); } @After @@ -62,4 +64,4 @@ public class SeleniumJavaScriptClickLiveTest { executor.executeScript("arguments[0].click();", element); } -} +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/cookies/SeleniumCookiesJUnitLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/cookies/SeleniumCookiesJUnitLiveTest.java index 337e3b85fb..8906f89fba 100644 --- a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/cookies/SeleniumCookiesJUnitLiveTest.java +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/cookies/SeleniumCookiesJUnitLiveTest.java @@ -9,17 +9,16 @@ import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.nullValue; import java.io.File; +import java.time.Duration; import java.util.Set; import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.openqa.selenium.Capabilities; import org.openqa.selenium.Cookie; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.remote.DesiredCapabilities; public class SeleniumCookiesJUnitLiveTest { @@ -29,11 +28,10 @@ public class SeleniumCookiesJUnitLiveTest { @Before public void setUp() { System.setProperty("webdriver.gecko.driver", findFile("geckodriver.mac")); - - Capabilities capabilities = DesiredCapabilities.firefox(); - driver = new FirefoxDriver(capabilities); + + driver = new FirefoxDriver(); navUrl = "https://baeldung.com"; - driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); + driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5)); } private static String findFile(String filename) { @@ -123,4 +121,4 @@ public class SeleniumCookiesJUnitLiveTest { assertThat(overriddenCookie.getValue(), equalTo("foo")); } -} +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/screenshot/TakeScreenShotSeleniumLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/screenshot/TakeScreenShotSeleniumLiveTest.java index cf705bb81f..e1ecdb4fa4 100644 --- a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/screenshot/TakeScreenShotSeleniumLiveTest.java +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/screenshot/TakeScreenShotSeleniumLiveTest.java @@ -4,6 +4,7 @@ import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; +import java.time.Duration; import java.util.concurrent.TimeUnit; import javax.imageio.ImageIO; @@ -13,12 +14,10 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.openqa.selenium.By; -import org.openqa.selenium.Capabilities; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; -import org.openqa.selenium.remote.DesiredCapabilities; import ru.yandex.qatools.ashot.AShot; import ru.yandex.qatools.ashot.Screenshot; @@ -33,17 +32,16 @@ public class TakeScreenShotSeleniumLiveTest { public static void setUp() { System.setProperty("webdriver.chrome.driver", resolveResourcePath("chromedriver.mac")); - Capabilities capabilities = DesiredCapabilities.chrome(); - driver = new ChromeDriver(capabilities); + driver = new ChromeDriver(); driver.manage() .timeouts() - .implicitlyWait(5, TimeUnit.SECONDS); + .implicitlyWait(Duration.ofSeconds(5)); driver.get("http://www.google.com/"); } @AfterClass - public static void tearDown() throws IOException { + public static void tearDown() { driver.close(); System.clearProperty("webdriver.chrome.driver"); @@ -82,4 +80,4 @@ public class TakeScreenShotSeleniumLiveTest { File file = new File("src/test/resources/" + filename); return file.getAbsolutePath(); } -} +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumTabsLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumTabsLiveTest.java new file mode 100644 index 0000000000..08708fb0bc --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumTabsLiveTest.java @@ -0,0 +1,97 @@ +package com.baeldung.selenium.tabs; + +import org.junit.jupiter.api.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.WindowType; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +final class SeleniumTabsLiveTest extends SeleniumTestBase { + + private static final By LINK_TO_ATTRIBUTES_PAGE_XPATH = By.xpath("//a[.='Attributes in new page']"); + private static final By LINK_TO_ALERT_PAGE_XPATH = By.xpath("//a[.='Alerts In A New Window From JavaScript']"); + + private static final String MAIN_PAGE_URL = "https://testpages.herokuapp.com/styled/windows-test.html"; + private static final String ATTRIBUTES_PAGE_URL = "https://testpages.herokuapp.com/styled/attributes-test.html"; + private static final String ALERT_PAGE_URL = "https://testpages.herokuapp.com/styled/alerts/alert-test.html"; + + @Test + void givenOneTab_whenOpenTab_thenTwoTabsOpen() { + //given + driver.get(MAIN_PAGE_URL); + assertEquals(1, driver.getWindowHandles().size()); + + //when + driver.switchTo().newWindow(WindowType.TAB); + + //then + assertEquals(2, driver.getWindowHandles().size()); + } + + @Test + void givenOneTab_whenOpenLinkInTab_thenTwoTabsOpen() { + //given + driver.get(MAIN_PAGE_URL); + + //when + final String mainWindow = tabHelper.openLinkAndSwitchToNewTab(LINK_TO_ATTRIBUTES_PAGE_XPATH); + assertEquals(ATTRIBUTES_PAGE_URL, driver.getCurrentUrl()); + + //then + tabHelper.switchToTab(mainWindow); + assertEquals(MAIN_PAGE_URL, driver.getCurrentUrl()); + assertEquals(2, driver.getWindowHandles().size()); + } + + @Test + void givenTwoTabs_whenCloseAllExceptMainTab_thenOneTabOpen() { + //given + driver.get(MAIN_PAGE_URL); + final String mainWindow = tabHelper.openLinkAndSwitchToNewTab(LINK_TO_ATTRIBUTES_PAGE_XPATH); + assertEquals(ATTRIBUTES_PAGE_URL, driver.getCurrentUrl()); + assertEquals(2, driver.getWindowHandles().size()); + + //when + tabHelper.closeAllTabsExcept(mainWindow); + + //then + assertEquals(1, driver.getWindowHandles().size()); + assertEquals(MAIN_PAGE_URL, driver.getCurrentUrl()); + } + + @Test + void givenTwoTabs_whenSwitching_thenCorrectTabOpen() { + //given + driver.get(MAIN_PAGE_URL); + final String mainWindow = tabHelper.openLinkAndSwitchToNewTab(LINK_TO_ATTRIBUTES_PAGE_XPATH); + assertEquals(ATTRIBUTES_PAGE_URL, driver.getCurrentUrl()); + assertEquals(2, driver.getWindowHandles().size()); + + //when/then + final String secondWindow = tabHelper.switchToTab(mainWindow); + assertEquals(MAIN_PAGE_URL, driver.getCurrentUrl()); + tabHelper.switchToTab(secondWindow); + assertEquals(ATTRIBUTES_PAGE_URL, driver.getCurrentUrl()); + } + + @Test + void givenThreeTabs_whenSwitching_thenCorrectTabOpen() { + //given + driver.get(MAIN_PAGE_URL); + final String mainWindow = tabHelper.openLinkAndSwitchToNewTab(LINK_TO_ATTRIBUTES_PAGE_XPATH); + final String secondWindow = tabHelper.switchToTab(mainWindow); + tabHelper.openLinkAndSwitchToNewTab(LINK_TO_ALERT_PAGE_XPATH); + final String thirdWindow = driver.getWindowHandle(); + assertEquals(3, driver.getWindowHandles().size()); + + //when/then + tabHelper.switchToTab(mainWindow); + assertEquals(MAIN_PAGE_URL, driver.getCurrentUrl()); + + tabHelper.switchToTab(secondWindow); + assertEquals(ATTRIBUTES_PAGE_URL, driver.getCurrentUrl()); + + tabHelper.switchToTab(thirdWindow); + assertEquals(ALERT_PAGE_URL, driver.getCurrentUrl()); + } +} \ No newline at end of file diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumTestBase.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumTestBase.java new file mode 100644 index 0000000000..71efbb84da --- /dev/null +++ b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/tabs/SeleniumTestBase.java @@ -0,0 +1,55 @@ +package com.baeldung.selenium.tabs; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; + +/** + * Base class for Selenium Tests. This class handles the WebDriver setup and configuration. + * It takes care about closing all tabs except one after each test. After a test class it will close the browser. + */ +public class SeleniumTestBase { + + protected static WebDriver driver; + protected static TabHelper tabHelper; + + private static void setupChromeDriver() { + WebDriverManager.chromedriver().setup(); + driver = new ChromeDriver(); + options(); + tabHelper = new TabHelper(driver); + } + + private static void options() { + driver.manage().window().maximize(); + } + + /** + * Initializes the ChromeDriver before all tests. + */ + @BeforeAll + public static void init() { + setupChromeDriver(); + } + + /** + * After each test all tabs except the current tab will be closed. + */ + @AfterEach + public void closeTabs() { + tabHelper.closeAllTabsExceptCurrent(); + } + + /** + * After all tests the browser will be closed. + */ + @AfterAll + public static void cleanup() { + if (driver != null) { + driver.quit(); + } + } +} \ No newline at end of file From 061c30aa082890f81efd85876af451f91728ad46 Mon Sep 17 00:00:00 2001 From: Abhinav Pandey Date: Tue, 6 Dec 2022 10:58:59 +0530 Subject: [PATCH 097/592] BAEL-5789 - reinitializing singleton beans in context (#13096) * BAEL-5789 - reinitializing singleton beans in context * BAEL-5789 - reinitializing singleton beans in context - changing file path to relative --- .../reinitializebean/ReinitializeBeanApp.java | 11 ++++ .../reinitializebean/cache/ConfigManager.java | 51 +++++++++++++++++ .../controller/ConfigController.java | 55 +++++++++++++++++++ .../src/main/resources/application.properties | 3 +- .../src/main/resources/config.properties | 1 + 5 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 spring-core-6/src/main/java/com/baeldung/reinitializebean/ReinitializeBeanApp.java create mode 100644 spring-core-6/src/main/java/com/baeldung/reinitializebean/cache/ConfigManager.java create mode 100644 spring-core-6/src/main/java/com/baeldung/reinitializebean/controller/ConfigController.java create mode 100644 spring-core-6/src/main/resources/config.properties diff --git a/spring-core-6/src/main/java/com/baeldung/reinitializebean/ReinitializeBeanApp.java b/spring-core-6/src/main/java/com/baeldung/reinitializebean/ReinitializeBeanApp.java new file mode 100644 index 0000000000..5c3b607579 --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/reinitializebean/ReinitializeBeanApp.java @@ -0,0 +1,11 @@ +package com.baeldung.reinitializebean; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ReinitializeBeanApp { + public static void main(String[] args) { + SpringApplication.run(ReinitializeBeanApp.class, args); + } +} diff --git a/spring-core-6/src/main/java/com/baeldung/reinitializebean/cache/ConfigManager.java b/spring-core-6/src/main/java/com/baeldung/reinitializebean/cache/ConfigManager.java new file mode 100644 index 0000000000..1e4dee6cc4 --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/reinitializebean/cache/ConfigManager.java @@ -0,0 +1,51 @@ +package com.baeldung.reinitializebean.cache; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +@Service("ConfigManager") +public class ConfigManager { + + private static final Log LOG = LogFactory.getLog(ConfigManager.class); + + private Map config; + + private final String filePath; + + public ConfigManager(@Value("${config.file.path}") String filePath) { + this.filePath = filePath; + initConfigs(); + } + + private void initConfigs() { + Properties properties = new Properties(); + try { + properties.load(Files.newInputStream(Paths.get(filePath))); + } catch (IOException e) { + LOG.error("Error loading configuration:", e); + } + config = new HashMap<>(); + for (Map.Entry entry : properties.entrySet()) { + config.put(String.valueOf(entry.getKey()), entry.getValue()); + } + } + + public Object getConfig(String key) { + return config.get(key); + } + + public void reinitializeConfig() { + initConfigs(); + } + +} diff --git a/spring-core-6/src/main/java/com/baeldung/reinitializebean/controller/ConfigController.java b/spring-core-6/src/main/java/com/baeldung/reinitializebean/controller/ConfigController.java new file mode 100644 index 0000000000..377882a8f0 --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/reinitializebean/controller/ConfigController.java @@ -0,0 +1,55 @@ +package com.baeldung.reinitializebean.controller; + +import com.baeldung.reinitializebean.cache.ConfigManager; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.support.DefaultSingletonBeanRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/config") +public class ConfigController { + + @Value("${config.file.path}") + private String filePath; + private final ApplicationContext applicationContext; + private final ConfigManager configManager; + + public ConfigController(ApplicationContext applicationContext, ConfigManager configManager) { + this.applicationContext = applicationContext; + this.configManager = configManager; + } + + @GetMapping("/reinitializeConfig") + public void reinitializeConfig() { + configManager.reinitializeConfig(); + } + + @GetMapping("/reinitializeBean") + public void reinitializeBean() { + DefaultSingletonBeanRegistry registry = (DefaultSingletonBeanRegistry) applicationContext.getAutowireCapableBeanFactory(); + registry.destroySingleton("ConfigManager"); + registry.registerSingleton("ConfigManager", new ConfigManager(filePath)); + } + + @GetMapping("/destroyBean") + public void destroyBean() { + DefaultSingletonBeanRegistry registry = (DefaultSingletonBeanRegistry) applicationContext.getAutowireCapableBeanFactory(); + registry.destroySingleton("ConfigManager"); + } + + @GetMapping("/{key}") + public Object get(@PathVariable String key) { + return configManager.getConfig(key); + } + + @GetMapping("/context/{key}") + public Object getFromContext(@PathVariable String key) { + ConfigManager dynamicConfigManager = applicationContext.getBean(ConfigManager.class); + return dynamicConfigManager.getConfig(key); + } + +} diff --git a/spring-core-6/src/main/resources/application.properties b/spring-core-6/src/main/resources/application.properties index d0029f363c..28a65dce32 100644 --- a/spring-core-6/src/main/resources/application.properties +++ b/spring-core-6/src/main/resources/application.properties @@ -1,4 +1,5 @@ environment.name=${OS} java.home.and.environment=${JAVA_HOME}+${OS} not.existing.system.property=${thispropertydoesnotexist} -baeldung.presentation=${HELLO_BAELDUNG}. Java is installed in the folder: ${JAVA_HOME} \ No newline at end of file +baeldung.presentation=${HELLO_BAELDUNG}. Java is installed in the folder: ${JAVA_HOME} +config.file.path=./spring-core-6/src/main/resources/config.properties \ No newline at end of file diff --git a/spring-core-6/src/main/resources/config.properties b/spring-core-6/src/main/resources/config.properties new file mode 100644 index 0000000000..591d32f33c --- /dev/null +++ b/spring-core-6/src/main/resources/config.properties @@ -0,0 +1 @@ +property1=value2 From e858d14b867ac68c2be11d10451dee3572296ab8 Mon Sep 17 00:00:00 2001 From: Bhaskar Ghosh Dastidar Date: Tue, 6 Dec 2022 21:26:02 +0530 Subject: [PATCH 098/592] [JAVA-6029] reversing a stack (#13122) * [JAVA-6029] reversing a stack * [JAVA-6029] un-necessary file changes removed Co-authored-by: Bhaskar --- .../stackreversal/ReverseStackUsingQueue.java | 42 ++++++++++++ .../ReverseStackUsingRecursion.java | 29 +++++++++ .../stackreversal/StackReversalUnitTest.java | 64 +++++++++++++++++++ 3 files changed, 135 insertions(+) create mode 100644 core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/stackreversal/ReverseStackUsingQueue.java create mode 100644 core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/stackreversal/ReverseStackUsingRecursion.java create mode 100644 core-java-modules/core-java-collections-4/src/test/java/com/baeldung/stackreversal/StackReversalUnitTest.java diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/stackreversal/ReverseStackUsingQueue.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/stackreversal/ReverseStackUsingQueue.java new file mode 100644 index 0000000000..6851ed7e88 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/stackreversal/ReverseStackUsingQueue.java @@ -0,0 +1,42 @@ +package com.baeldung.collections.stackreversal; + +import com.baeldung.collections.sorting.Employee; + +import java.util.LinkedList; +import java.util.Queue; +import java.util.Stack; + +public class ReverseStackUsingQueue { + public Stack reverseIntegerStack(Stack inputStack) { + Queue queue = new LinkedList<>(); + while (!inputStack.isEmpty()) { + queue.add(inputStack.pop()); + } + while (!queue.isEmpty()) { + inputStack.add(queue.remove()); + } + return inputStack; + } + + public Stack reverseStringStack(Stack inputStack) { + Queue queue = new LinkedList<>(); + while (!inputStack.isEmpty()) { + queue.add(inputStack.pop()); + } + while (!queue.isEmpty()) { + inputStack.add(queue.remove()); + } + return inputStack; + } + + public Stack reverseEmployeeStack(Stack inputStack) { + Queue employeeQ = new LinkedList<>(); + while (!inputStack.isEmpty()) { + employeeQ.add(inputStack.pop()); + } + while (!employeeQ.isEmpty()) { + inputStack.add(employeeQ.remove()); + } + return inputStack; + } +} diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/stackreversal/ReverseStackUsingRecursion.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/stackreversal/ReverseStackUsingRecursion.java new file mode 100644 index 0000000000..8dbe0c39a6 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/stackreversal/ReverseStackUsingRecursion.java @@ -0,0 +1,29 @@ +package com.baeldung.collections.stackreversal; + +import java.util.Stack; + +public class ReverseStackUsingRecursion { + public Stack reverseIntegerStack(Stack inputStack) { + reverseStack(inputStack); + return inputStack; + } + + private void reverseStack(Stack stack) { + if (stack.isEmpty()) { + return; + } + int top = stack.pop(); + reverseStack(stack); + insertBottom(stack, top); + } + + private void insertBottom(Stack stack, int value) { + if (stack.isEmpty()) { + stack.add(value); + } else { + int top = stack.pop(); + insertBottom(stack, value); + stack.add(top); + } + } +} diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/stackreversal/StackReversalUnitTest.java b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/stackreversal/StackReversalUnitTest.java new file mode 100644 index 0000000000..7ad0b71028 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/stackreversal/StackReversalUnitTest.java @@ -0,0 +1,64 @@ +package com.baeldung.stackreversal; + +import com.baeldung.collections.sorting.Employee; +import com.baeldung.collections.stackreversal.ReverseStackUsingQueue; +import com.baeldung.collections.stackreversal.ReverseStackUsingRecursion; +import org.junit.Assert; +import org.junit.Test; + +import java.util.*; +import java.util.stream.Collectors; + +public class StackReversalUnitTest { + @Test + public void whenIntegerStack_thenReturnReversedIntegerStack(){ + ReverseStackUsingQueue reverseStack = new ReverseStackUsingQueue(); + Stack originalStack = generateStackFromGivenList(Arrays.stream(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}).boxed().collect(Collectors.toList()), new Stack()); + Stack reverseList = generateStackFromGivenList(Arrays.stream(new int[]{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}).boxed().collect(Collectors.toList()), new Stack()); + Assert.assertEquals(reverseStack.reverseIntegerStack(originalStack), reverseList); + } + + @Test + public void whenStringStack_thenReturnReversedStringStack(){ + ReverseStackUsingQueue stackReversal = new ReverseStackUsingQueue(); + List listOfWords = Arrays.asList(new String[]{"Hello", "I", "am", "reversing", "a", "stack"}); + List listOfWordsReversed = new ArrayList<>(listOfWords); + Collections.reverse(listOfWordsReversed); + Stack originalStack = generateStackFromGivenList(listOfWords, new Stack()); + Stack reversedStack = generateStackFromGivenList(listOfWordsReversed, new Stack()); + Assert.assertEquals(stackReversal.reverseStringStack(originalStack), reversedStack); + } + + @Test + public void whenEmployeeStack_thenReturnReversedEmployeeStack(){ + ReverseStackUsingQueue stackReversal = new ReverseStackUsingQueue(); + Employee employee1 = new Employee("John Doe", new Date()); + Employee employee2 = new Employee("John Nash", new Date()); + Employee employee3 = new Employee("Ryan Howard", new Date()); + List employeeList = new ArrayList<>(); + employeeList.add(employee1); + employeeList.add(employee2); + employeeList.add(employee3); + List employeeReversed = new ArrayList<>(employeeList); + Collections.reverse(employeeReversed); + Stack originalStack = generateStackFromGivenList(employeeList, new Stack()); + Stack reverseStack = generateStackFromGivenList(employeeReversed, new Stack()); + Assert.assertEquals(stackReversal.reverseEmployeeStack(originalStack), reverseStack); + } + + @Test + public void givenIntegerStack_whenStackReversed_thenReturnReversedRecursion(){ + ReverseStackUsingRecursion reverseStack = new ReverseStackUsingRecursion(); + Stack originalStack = generateStackFromGivenList(Arrays.stream(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}).boxed().collect(Collectors.toList()), new Stack()); + Stack reversedStack = generateStackFromGivenList(Arrays.stream(new int[]{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}).boxed().collect(Collectors.toList()), new Stack()); + Assert.assertEquals(reverseStack.reverseIntegerStack(originalStack), reversedStack); + } + + private Stack generateStackFromGivenList(List elements, Stack stack){ + int start = 0; + while (start < elements.size()){ + stack.add(elements.get(start++)); + } + return stack; + } +} From eed4f4f5e4d76146de5f1911011b6922528de298 Mon Sep 17 00:00:00 2001 From: Kilian Schneider <48420258+Basler182@users.noreply.github.com> Date: Tue, 6 Dec 2022 17:28:57 +0100 Subject: [PATCH 099/592] BAEL-5744 - excel date format (#13123) --- .../poi/excel/dateformat/ExcelDateFormat.java | 35 +++++++ .../excel/dateformat/DateFormatUnitTest.java | 95 +++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 apache-poi-2/src/main/java/com/baeldung/poi/excel/dateformat/ExcelDateFormat.java create mode 100644 apache-poi-2/src/test/java/com/baeldung/poi/excel/dateformat/DateFormatUnitTest.java diff --git a/apache-poi-2/src/main/java/com/baeldung/poi/excel/dateformat/ExcelDateFormat.java b/apache-poi-2/src/main/java/com/baeldung/poi/excel/dateformat/ExcelDateFormat.java new file mode 100644 index 0000000000..6ee2fb3c3b --- /dev/null +++ b/apache-poi-2/src/main/java/com/baeldung/poi/excel/dateformat/ExcelDateFormat.java @@ -0,0 +1,35 @@ +package com.baeldung.poi.excel.dateformat; + +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CreationHelper; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +public class ExcelDateFormat { + + public final static String CUSTOM_DATE_FORMAT = "m/d/yy h:mm"; + + /** + * Set default date format to a cell + * @param dateCell cell to set date format + * @param wb workbook to create date format cell style + */ + public void setDefaultDateFormat(XSSFCell dateCell, XSSFWorkbook wb) { + CellStyle cellStyle = wb.createCellStyle(); + cellStyle.setDataFormat((short) 14); + dateCell.setCellStyle(cellStyle); + } + + /** + * Set custom date format to a cell + * @param dateCell cell to set date format + * @param wb workbook to create date format cell style + */ + public void setCustomDateFormat(XSSFCell dateCell, XSSFWorkbook wb) { + CellStyle cellStyle = wb.createCellStyle(); + CreationHelper createHelper = wb.getCreationHelper(); + short format = createHelper.createDataFormat().getFormat(CUSTOM_DATE_FORMAT); + cellStyle.setDataFormat(format); + dateCell.setCellStyle(cellStyle); + } +} diff --git a/apache-poi-2/src/test/java/com/baeldung/poi/excel/dateformat/DateFormatUnitTest.java b/apache-poi-2/src/test/java/com/baeldung/poi/excel/dateformat/DateFormatUnitTest.java new file mode 100644 index 0000000000..fe211beb77 --- /dev/null +++ b/apache-poi-2/src/test/java/com/baeldung/poi/excel/dateformat/DateFormatUnitTest.java @@ -0,0 +1,95 @@ +package com.baeldung.poi.excel.dateformat; + +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Date; + +import static com.baeldung.poi.excel.dateformat.ExcelDateFormat.CUSTOM_DATE_FORMAT; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class DateFormatUnitTest { + + private ExcelDateFormat excelDateFormat; + + private XSSFWorkbook wb; + + private Date date; + + + @BeforeEach + public void setup() { + excelDateFormat = new ExcelDateFormat(); + wb = new XSSFWorkbook(); + wb.createSheet(); + date = new Date(); + } + + @Test + void givenExcelDate_whenSetDefaultDate_thenSuccess() { + // given Excel Sheet + XSSFSheet sheet = wb.getSheetAt(0); + XSSFCell dateCell = sheet.createRow(0).createCell(0); + + // when set default date format + excelDateFormat.setDefaultDateFormat(dateCell, wb); + dateCell.setCellValue(date); + + // then success + assertEquals(date, dateCell.getDateCellValue()); + } + + @Test + void givenExcelDate_whenSetCustomDate_thenSuccess() { + // given Excel Sheet + XSSFSheet sheet = wb.getSheetAt(0); + XSSFCell dateCellCustom = sheet.createRow(0).createCell(0); + + // when set custom date format + excelDateFormat.setCustomDateFormat(dateCellCustom, wb); + dateCellCustom.setCellValue(date); + + // then success + assertEquals(CUSTOM_DATE_FORMAT, dateCellCustom.getCellStyle().getDataFormatString()); + assertEquals(date, dateCellCustom.getDateCellValue()); + } + + @Test + void givenExcelDefaultDateFormat_whenGetDefaultDateFormat_thenSuccess() { + // given Excel cell style with default date format + CellStyle cellStyle = wb.createCellStyle(); + + // when get default date format + cellStyle.setDataFormat((short) 14); + // then success + assertEquals("m/d/yy", cellStyle.getDataFormatString()); + + cellStyle.setDataFormat((short) 15); + assertEquals("d-mmm-yy", cellStyle.getDataFormatString()); + + cellStyle.setDataFormat((short) 16); + assertEquals("d-mmm", cellStyle.getDataFormatString()); + + cellStyle.setDataFormat((short) 17); + assertEquals("mmm-yy", cellStyle.getDataFormatString()); + + cellStyle.setDataFormat((short) 18); + assertEquals("h:mm AM/PM", cellStyle.getDataFormatString()); + + cellStyle.setDataFormat((short) 19); + assertEquals("h:mm:ss AM/PM", cellStyle.getDataFormatString()); + + cellStyle.setDataFormat((short) 20); + assertEquals("h:mm", cellStyle.getDataFormatString()); + + cellStyle.setDataFormat((short) 21); + assertEquals("h:mm:ss", cellStyle.getDataFormatString()); + + cellStyle.setDataFormat((short) 22); + assertEquals("m/d/yy h:mm", cellStyle.getDataFormatString()); + } +} From dd2c1fee7754f3f54f9e7f6f6b0b46f445bf8b78 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 6 Dec 2022 18:49:44 +0000 Subject: [PATCH 100/592] Java 15017 (#13080) * [JAVA-15017] Upgraded httpClient version to 5.2 * [JAVA-15017] Added CustomResponseHandler in favour of upgrading deprecated execute() method * [JAVA-15017] Replaced CustomResponseHandler with BasicHttpClientResponseHandler Co-authored-by: panagiotiskakos --- .../ApacheHttpClient5UnitTest.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClient5UnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClient5UnitTest.java index 35b21789ef..9a79cbf491 100644 --- a/apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClient5UnitTest.java +++ b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/readresponsebodystring/ApacheHttpClient5UnitTest.java @@ -1,29 +1,27 @@ package com.baeldung.httpclient.readresponsebodystring; import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.impl.classic.BasicHttpClientResponseHandler; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; -import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; import org.apache.hc.client5.http.impl.classic.HttpClients; -import org.apache.hc.core5.http.HttpEntity; -import org.apache.hc.core5.http.ParseException; -import org.apache.hc.core5.http.io.entity.EntityUtils; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; + public class ApacheHttpClient5UnitTest { private final Logger logger = LoggerFactory.getLogger(this.getClass()); public static final String DUMMY_URL = "https://postman-echo.com/get"; @Test - public void whenUseApacheHttpClient_thenCorrect() throws IOException, ParseException { + public void whenUseApacheHttpClient_thenCorrect() throws IOException { HttpGet request = new HttpGet(DUMMY_URL); - try (CloseableHttpClient client = HttpClients.createDefault(); CloseableHttpResponse response = client.execute(request)) { - HttpEntity entity = response.getEntity(); - logger.debug("Response -> {}", EntityUtils.toString(entity)); + try (CloseableHttpClient client = HttpClients.createDefault()) { + String response = client.execute(request, new BasicHttpClientResponseHandler()); + logger.debug("Response -> {}", response); } } } \ No newline at end of file From e9a11ae9ed5d08313a728fef8fff25abff908cef Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 7 Dec 2022 00:20:28 +0530 Subject: [PATCH 101/592] JAVA-16288 Fixed core-java-jndi unit test (#13135) * JAVA-16288 Fixed core-java-jndi unit test * JAVA-16288 Disabled givenNoContext_whenLookupObject_thenThrowNoInitialContext test --- .../com/baeldung/jndi/exceptions/JndiExceptionsUnitTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/exceptions/JndiExceptionsUnitTest.java b/core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/exceptions/JndiExceptionsUnitTest.java index 7ca0c91925..77f1e52f08 100644 --- a/core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/exceptions/JndiExceptionsUnitTest.java +++ b/core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/exceptions/JndiExceptionsUnitTest.java @@ -6,6 +6,7 @@ import javax.naming.InitialContext; import javax.naming.NameNotFoundException; import javax.naming.NoInitialContextException; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; @@ -20,12 +21,13 @@ public class JndiExceptionsUnitTest { @Test @Order(1) + @Disabled void givenNoContext_whenLookupObject_thenThrowNoInitialContext() { assertThrows(NoInitialContextException.class, () -> { JndiTemplate jndiTemplate = new JndiTemplate(); ctx = (InitialContext) jndiTemplate.getContext(); ctx.lookup("java:comp/env/jdbc/datasource"); - ctx.close(); + ctx.close(); }).printStackTrace(); } From 4c752a371f3ca9ea6668199a24ecac2bb770f00a Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 7 Dec 2022 19:25:14 +0800 Subject: [PATCH 102/592] Update README.md [skip ci] --- core-java-modules/core-java-string-operations-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-operations-5/README.md b/core-java-modules/core-java-string-operations-5/README.md index 671ba0077c..f35c946107 100644 --- a/core-java-modules/core-java-string-operations-5/README.md +++ b/core-java-modules/core-java-string-operations-5/README.md @@ -6,3 +6,4 @@ - [Capitalize the First Letter of a String in Java](https://www.baeldung.com/java-string-uppercase-first-letter) - [Convert String to char in Java](https://www.baeldung.com/java-convert-string-to-char) - [Convert String to String Array](https://www.baeldung.com/java-convert-string-to-string-array) +- [String Interpolation in Java](https://www.baeldung.com/java-string-interpolation) From a8c20292843d4db2e495325106ef3cffe5fb10e6 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 7 Dec 2022 19:28:19 +0800 Subject: [PATCH 103/592] Create README.md [skip ci] --- gcp-firebase/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 gcp-firebase/README.md diff --git a/gcp-firebase/README.md b/gcp-firebase/README.md new file mode 100644 index 0000000000..ce4c2f2a77 --- /dev/null +++ b/gcp-firebase/README.md @@ -0,0 +1,3 @@ +## Relevant Articles + +- [Using Firebase Cloud Messaging in Spring Boot Applications](https://www.baeldung.com/spring-fcm) From 671116d6abd08c1f89dea19f199b8df967b1c620 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 7 Dec 2022 19:31:38 +0800 Subject: [PATCH 104/592] Update README.md [skip ci] --- core-java-modules/core-java-exceptions-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-exceptions-4/README.md b/core-java-modules/core-java-exceptions-4/README.md index ccc40f3858..9bd5d4b9bb 100644 --- a/core-java-modules/core-java-exceptions-4/README.md +++ b/core-java-modules/core-java-exceptions-4/README.md @@ -8,4 +8,5 @@ This module contains articles about core java exceptions - [Convert long to int Type in Java](https://www.baeldung.com/java-convert-long-to-int) - [“Sneaky Throws” in Java](https://www.baeldung.com/java-sneaky-throws) - [Get the Current Stack Trace in Java](https://www.baeldung.com/java-get-current-stack-trace) +- [Errors and Exceptions in Java](https://www.baeldung.com/java-errors-vs-exceptions) - [[<-- Prev]](../core-java-exceptions-3) From 7fd529781ccebf0e8c87ee73a83e1224913f936d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 7 Dec 2022 19:35:24 +0800 Subject: [PATCH 105/592] Update README.md [skip ci] --- spring-boot-modules/spring-boot-graphql/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-graphql/README.md b/spring-boot-modules/spring-boot-graphql/README.md index cee4f7eae1..5f78461ce1 100644 --- a/spring-boot-modules/spring-boot-graphql/README.md +++ b/spring-boot-modules/spring-boot-graphql/README.md @@ -12,6 +12,7 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Error Handling in GraphQL With Spring Boot](https://www.baeldung.com/spring-graphql-error-handling) - [How to Test GraphQL Using Postman](https://www.baeldung.com/graphql-postman) - [GraphQL vs REST](https://www.baeldung.com/graphql-vs-rest) +- [REST vs. GraphQL vs. gRPC – Which API to Choose?](https://www.baeldung.com/rest-vs-graphql-vs-grpc) ### GraphQL sample queries From e367437bb73a086e6c2057b19458aadc54c094cb Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Wed, 7 Dec 2022 21:56:29 +0000 Subject: [PATCH 106/592] [JAVA-16711] Remove unnecessary system out logging --- core-java-modules/core-java-exceptions-4/README.md | 1 + .../exception/exceptions_vs_errors/ErrorExample.java | 9 ++------- .../exceptions_vs_errors/ErrorExampleUnitTest.java | 6 +++--- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/core-java-modules/core-java-exceptions-4/README.md b/core-java-modules/core-java-exceptions-4/README.md index ccc40f3858..9bd5d4b9bb 100644 --- a/core-java-modules/core-java-exceptions-4/README.md +++ b/core-java-modules/core-java-exceptions-4/README.md @@ -8,4 +8,5 @@ This module contains articles about core java exceptions - [Convert long to int Type in Java](https://www.baeldung.com/java-convert-long-to-int) - [“Sneaky Throws” in Java](https://www.baeldung.com/java-sneaky-throws) - [Get the Current Stack Trace in Java](https://www.baeldung.com/java-get-current-stack-trace) +- [Errors and Exceptions in Java](https://www.baeldung.com/java-errors-vs-exceptions) - [[<-- Prev]](../core-java-exceptions-3) diff --git a/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/exceptions_vs_errors/ErrorExample.java b/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/exceptions_vs_errors/ErrorExample.java index 143ca8c57e..904877e01e 100644 --- a/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/exceptions_vs_errors/ErrorExample.java +++ b/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/exceptions_vs_errors/ErrorExample.java @@ -1,14 +1,9 @@ package com.baeldung.exception.exceptions_vs_errors; public class ErrorExample { - - public static void main(String[] args) { - overflow(); - } - public static void overflow() { - System.out.println("overflow..."); - overflow(); + public static void main(String[] args) { + throw new AssertionError(); } } diff --git a/core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/exceptions_vs_errors/ErrorExampleUnitTest.java b/core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/exceptions_vs_errors/ErrorExampleUnitTest.java index 9fca24638d..acbb07be1f 100644 --- a/core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/exceptions_vs_errors/ErrorExampleUnitTest.java +++ b/core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/exceptions_vs_errors/ErrorExampleUnitTest.java @@ -3,11 +3,11 @@ package com.baeldung.exception.exceptions_vs_errors; import org.junit.Test; import org.junit.jupiter.api.Assertions; -// Unit test for the ErrorExample class. public class ErrorExampleUnitTest { + @Test public void whenMainMethodIsRun_thenStackOverflowError() { - Assertions.assertThrows(StackOverflowError.class, - () -> ErrorExample.main(null)); + Assertions.assertThrows(AssertionError.class, + () -> ErrorExample.main(null)); } } From 963ea1f9f519e773e441e91d6746f8b5dcd9d46f Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 8 Dec 2022 11:32:44 +0530 Subject: [PATCH 107/592] JAVA-16288 Disabled intermittently failing test (#13140) --- .../java/com/baeldung/jersey/server/EchoHeadersUnitTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersUnitTest.java b/jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersUnitTest.java index ac2cc2c4eb..cca7446dd1 100644 --- a/jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersUnitTest.java +++ b/jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersUnitTest.java @@ -5,6 +5,7 @@ import com.baeldung.jersey.client.filter.AddHeaderOnRequestFilter; import org.glassfish.jersey.media.sse.SseFeature; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.test.JerseyTest; +import org.junit.Ignore; import org.junit.Test; import javax.ws.rs.core.Application; @@ -16,6 +17,7 @@ import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +@Ignore public class EchoHeadersUnitTest extends JerseyTest { private static final String SIMPLE_HEADER_KEY = "my-header-key"; From 002051b590ba013eedc0c6230f92e77656113430 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 8 Dec 2022 15:24:05 +0800 Subject: [PATCH 108/592] Create README.md [skip ci] --- spring-boot-modules/spring-boot-process-automation/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 spring-boot-modules/spring-boot-process-automation/README.md diff --git a/spring-boot-modules/spring-boot-process-automation/README.md b/spring-boot-modules/spring-boot-process-automation/README.md new file mode 100644 index 0000000000..a623302a9f --- /dev/null +++ b/spring-boot-modules/spring-boot-process-automation/README.md @@ -0,0 +1,3 @@ +## Relevant Articles + +- [Running Spring Boot Applications with the Embedded Camunda Engine](https://www.baeldung.com/spring-boot-embedded-camunda) From 7c9018299c2196b2d9f0929bffc397fa08af597e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 8 Dec 2022 15:33:10 +0800 Subject: [PATCH 109/592] Update README.md [skip ci] --- spring-core-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-core-6/README.md b/spring-core-6/README.md index 9976dbc099..1cb5935cc5 100644 --- a/spring-core-6/README.md +++ b/spring-core-6/README.md @@ -2,3 +2,4 @@ ### Relevant Articles: - [Instantiating Multiple Beans of the Same Class with Spring Annotations](https://www.baeldung.com/spring-same-class-multiple-beans) - [Using Environment Variables in Spring Boot’s application.properties](https://www.baeldung.com/spring-boot-properties-env-variables) +- [Reinitialize Singleton Bean in Spring Context](https://www.baeldung.com/spring-reinitialize-singleton-bean) From 0276e154a5571d8c5ec1df61026f5eacf915b87a Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 8 Dec 2022 15:38:32 +0800 Subject: [PATCH 110/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-4/README.md b/core-java-modules/core-java-collections-4/README.md index 1f52dc6d91..7a97ebd863 100644 --- a/core-java-modules/core-java-collections-4/README.md +++ b/core-java-modules/core-java-collections-4/README.md @@ -12,3 +12,4 @@ - [Fixed Size Queue Implementations in Java](https://www.baeldung.com/java-fixed-size-queue) - [Difference Between Java Enumeration and Iterator](https://www.baeldung.com/java-enumeration-vs-iterator) - [Sort Collection of Objects by Multiple Fields in Java](https://www.baeldung.com/java-sort-collection-multiple-fields) +- [Guide to Java PriorityQueue](https://www.baeldung.com/java-priorityqueue) From c9ceba772d1902b289db3063adc292c87c81b676 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 8 Dec 2022 15:43:38 +0800 Subject: [PATCH 111/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-4/README.md b/core-java-modules/core-java-collections-4/README.md index 7a97ebd863..9d3ee5e657 100644 --- a/core-java-modules/core-java-collections-4/README.md +++ b/core-java-modules/core-java-collections-4/README.md @@ -13,3 +13,4 @@ - [Difference Between Java Enumeration and Iterator](https://www.baeldung.com/java-enumeration-vs-iterator) - [Sort Collection of Objects by Multiple Fields in Java](https://www.baeldung.com/java-sort-collection-multiple-fields) - [Guide to Java PriorityQueue](https://www.baeldung.com/java-priorityqueue) +- [Java Generics PECS – Producer Extends Consumer Super](https://www.baeldung.com/java-generics-pecs) From 521215ae47e0a8c0aa65f60ca075c3cd74e6292d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 8 Dec 2022 15:47:27 +0800 Subject: [PATCH 112/592] Create README.md [skip ci] --- spring-credhub/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 spring-credhub/README.md diff --git a/spring-credhub/README.md b/spring-credhub/README.md new file mode 100644 index 0000000000..7eb82aed28 --- /dev/null +++ b/spring-credhub/README.md @@ -0,0 +1,3 @@ +## Relevant Articles + +- [A Guide to Spring CredHub](https://www.baeldung.com/spring-credhub) From 3b31ba4f998071c01c6560d04321edff2f9f6bd6 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 8 Dec 2022 09:09:03 +0100 Subject: [PATCH 113/592] JAVA-5958: Ratelimit with client ip address (#13067) * JAVA-5958: Ratelimit with client ip address Co-authored-by: Harpal Singh --- .../ipaddress/IpAddressApplication.java | 38 +++++++++++++++++++ .../ProxiedClientAddressResolver.java | 21 ++++++++++ .../SimpleClientAddressResolver.java | 23 +++++++++++ .../ipaddress-application.properties | 6 +++ 4 files changed, 88 insertions(+) create mode 100644 spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/IpAddressApplication.java create mode 100644 spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/ProxiedClientAddressResolver.java create mode 100644 spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/SimpleClientAddressResolver.java create mode 100644 spring-cloud-modules/spring-cloud-gateway/src/main/resources/ipaddress-application.properties diff --git a/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/IpAddressApplication.java b/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/IpAddressApplication.java new file mode 100644 index 0000000000..472c331404 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/IpAddressApplication.java @@ -0,0 +1,38 @@ +package com.baeldung.springcloudgateway.ipaddress; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.gateway.filter.ratelimit.RedisRateLimiter; +import org.springframework.cloud.gateway.route.RouteLocator; +import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.PropertySource; + +@SpringBootApplication() +@PropertySource("classpath:ipaddress-application.properties") +public class IpAddressApplication { + public static void main(String[] args) { + SpringApplication.run(IpAddressApplication.class, args); + } + + @Bean + public RouteLocator myRoutes(RouteLocatorBuilder builder) { + return builder.routes() + .route("requestratelimiter_route", p -> p + .path("/example") + .filters(f -> f.requestRateLimiter(r -> r.setRateLimiter(redisRateLimiter()))) + .uri("http://example.org")) + .route("ipaddress_route", p -> p + .path("/example2") + .filters(f -> f.requestRateLimiter(r -> r.setRateLimiter(redisRateLimiter()) + .setDenyEmptyKey(false) + .setKeyResolver(new SimpleClientAddressResolver()))) + .uri("http://example.org")) + .build(); + } + + @Bean + public RedisRateLimiter redisRateLimiter() { + return new RedisRateLimiter(1, 1, 1); + } +} diff --git a/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/ProxiedClientAddressResolver.java b/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/ProxiedClientAddressResolver.java new file mode 100644 index 0000000000..25b1fbcf1f --- /dev/null +++ b/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/ProxiedClientAddressResolver.java @@ -0,0 +1,21 @@ +package com.baeldung.springcloudgateway.ipaddress; + +import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver; +import org.springframework.cloud.gateway.support.ipresolver.XForwardedRemoteAddressResolver; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import java.net.InetSocketAddress; + +@Primary +@Component +public class ProxiedClientAddressResolver implements KeyResolver { + @Override + public Mono resolve(ServerWebExchange exchange) { + XForwardedRemoteAddressResolver resolver = XForwardedRemoteAddressResolver.maxTrustedIndex(1); + InetSocketAddress inetSocketAddress = resolver.resolve(exchange); + return Mono.just(inetSocketAddress.getAddress().getHostAddress()); + } +} diff --git a/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/SimpleClientAddressResolver.java b/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/SimpleClientAddressResolver.java new file mode 100644 index 0000000000..904fd4c193 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/SimpleClientAddressResolver.java @@ -0,0 +1,23 @@ +package com.baeldung.springcloudgateway.ipaddress; + +import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.util.Optional; + +@Component +public class SimpleClientAddressResolver implements KeyResolver { + @Override + public Mono resolve(ServerWebExchange exchange) { + return Optional.ofNullable(exchange.getRequest().getRemoteAddress()) + .map(InetSocketAddress::getAddress) + .map(InetAddress::getHostAddress) + .map(Mono::just) + .orElse(Mono.empty()); + } +} + diff --git a/spring-cloud-modules/spring-cloud-gateway/src/main/resources/ipaddress-application.properties b/spring-cloud-modules/spring-cloud-gateway/src/main/resources/ipaddress-application.properties new file mode 100644 index 0000000000..ebec52403a --- /dev/null +++ b/spring-cloud-modules/spring-cloud-gateway/src/main/resources/ipaddress-application.properties @@ -0,0 +1,6 @@ +server.port=8081 +spring.redis.database=0 +spring.redis.host=localhost +spring.redis.port=16379 +spring.redis.password=mypass +spring.redis.timeout=60000 From 7b9ab06c14525b76f17948b93e186dd9923d472b Mon Sep 17 00:00:00 2001 From: freelansam <79205526+freelansam@users.noreply.github.com> Date: Thu, 8 Dec 2022 18:58:09 +0530 Subject: [PATCH 114/592] JAVA-16264: review module names (#13136) --- .../pom.xml | 8 ++++---- .../infrastructure/db/InMemoryOrderStore.java | 0 .../infrastructure/events/SimpleEventBus.java | 0 .../src/main/java/module-info.java | 0 .../{mainapp => ddd-contexts-mainapp}/pom.xml | 4 ++-- .../baeldung/dddcontexts/mainapp/Application.java | 0 .../src/main/java/module-info.java | 0 .../pom.xml | 4 ++-- .../ordercontext/model/CustomerOrder.java | 0 .../dddcontexts/ordercontext/model/OrderItem.java | 0 .../repository/CustomerOrderRepository.java | 0 .../ordercontext/service/CustomerOrderService.java | 0 .../ordercontext/service/OrderService.java | 0 .../src/main/java/module-info.java | 0 .../pom.xml | 2 +- .../sharedkernel/events/ApplicationEvent.java | 0 .../dddcontexts/sharedkernel/events/EventBus.java | 0 .../sharedkernel/events/EventSubscriber.java | 0 .../sharedkernel/service/ApplicationService.java | 0 .../src/main/java/module-info.java | 0 .../pom.xml | 4 ++-- .../shippingcontext/model/PackageItem.java | 0 .../dddcontexts/shippingcontext/model/Parcel.java | 0 .../shippingcontext/model/ShippableOrder.java | 0 .../repository/ShippingOrderRepository.java | 0 .../service/ParcelShippingService.java | 0 .../shippingcontext/service/ShippingService.java | 0 .../src/main/java/module-info.java | 0 ddd-contexts/pom.xml | 10 +++++----- .../{daomodule => maven-daomodule}/pom.xml | 2 +- .../src/main/java/com/baeldung/daomodule/Dao.java | 0 .../src/main/java/module-info.java | 0 .../{entitymodule => maven-entitymodule}/pom.xml | 2 +- .../main/java/com/baeldung/entitymodule/User.java | 0 .../src/main/java/module-info.java | 0 .../{mainappmodule => maven-mainappmodule}/pom.xml | 8 ++++---- .../java/com/baeldung/mainappmodule/Application.java | 0 .../src/main/java/module-info.java | 0 .../{userdaomodule => maven-userdaomodule}/pom.xml | 2 +- .../java/com/baeldung/userdaomodule/UserDao.java | 0 .../src/main/java/module-info.java | 0 maven-modules/multimodulemavenproject/pom.xml | 8 ++++---- maven-modules/version-collision/pom.xml | 4 ++-- .../version-collision/project-collision/pom.xml | 4 ++-- .../pom.xml | 2 +- .../pom.xml | 2 +- maven-modules/version-overriding-plugins/pom.xml | 4 ++-- .../{child-a => version-overriding-child-a}/pom.xml | 2 +- .../{child-b => version-overriding-child-b}/pom.xml | 2 +- spring-cloud-modules/spring-cloud-archaius/pom.xml | 12 ++++++------ .../pom.xml | 4 ++-- .../AdditionalSourcesSimpleApplication.java | 0 .../config/ApplicationPropertiesConfigurations.java | 0 .../controller/ConfigPropertiesController.java | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/config.properties | 0 .../src/main/resources/other-config.properties | 0 .../ArchaiusAdditionalSourcesLiveTest.java | 0 .../additionalsources/SpringContextTest.java | 0 .../src/test/resources/logback-test.xml | 0 .../pom.xml | 4 ++-- .../archaius/basic/BasicArchaiusApplication.java | 0 .../basic/controller/ConfigPropertiesController.java | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/config.properties | 0 .../src/main/resources/other.properties | 0 .../test/java/com/baeldung/SpringContextTest.java | 0 .../ArchaiusBasicConfigurationIntegrationTest.java | 0 .../basic/ArchaiusBasicConfigurationLiveTest.java | 0 .../cloud/archaius/basic/SpringContextTest.java | 0 .../src/test/resources/config.properties | 0 .../src/test/resources/logback-test.xml | 0 .../pom.xml | 4 ++-- .../dynamosources/DynamoSourcesApplication.java | 0 .../config/ApplicationPropertiesConfigurations.java | 0 .../dynamosources/config/DynamoDbConfiguration.java | 0 .../controller/ConfigPropertiesController.java | 0 .../dynamosources/dynamodb/ArchaiusProperties.java | 0 .../dynamodb/ArchaiusPropertiesRepository.java | 0 .../src/main/resources/application.properties | 0 .../dynamosources/ArchaiusDynamoDbLiveTest.java | 0 .../dynamosources/SpringContextLiveTest.java | 0 .../pom.xml | 4 ++-- .../extraconfigs/ExtraConfigsApplication.java | 0 .../controllers/ConfigPropertiesController.java | 0 .../src/main/resources/application.properties | 0 .../main/resources/other-config-dir/extra.properties | 0 .../src/main/resources/other.properties | 0 .../test/java/com/baeldung/SpringContextTest.java | 0 .../extraconfigs/ArchaiusExtraConfigsLiveTest.java | 0 .../src/test/resources/logback-test.xml | 0 .../pom.xml | 4 ++-- .../archaius/jdbconfig/JdbcSourcesApplication.java | 0 .../config/ApplicationPropertiesConfigurations.java | 0 .../controller/ConfigPropertiesController.java | 0 .../cloud/archaius/jdbconfig/jdbc/Properties.java | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/data.sql | 0 .../jdbconfig/ArchaiusJDBCSourceLiveTest.java | 0 .../cloud/archaius/jdbconfig/SpringContextTest.java | 0 .../src/test/resources/logback-test.xml | 0 .../pom.xml | 4 ++-- .../zookeeperconfig/ZookeeperConfigApplication.java | 0 .../config/ZookeeperConfigsInitializer.java | 0 .../controller/ConfigPropertiesController.java | 0 .../src/main/resources/application.properties | 0 .../zookeeperconfig/ArchaiusZookeeperLiveTest.java | 0 .../zookeeperconfig/SpringContextLiveTest.java | 0 spring-cloud-modules/spring-cloud-dapr/pom.xml | 4 ++-- .../{gateway => spring-cloud-dapr-gateway}/pom.xml | 2 +- .../main/java/com/baeldung/gateway/GatewayApp.java | 0 .../src/main/resources/application-no-dapr.yml | 0 .../src/main/resources/application-with-dapr.yml | 0 .../{greeting => spring-cloud-dapr-greeting}/pom.xml | 2 +- .../main/java/com/baeldung/hello/GreetingApp.java | 0 .../java/com/baeldung/hello/GreetingController.java | 0 .../src/main/resources/application.yml | 0 117 files changed, 59 insertions(+), 59 deletions(-) rename ddd-contexts/{infrastructure => ddd-contexts-infrastructure}/pom.xml (86%) rename ddd-contexts/{infrastructure => ddd-contexts-infrastructure}/src/main/java/com/baeldung/dddcontexts/infrastructure/db/InMemoryOrderStore.java (100%) rename ddd-contexts/{infrastructure => ddd-contexts-infrastructure}/src/main/java/com/baeldung/dddcontexts/infrastructure/events/SimpleEventBus.java (100%) rename ddd-contexts/{infrastructure => ddd-contexts-infrastructure}/src/main/java/module-info.java (100%) rename ddd-contexts/{mainapp => ddd-contexts-mainapp}/pom.xml (93%) rename ddd-contexts/{mainapp => ddd-contexts-mainapp}/src/main/java/com/baeldung/dddcontexts/mainapp/Application.java (100%) rename ddd-contexts/{mainapp => ddd-contexts-mainapp}/src/main/java/module-info.java (100%) rename ddd-contexts/{ordercontext => ddd-contexts-ordercontext}/pom.xml (91%) rename ddd-contexts/{ordercontext => ddd-contexts-ordercontext}/src/main/java/com/baeldung/dddcontexts/ordercontext/model/CustomerOrder.java (100%) rename ddd-contexts/{ordercontext => ddd-contexts-ordercontext}/src/main/java/com/baeldung/dddcontexts/ordercontext/model/OrderItem.java (100%) rename ddd-contexts/{ordercontext => ddd-contexts-ordercontext}/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java (100%) rename ddd-contexts/{ordercontext => ddd-contexts-ordercontext}/src/main/java/com/baeldung/dddcontexts/ordercontext/service/CustomerOrderService.java (100%) rename ddd-contexts/{ordercontext => ddd-contexts-ordercontext}/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java (100%) rename ddd-contexts/{ordercontext => ddd-contexts-ordercontext}/src/main/java/module-info.java (100%) rename ddd-contexts/{sharedkernel => ddd-contexts-sharedkernel}/pom.xml (94%) rename ddd-contexts/{sharedkernel => ddd-contexts-sharedkernel}/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/ApplicationEvent.java (100%) rename ddd-contexts/{sharedkernel => ddd-contexts-sharedkernel}/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventBus.java (100%) rename ddd-contexts/{sharedkernel => ddd-contexts-sharedkernel}/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventSubscriber.java (100%) rename ddd-contexts/{sharedkernel => ddd-contexts-sharedkernel}/src/main/java/com/baeldung/dddcontexts/sharedkernel/service/ApplicationService.java (100%) rename ddd-contexts/{sharedkernel => ddd-contexts-sharedkernel}/src/main/java/module-info.java (100%) rename ddd-contexts/{shippingcontext => ddd-contexts-shippingcontext}/pom.xml (90%) rename ddd-contexts/{shippingcontext => ddd-contexts-shippingcontext}/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/PackageItem.java (100%) rename ddd-contexts/{shippingcontext => ddd-contexts-shippingcontext}/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/Parcel.java (100%) rename ddd-contexts/{shippingcontext => ddd-contexts-shippingcontext}/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/ShippableOrder.java (100%) rename ddd-contexts/{shippingcontext => ddd-contexts-shippingcontext}/src/main/java/com/baeldung/dddcontexts/shippingcontext/repository/ShippingOrderRepository.java (100%) rename ddd-contexts/{shippingcontext => ddd-contexts-shippingcontext}/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ParcelShippingService.java (100%) rename ddd-contexts/{shippingcontext => ddd-contexts-shippingcontext}/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ShippingService.java (100%) rename ddd-contexts/{shippingcontext => ddd-contexts-shippingcontext}/src/main/java/module-info.java (100%) rename maven-modules/multimodulemavenproject/{daomodule => maven-daomodule}/pom.xml (95%) rename maven-modules/multimodulemavenproject/{daomodule => maven-daomodule}/src/main/java/com/baeldung/daomodule/Dao.java (100%) rename maven-modules/multimodulemavenproject/{daomodule => maven-daomodule}/src/main/java/module-info.java (100%) rename maven-modules/multimodulemavenproject/{entitymodule => maven-entitymodule}/pom.xml (95%) rename maven-modules/multimodulemavenproject/{entitymodule => maven-entitymodule}/src/main/java/com/baeldung/entitymodule/User.java (100%) rename maven-modules/multimodulemavenproject/{entitymodule => maven-entitymodule}/src/main/java/module-info.java (100%) rename maven-modules/multimodulemavenproject/{mainappmodule => maven-mainappmodule}/pom.xml (88%) rename maven-modules/multimodulemavenproject/{mainappmodule => maven-mainappmodule}/src/main/java/com/baeldung/mainappmodule/Application.java (100%) rename maven-modules/multimodulemavenproject/{mainappmodule => maven-mainappmodule}/src/main/java/module-info.java (100%) rename maven-modules/multimodulemavenproject/{userdaomodule => maven-userdaomodule}/pom.xml (96%) rename maven-modules/multimodulemavenproject/{userdaomodule => maven-userdaomodule}/src/main/java/com/baeldung/userdaomodule/UserDao.java (100%) rename maven-modules/multimodulemavenproject/{userdaomodule => maven-userdaomodule}/src/main/java/module-info.java (100%) rename maven-modules/version-collision/{project-a => version-collision-project-a}/pom.xml (90%) rename maven-modules/version-collision/{project-b => version-collision-project-b}/pom.xml (90%) rename maven-modules/version-overriding-plugins/{child-a => version-overriding-child-a}/pom.xml (95%) rename maven-modules/version-overriding-plugins/{child-b => version-overriding-child-b}/pom.xml (87%) rename spring-cloud-modules/spring-cloud-archaius/{basic-config => spring-cloud-archaius-additionalsources}/pom.xml (83%) rename spring-cloud-modules/spring-cloud-archaius/{additional-sources-simple => spring-cloud-archaius-additionalsources}/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/AdditionalSourcesSimpleApplication.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{additional-sources-simple => spring-cloud-archaius-additionalsources}/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/config/ApplicationPropertiesConfigurations.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{additional-sources-simple => spring-cloud-archaius-additionalsources}/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/controller/ConfigPropertiesController.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{additional-sources-simple => spring-cloud-archaius-additionalsources}/src/main/resources/application.properties (100%) rename spring-cloud-modules/spring-cloud-archaius/{additional-sources-simple => spring-cloud-archaius-additionalsources}/src/main/resources/config.properties (100%) rename spring-cloud-modules/spring-cloud-archaius/{additional-sources-simple => spring-cloud-archaius-additionalsources}/src/main/resources/other-config.properties (100%) rename spring-cloud-modules/spring-cloud-archaius/{additional-sources-simple => spring-cloud-archaius-additionalsources}/src/test/java/com/baeldung/spring/cloud/archaius/additionalsources/ArchaiusAdditionalSourcesLiveTest.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{additional-sources-simple => spring-cloud-archaius-additionalsources}/src/test/java/com/baeldung/spring/cloud/archaius/additionalsources/SpringContextTest.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{additional-sources-simple => spring-cloud-archaius-additionalsources}/src/test/resources/logback-test.xml (100%) rename spring-cloud-modules/spring-cloud-archaius/{additional-sources-simple => spring-cloud-archaius-basic-config}/pom.xml (85%) rename spring-cloud-modules/spring-cloud-archaius/{basic-config => spring-cloud-archaius-basic-config}/src/main/java/com/baeldung/spring/cloud/archaius/basic/BasicArchaiusApplication.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{basic-config => spring-cloud-archaius-basic-config}/src/main/java/com/baeldung/spring/cloud/archaius/basic/controller/ConfigPropertiesController.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{basic-config => spring-cloud-archaius-basic-config}/src/main/resources/application.properties (100%) rename spring-cloud-modules/spring-cloud-archaius/{basic-config => spring-cloud-archaius-basic-config}/src/main/resources/config.properties (100%) rename spring-cloud-modules/spring-cloud-archaius/{basic-config => spring-cloud-archaius-basic-config}/src/main/resources/other.properties (100%) rename spring-cloud-modules/spring-cloud-archaius/{basic-config => spring-cloud-archaius-basic-config}/src/test/java/com/baeldung/SpringContextTest.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{basic-config => spring-cloud-archaius-basic-config}/src/test/java/com/baeldung/spring/cloud/archaius/basic/ArchaiusBasicConfigurationIntegrationTest.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{basic-config => spring-cloud-archaius-basic-config}/src/test/java/com/baeldung/spring/cloud/archaius/basic/ArchaiusBasicConfigurationLiveTest.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{basic-config => spring-cloud-archaius-basic-config}/src/test/java/com/baeldung/spring/cloud/archaius/basic/SpringContextTest.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{basic-config => spring-cloud-archaius-basic-config}/src/test/resources/config.properties (100%) rename spring-cloud-modules/spring-cloud-archaius/{basic-config => spring-cloud-archaius-basic-config}/src/test/resources/logback-test.xml (100%) rename spring-cloud-modules/spring-cloud-archaius/{dynamodb-config => spring-cloud-archaius-dynamodb-config}/pom.xml (92%) rename spring-cloud-modules/spring-cloud-archaius/{dynamodb-config => spring-cloud-archaius-dynamodb-config}/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/DynamoSourcesApplication.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{dynamodb-config => spring-cloud-archaius-dynamodb-config}/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/config/ApplicationPropertiesConfigurations.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{dynamodb-config => spring-cloud-archaius-dynamodb-config}/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/config/DynamoDbConfiguration.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{dynamodb-config => spring-cloud-archaius-dynamodb-config}/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/controller/ConfigPropertiesController.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{dynamodb-config => spring-cloud-archaius-dynamodb-config}/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/dynamodb/ArchaiusProperties.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{dynamodb-config => spring-cloud-archaius-dynamodb-config}/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/dynamodb/ArchaiusPropertiesRepository.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{dynamodb-config => spring-cloud-archaius-dynamodb-config}/src/main/resources/application.properties (100%) rename spring-cloud-modules/spring-cloud-archaius/{dynamodb-config => spring-cloud-archaius-dynamodb-config}/src/test/java/com/baeldung/spring/cloud/archaius/dynamosources/ArchaiusDynamoDbLiveTest.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{dynamodb-config => spring-cloud-archaius-dynamodb-config}/src/test/java/com/baeldung/spring/cloud/archaius/dynamosources/SpringContextLiveTest.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{extra-configs => spring-cloud-archaius-extra-configs}/pom.xml (91%) rename spring-cloud-modules/spring-cloud-archaius/{extra-configs => spring-cloud-archaius-extra-configs}/src/main/java/com/baeldung/spring/cloud/archaius/extraconfigs/ExtraConfigsApplication.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{extra-configs => spring-cloud-archaius-extra-configs}/src/main/java/com/baeldung/spring/cloud/archaius/extraconfigs/controllers/ConfigPropertiesController.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{extra-configs => spring-cloud-archaius-extra-configs}/src/main/resources/application.properties (100%) rename spring-cloud-modules/spring-cloud-archaius/{extra-configs => spring-cloud-archaius-extra-configs}/src/main/resources/other-config-dir/extra.properties (100%) rename spring-cloud-modules/spring-cloud-archaius/{extra-configs => spring-cloud-archaius-extra-configs}/src/main/resources/other.properties (100%) rename spring-cloud-modules/spring-cloud-archaius/{extra-configs => spring-cloud-archaius-extra-configs}/src/test/java/com/baeldung/SpringContextTest.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{extra-configs => spring-cloud-archaius-extra-configs}/src/test/java/com/baeldung/spring/cloud/archaius/extraconfigs/ArchaiusExtraConfigsLiveTest.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{extra-configs => spring-cloud-archaius-extra-configs}/src/test/resources/logback-test.xml (100%) rename spring-cloud-modules/spring-cloud-archaius/{jdbc-config => spring-cloud-archaius-jdbc-config}/pom.xml (89%) rename spring-cloud-modules/spring-cloud-archaius/{jdbc-config => spring-cloud-archaius-jdbc-config}/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/JdbcSourcesApplication.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{jdbc-config => spring-cloud-archaius-jdbc-config}/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/config/ApplicationPropertiesConfigurations.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{jdbc-config => spring-cloud-archaius-jdbc-config}/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/controller/ConfigPropertiesController.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{jdbc-config => spring-cloud-archaius-jdbc-config}/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/jdbc/Properties.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{jdbc-config => spring-cloud-archaius-jdbc-config}/src/main/resources/application.properties (100%) rename spring-cloud-modules/spring-cloud-archaius/{jdbc-config => spring-cloud-archaius-jdbc-config}/src/main/resources/data.sql (100%) rename spring-cloud-modules/spring-cloud-archaius/{jdbc-config => spring-cloud-archaius-jdbc-config}/src/test/java/com/baeldung/spring/cloud/archaius/jdbconfig/ArchaiusJDBCSourceLiveTest.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{jdbc-config => spring-cloud-archaius-jdbc-config}/src/test/java/com/baeldung/spring/cloud/archaius/jdbconfig/SpringContextTest.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{jdbc-config => spring-cloud-archaius-jdbc-config}/src/test/resources/logback-test.xml (100%) rename spring-cloud-modules/spring-cloud-archaius/{zookeeper-config => spring-cloud-archaius-zookeeper-config}/pom.xml (92%) rename spring-cloud-modules/spring-cloud-archaius/{zookeeper-config => spring-cloud-archaius-zookeeper-config}/src/main/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/ZookeeperConfigApplication.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{zookeeper-config => spring-cloud-archaius-zookeeper-config}/src/main/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/config/ZookeeperConfigsInitializer.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{zookeeper-config => spring-cloud-archaius-zookeeper-config}/src/main/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/controller/ConfigPropertiesController.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{zookeeper-config => spring-cloud-archaius-zookeeper-config}/src/main/resources/application.properties (100%) rename spring-cloud-modules/spring-cloud-archaius/{zookeeper-config => spring-cloud-archaius-zookeeper-config}/src/test/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/ArchaiusZookeeperLiveTest.java (100%) rename spring-cloud-modules/spring-cloud-archaius/{zookeeper-config => spring-cloud-archaius-zookeeper-config}/src/test/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/SpringContextLiveTest.java (100%) rename spring-cloud-modules/spring-cloud-dapr/{gateway => spring-cloud-dapr-gateway}/pom.xml (95%) rename spring-cloud-modules/spring-cloud-dapr/{gateway => spring-cloud-dapr-gateway}/src/main/java/com/baeldung/gateway/GatewayApp.java (100%) rename spring-cloud-modules/spring-cloud-dapr/{gateway => spring-cloud-dapr-gateway}/src/main/resources/application-no-dapr.yml (100%) rename spring-cloud-modules/spring-cloud-dapr/{gateway => spring-cloud-dapr-gateway}/src/main/resources/application-with-dapr.yml (100%) rename spring-cloud-modules/spring-cloud-dapr/{greeting => spring-cloud-dapr-greeting}/pom.xml (93%) rename spring-cloud-modules/spring-cloud-dapr/{greeting => spring-cloud-dapr-greeting}/src/main/java/com/baeldung/hello/GreetingApp.java (100%) rename spring-cloud-modules/spring-cloud-dapr/{greeting => spring-cloud-dapr-greeting}/src/main/java/com/baeldung/hello/GreetingController.java (100%) rename spring-cloud-modules/spring-cloud-dapr/{greeting => spring-cloud-dapr-greeting}/src/main/resources/application.yml (100%) diff --git a/ddd-contexts/infrastructure/pom.xml b/ddd-contexts/ddd-contexts-infrastructure/pom.xml similarity index 86% rename from ddd-contexts/infrastructure/pom.xml rename to ddd-contexts/ddd-contexts-infrastructure/pom.xml index 6107991ceb..beceaa7fb2 100644 --- a/ddd-contexts/infrastructure/pom.xml +++ b/ddd-contexts/ddd-contexts-infrastructure/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 com.baeldung.dddcontexts.infrastructure - infrastructure + ddd-contexts-infrastructure 1.0 jar @@ -18,17 +18,17 @@ com.baeldung.dddcontexts.shippingcontext - shippingcontext + ddd-contexts-shippingcontext ${appmodules.version} com.baeldung.dddcontexts.ordercontext - ordercontext + ddd-contexts-ordercontext ${appmodules.version} com.baeldung.dddcontexts.sharedkernel - sharedkernel + ddd-contexts-sharedkernel ${appmodules.version} diff --git a/ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/db/InMemoryOrderStore.java b/ddd-contexts/ddd-contexts-infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/db/InMemoryOrderStore.java similarity index 100% rename from ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/db/InMemoryOrderStore.java rename to ddd-contexts/ddd-contexts-infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/db/InMemoryOrderStore.java diff --git a/ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/events/SimpleEventBus.java b/ddd-contexts/ddd-contexts-infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/events/SimpleEventBus.java similarity index 100% rename from ddd-contexts/infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/events/SimpleEventBus.java rename to ddd-contexts/ddd-contexts-infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/events/SimpleEventBus.java diff --git a/ddd-contexts/infrastructure/src/main/java/module-info.java b/ddd-contexts/ddd-contexts-infrastructure/src/main/java/module-info.java similarity index 100% rename from ddd-contexts/infrastructure/src/main/java/module-info.java rename to ddd-contexts/ddd-contexts-infrastructure/src/main/java/module-info.java diff --git a/ddd-contexts/mainapp/pom.xml b/ddd-contexts/ddd-contexts-mainapp/pom.xml similarity index 93% rename from ddd-contexts/mainapp/pom.xml rename to ddd-contexts/ddd-contexts-mainapp/pom.xml index 8046ae4e7d..6f7461e15b 100644 --- a/ddd-contexts/mainapp/pom.xml +++ b/ddd-contexts/ddd-contexts-mainapp/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 com.baeldung.dddcontexts.mainapp - mainapp + ddd-contexts-mainapp 1.0 jar @@ -18,7 +18,7 @@ com.baeldung.dddcontexts.infrastructure - infrastructure + ddd-contexts-infrastructure ${appmodules.version} diff --git a/ddd-contexts/mainapp/src/main/java/com/baeldung/dddcontexts/mainapp/Application.java b/ddd-contexts/ddd-contexts-mainapp/src/main/java/com/baeldung/dddcontexts/mainapp/Application.java similarity index 100% rename from ddd-contexts/mainapp/src/main/java/com/baeldung/dddcontexts/mainapp/Application.java rename to ddd-contexts/ddd-contexts-mainapp/src/main/java/com/baeldung/dddcontexts/mainapp/Application.java diff --git a/ddd-contexts/mainapp/src/main/java/module-info.java b/ddd-contexts/ddd-contexts-mainapp/src/main/java/module-info.java similarity index 100% rename from ddd-contexts/mainapp/src/main/java/module-info.java rename to ddd-contexts/ddd-contexts-mainapp/src/main/java/module-info.java diff --git a/ddd-contexts/ordercontext/pom.xml b/ddd-contexts/ddd-contexts-ordercontext/pom.xml similarity index 91% rename from ddd-contexts/ordercontext/pom.xml rename to ddd-contexts/ddd-contexts-ordercontext/pom.xml index e29f109b71..d6e5811357 100644 --- a/ddd-contexts/ordercontext/pom.xml +++ b/ddd-contexts/ddd-contexts-ordercontext/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 com.baeldung.dddcontexts.ordercontext - ordercontext + ddd-contexts-ordercontext 1.0 jar @@ -17,7 +17,7 @@ com.baeldung.dddcontexts.sharedkernel - sharedkernel + ddd-contexts-sharedkernel ${appmodules.version} diff --git a/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/CustomerOrder.java b/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/CustomerOrder.java similarity index 100% rename from ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/CustomerOrder.java rename to ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/CustomerOrder.java diff --git a/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/OrderItem.java b/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/OrderItem.java similarity index 100% rename from ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/OrderItem.java rename to ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/OrderItem.java diff --git a/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java b/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java similarity index 100% rename from ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java rename to ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java diff --git a/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/CustomerOrderService.java b/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/CustomerOrderService.java similarity index 100% rename from ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/CustomerOrderService.java rename to ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/CustomerOrderService.java diff --git a/ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java b/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java similarity index 100% rename from ddd-contexts/ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java rename to ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java diff --git a/ddd-contexts/ordercontext/src/main/java/module-info.java b/ddd-contexts/ddd-contexts-ordercontext/src/main/java/module-info.java similarity index 100% rename from ddd-contexts/ordercontext/src/main/java/module-info.java rename to ddd-contexts/ddd-contexts-ordercontext/src/main/java/module-info.java diff --git a/ddd-contexts/sharedkernel/pom.xml b/ddd-contexts/ddd-contexts-sharedkernel/pom.xml similarity index 94% rename from ddd-contexts/sharedkernel/pom.xml rename to ddd-contexts/ddd-contexts-sharedkernel/pom.xml index 5d31973c92..7c159dc741 100644 --- a/ddd-contexts/sharedkernel/pom.xml +++ b/ddd-contexts/ddd-contexts-sharedkernel/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 com.baeldung.dddcontexts.sharedkernel - sharedkernel + ddd-contexts-sharedkernel 1.0 jar diff --git a/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/ApplicationEvent.java b/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/ApplicationEvent.java similarity index 100% rename from ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/ApplicationEvent.java rename to ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/ApplicationEvent.java diff --git a/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventBus.java b/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventBus.java similarity index 100% rename from ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventBus.java rename to ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventBus.java diff --git a/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventSubscriber.java b/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventSubscriber.java similarity index 100% rename from ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventSubscriber.java rename to ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventSubscriber.java diff --git a/ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/service/ApplicationService.java b/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/service/ApplicationService.java similarity index 100% rename from ddd-contexts/sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/service/ApplicationService.java rename to ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/service/ApplicationService.java diff --git a/ddd-contexts/sharedkernel/src/main/java/module-info.java b/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/module-info.java similarity index 100% rename from ddd-contexts/sharedkernel/src/main/java/module-info.java rename to ddd-contexts/ddd-contexts-sharedkernel/src/main/java/module-info.java diff --git a/ddd-contexts/shippingcontext/pom.xml b/ddd-contexts/ddd-contexts-shippingcontext/pom.xml similarity index 90% rename from ddd-contexts/shippingcontext/pom.xml rename to ddd-contexts/ddd-contexts-shippingcontext/pom.xml index 2fb9e83645..5abdf70948 100644 --- a/ddd-contexts/shippingcontext/pom.xml +++ b/ddd-contexts/ddd-contexts-shippingcontext/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 com.baeldung.dddcontexts.shippingcontext - shippingcontext + ddd-contexts-shippingcontext 1.0 jar @@ -17,7 +17,7 @@ com.baeldung.dddcontexts.sharedkernel - sharedkernel + ddd-contexts-sharedkernel ${appmodules.version} diff --git a/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/PackageItem.java b/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/PackageItem.java similarity index 100% rename from ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/PackageItem.java rename to ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/PackageItem.java diff --git a/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/Parcel.java b/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/Parcel.java similarity index 100% rename from ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/Parcel.java rename to ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/Parcel.java diff --git a/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/ShippableOrder.java b/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/ShippableOrder.java similarity index 100% rename from ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/ShippableOrder.java rename to ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/ShippableOrder.java diff --git a/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/repository/ShippingOrderRepository.java b/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/repository/ShippingOrderRepository.java similarity index 100% rename from ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/repository/ShippingOrderRepository.java rename to ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/repository/ShippingOrderRepository.java diff --git a/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ParcelShippingService.java b/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ParcelShippingService.java similarity index 100% rename from ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ParcelShippingService.java rename to ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ParcelShippingService.java diff --git a/ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ShippingService.java b/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ShippingService.java similarity index 100% rename from ddd-contexts/shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ShippingService.java rename to ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ShippingService.java diff --git a/ddd-contexts/shippingcontext/src/main/java/module-info.java b/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/module-info.java similarity index 100% rename from ddd-contexts/shippingcontext/src/main/java/module-info.java rename to ddd-contexts/ddd-contexts-shippingcontext/src/main/java/module-info.java diff --git a/ddd-contexts/pom.xml b/ddd-contexts/pom.xml index 1a764a65b9..961a1d1624 100644 --- a/ddd-contexts/pom.xml +++ b/ddd-contexts/pom.xml @@ -16,11 +16,11 @@ - sharedkernel - infrastructure - shippingcontext - ordercontext - mainapp + ddd-contexts-sharedkernel + ddd-contexts-infrastructure + ddd-contexts-shippingcontext + ddd-contexts-ordercontext + ddd-contexts-mainapp diff --git a/maven-modules/multimodulemavenproject/daomodule/pom.xml b/maven-modules/multimodulemavenproject/maven-daomodule/pom.xml similarity index 95% rename from maven-modules/multimodulemavenproject/daomodule/pom.xml rename to maven-modules/multimodulemavenproject/maven-daomodule/pom.xml index 626a6f707a..474cc20adb 100644 --- a/maven-modules/multimodulemavenproject/daomodule/pom.xml +++ b/maven-modules/multimodulemavenproject/maven-daomodule/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 com.baeldung.daomodule - daomodule + maven-daomodule 1.0 jar diff --git a/maven-modules/multimodulemavenproject/daomodule/src/main/java/com/baeldung/daomodule/Dao.java b/maven-modules/multimodulemavenproject/maven-daomodule/src/main/java/com/baeldung/daomodule/Dao.java similarity index 100% rename from maven-modules/multimodulemavenproject/daomodule/src/main/java/com/baeldung/daomodule/Dao.java rename to maven-modules/multimodulemavenproject/maven-daomodule/src/main/java/com/baeldung/daomodule/Dao.java diff --git a/maven-modules/multimodulemavenproject/daomodule/src/main/java/module-info.java b/maven-modules/multimodulemavenproject/maven-daomodule/src/main/java/module-info.java similarity index 100% rename from maven-modules/multimodulemavenproject/daomodule/src/main/java/module-info.java rename to maven-modules/multimodulemavenproject/maven-daomodule/src/main/java/module-info.java diff --git a/maven-modules/multimodulemavenproject/entitymodule/pom.xml b/maven-modules/multimodulemavenproject/maven-entitymodule/pom.xml similarity index 95% rename from maven-modules/multimodulemavenproject/entitymodule/pom.xml rename to maven-modules/multimodulemavenproject/maven-entitymodule/pom.xml index e2a453b9c2..a9b169a8b9 100644 --- a/maven-modules/multimodulemavenproject/entitymodule/pom.xml +++ b/maven-modules/multimodulemavenproject/maven-entitymodule/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 com.baeldung.entitymodule - entitymodule + maven-entitymodule 1.0 jar diff --git a/maven-modules/multimodulemavenproject/entitymodule/src/main/java/com/baeldung/entitymodule/User.java b/maven-modules/multimodulemavenproject/maven-entitymodule/src/main/java/com/baeldung/entitymodule/User.java similarity index 100% rename from maven-modules/multimodulemavenproject/entitymodule/src/main/java/com/baeldung/entitymodule/User.java rename to maven-modules/multimodulemavenproject/maven-entitymodule/src/main/java/com/baeldung/entitymodule/User.java diff --git a/maven-modules/multimodulemavenproject/entitymodule/src/main/java/module-info.java b/maven-modules/multimodulemavenproject/maven-entitymodule/src/main/java/module-info.java similarity index 100% rename from maven-modules/multimodulemavenproject/entitymodule/src/main/java/module-info.java rename to maven-modules/multimodulemavenproject/maven-entitymodule/src/main/java/module-info.java diff --git a/maven-modules/multimodulemavenproject/mainappmodule/pom.xml b/maven-modules/multimodulemavenproject/maven-mainappmodule/pom.xml similarity index 88% rename from maven-modules/multimodulemavenproject/mainappmodule/pom.xml rename to maven-modules/multimodulemavenproject/maven-mainappmodule/pom.xml index c376a2b04e..0dd11ef991 100644 --- a/maven-modules/multimodulemavenproject/mainappmodule/pom.xml +++ b/maven-modules/multimodulemavenproject/maven-mainappmodule/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 com.baeldung.mainappmodule - mainappmodule + maven-mainappmodule 1.0 jar @@ -17,17 +17,17 @@ com.baeldung.entitymodule - entitymodule + maven-entitymodule ${entitymodule.version} com.baeldung.daomodule - daomodule + maven-daomodule ${daomodule.version} com.baeldung.userdaomodule - userdaomodule + maven-userdaomodule ${userdaomodule.version} diff --git a/maven-modules/multimodulemavenproject/mainappmodule/src/main/java/com/baeldung/mainappmodule/Application.java b/maven-modules/multimodulemavenproject/maven-mainappmodule/src/main/java/com/baeldung/mainappmodule/Application.java similarity index 100% rename from maven-modules/multimodulemavenproject/mainappmodule/src/main/java/com/baeldung/mainappmodule/Application.java rename to maven-modules/multimodulemavenproject/maven-mainappmodule/src/main/java/com/baeldung/mainappmodule/Application.java diff --git a/maven-modules/multimodulemavenproject/mainappmodule/src/main/java/module-info.java b/maven-modules/multimodulemavenproject/maven-mainappmodule/src/main/java/module-info.java similarity index 100% rename from maven-modules/multimodulemavenproject/mainappmodule/src/main/java/module-info.java rename to maven-modules/multimodulemavenproject/maven-mainappmodule/src/main/java/module-info.java diff --git a/maven-modules/multimodulemavenproject/userdaomodule/pom.xml b/maven-modules/multimodulemavenproject/maven-userdaomodule/pom.xml similarity index 96% rename from maven-modules/multimodulemavenproject/userdaomodule/pom.xml rename to maven-modules/multimodulemavenproject/maven-userdaomodule/pom.xml index 4df29457c5..c7ceada17d 100644 --- a/maven-modules/multimodulemavenproject/userdaomodule/pom.xml +++ b/maven-modules/multimodulemavenproject/maven-userdaomodule/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 com.baeldung.userdaomodule - userdaomodule + maven-userdaomodule 1.0 jar diff --git a/maven-modules/multimodulemavenproject/userdaomodule/src/main/java/com/baeldung/userdaomodule/UserDao.java b/maven-modules/multimodulemavenproject/maven-userdaomodule/src/main/java/com/baeldung/userdaomodule/UserDao.java similarity index 100% rename from maven-modules/multimodulemavenproject/userdaomodule/src/main/java/com/baeldung/userdaomodule/UserDao.java rename to maven-modules/multimodulemavenproject/maven-userdaomodule/src/main/java/com/baeldung/userdaomodule/UserDao.java diff --git a/maven-modules/multimodulemavenproject/userdaomodule/src/main/java/module-info.java b/maven-modules/multimodulemavenproject/maven-userdaomodule/src/main/java/module-info.java similarity index 100% rename from maven-modules/multimodulemavenproject/userdaomodule/src/main/java/module-info.java rename to maven-modules/multimodulemavenproject/maven-userdaomodule/src/main/java/module-info.java diff --git a/maven-modules/multimodulemavenproject/pom.xml b/maven-modules/multimodulemavenproject/pom.xml index fbafa7ebff..db0bda3e6e 100644 --- a/maven-modules/multimodulemavenproject/pom.xml +++ b/maven-modules/multimodulemavenproject/pom.xml @@ -17,10 +17,10 @@ - entitymodule - daomodule - userdaomodule - mainappmodule + maven-entitymodule + maven-daomodule + maven-userdaomodule + maven-mainappmodule diff --git a/maven-modules/version-collision/pom.xml b/maven-modules/version-collision/pom.xml index 9c1b9641c8..820689abfa 100644 --- a/maven-modules/version-collision/pom.xml +++ b/maven-modules/version-collision/pom.xml @@ -13,8 +13,8 @@ - project-a - project-b + version-collision-project-a + version-collision-project-b project-collision diff --git a/maven-modules/version-collision/project-collision/pom.xml b/maven-modules/version-collision/project-collision/pom.xml index 74f117cdbb..1ef4440719 100644 --- a/maven-modules/version-collision/project-collision/pom.xml +++ b/maven-modules/version-collision/project-collision/pom.xml @@ -14,7 +14,7 @@ com.baeldung - project-a + version-collision-project-a 0.0.1-SNAPSHOT @@ -26,7 +26,7 @@ com.baeldung - project-b + version-collision-project-b 0.0.1-SNAPSHOT diff --git a/maven-modules/version-collision/project-a/pom.xml b/maven-modules/version-collision/version-collision-project-a/pom.xml similarity index 90% rename from maven-modules/version-collision/project-a/pom.xml rename to maven-modules/version-collision/version-collision-project-a/pom.xml index ca06c7daca..6130334b2c 100644 --- a/maven-modules/version-collision/project-a/pom.xml +++ b/maven-modules/version-collision/version-collision-project-a/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 - project-a + version-collision-project-a version-collision diff --git a/maven-modules/version-collision/project-b/pom.xml b/maven-modules/version-collision/version-collision-project-b/pom.xml similarity index 90% rename from maven-modules/version-collision/project-b/pom.xml rename to maven-modules/version-collision/version-collision-project-b/pom.xml index a7185ab22d..e2e7294cd2 100644 --- a/maven-modules/version-collision/project-b/pom.xml +++ b/maven-modules/version-collision/version-collision-project-b/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 - project-b + version-collision-project-b version-collision diff --git a/maven-modules/version-overriding-plugins/pom.xml b/maven-modules/version-overriding-plugins/pom.xml index 79109a83e1..b98a444bd4 100644 --- a/maven-modules/version-overriding-plugins/pom.xml +++ b/maven-modules/version-overriding-plugins/pom.xml @@ -13,8 +13,8 @@ - child-a - child-b + version-overriding-child-a + version-overriding-child-b diff --git a/maven-modules/version-overriding-plugins/child-a/pom.xml b/maven-modules/version-overriding-plugins/version-overriding-child-a/pom.xml similarity index 95% rename from maven-modules/version-overriding-plugins/child-a/pom.xml rename to maven-modules/version-overriding-plugins/version-overriding-child-a/pom.xml index 45098ccef0..48b5782f72 100644 --- a/maven-modules/version-overriding-plugins/child-a/pom.xml +++ b/maven-modules/version-overriding-plugins/version-overriding-child-a/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 - child-a + version-overriding-child-a pom diff --git a/maven-modules/version-overriding-plugins/child-b/pom.xml b/maven-modules/version-overriding-plugins/version-overriding-child-b/pom.xml similarity index 87% rename from maven-modules/version-overriding-plugins/child-b/pom.xml rename to maven-modules/version-overriding-plugins/version-overriding-child-b/pom.xml index f86a3c2096..8e52b34dbc 100644 --- a/maven-modules/version-overriding-plugins/child-b/pom.xml +++ b/maven-modules/version-overriding-plugins/version-overriding-child-b/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 - child-b + version-overriding-child-b version-overriding-plugins diff --git a/spring-cloud-modules/spring-cloud-archaius/pom.xml b/spring-cloud-modules/spring-cloud-archaius/pom.xml index 66b7bb9b19..4d7ca3943d 100644 --- a/spring-cloud-modules/spring-cloud-archaius/pom.xml +++ b/spring-cloud-modules/spring-cloud-archaius/pom.xml @@ -16,12 +16,12 @@ - additional-sources-simple - basic-config - dynamodb-config - extra-configs - jdbc-config - zookeeper-config + spring-cloud-archaius-additionalsources + spring-cloud-archaius-basic-config + spring-cloud-archaius-dynamodb-config + spring-cloud-archaius-extra-configs + spring-cloud-archaius-jdbc-config + spring-cloud-archaius-zookeeper-config diff --git a/spring-cloud-modules/spring-cloud-archaius/basic-config/pom.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/pom.xml similarity index 83% rename from spring-cloud-modules/spring-cloud-archaius/basic-config/pom.xml rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/pom.xml index 5e2eb47928..f523e79bac 100644 --- a/spring-cloud-modules/spring-cloud-archaius/basic-config/pom.xml +++ b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/pom.xml @@ -3,9 +3,9 @@ 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 - basic-config + spring-cloud-archaius-additional-sources-simple 1.0.0-SNAPSHOT - basic-config + spring-cloud-archaius-additionalsources jar diff --git a/spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/AdditionalSourcesSimpleApplication.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/AdditionalSourcesSimpleApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/AdditionalSourcesSimpleApplication.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/AdditionalSourcesSimpleApplication.java diff --git a/spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/config/ApplicationPropertiesConfigurations.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/config/ApplicationPropertiesConfigurations.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/config/ApplicationPropertiesConfigurations.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/config/ApplicationPropertiesConfigurations.java diff --git a/spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/controller/ConfigPropertiesController.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/controller/ConfigPropertiesController.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/controller/ConfigPropertiesController.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/controller/ConfigPropertiesController.java diff --git a/spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/main/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/main/resources/application.properties rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/main/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/main/resources/config.properties b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/main/resources/config.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/main/resources/config.properties rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/main/resources/config.properties diff --git a/spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/main/resources/other-config.properties b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/main/resources/other-config.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/main/resources/other-config.properties rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/main/resources/other-config.properties diff --git a/spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/test/java/com/baeldung/spring/cloud/archaius/additionalsources/ArchaiusAdditionalSourcesLiveTest.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/test/java/com/baeldung/spring/cloud/archaius/additionalsources/ArchaiusAdditionalSourcesLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/test/java/com/baeldung/spring/cloud/archaius/additionalsources/ArchaiusAdditionalSourcesLiveTest.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/test/java/com/baeldung/spring/cloud/archaius/additionalsources/ArchaiusAdditionalSourcesLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/test/java/com/baeldung/spring/cloud/archaius/additionalsources/SpringContextTest.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/test/java/com/baeldung/spring/cloud/archaius/additionalsources/SpringContextTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/test/java/com/baeldung/spring/cloud/archaius/additionalsources/SpringContextTest.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/test/java/com/baeldung/spring/cloud/archaius/additionalsources/SpringContextTest.java diff --git a/spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/test/resources/logback-test.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/test/resources/logback-test.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/src/test/resources/logback-test.xml rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/src/test/resources/logback-test.xml diff --git a/spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/pom.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/pom.xml similarity index 85% rename from spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/pom.xml rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/pom.xml index 6c8ed96003..8b35ee845b 100644 --- a/spring-cloud-modules/spring-cloud-archaius/additional-sources-simple/pom.xml +++ b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/pom.xml @@ -3,9 +3,9 @@ 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 - additional-sources-simple + spring-cloud-archaius-basic-config 1.0.0-SNAPSHOT - additional-sources-simple + spring-cloud-archaius-basic-config jar diff --git a/spring-cloud-modules/spring-cloud-archaius/basic-config/src/main/java/com/baeldung/spring/cloud/archaius/basic/BasicArchaiusApplication.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/main/java/com/baeldung/spring/cloud/archaius/basic/BasicArchaiusApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/basic-config/src/main/java/com/baeldung/spring/cloud/archaius/basic/BasicArchaiusApplication.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/main/java/com/baeldung/spring/cloud/archaius/basic/BasicArchaiusApplication.java diff --git a/spring-cloud-modules/spring-cloud-archaius/basic-config/src/main/java/com/baeldung/spring/cloud/archaius/basic/controller/ConfigPropertiesController.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/main/java/com/baeldung/spring/cloud/archaius/basic/controller/ConfigPropertiesController.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/basic-config/src/main/java/com/baeldung/spring/cloud/archaius/basic/controller/ConfigPropertiesController.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/main/java/com/baeldung/spring/cloud/archaius/basic/controller/ConfigPropertiesController.java diff --git a/spring-cloud-modules/spring-cloud-archaius/basic-config/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/main/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/basic-config/src/main/resources/application.properties rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/main/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-archaius/basic-config/src/main/resources/config.properties b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/main/resources/config.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/basic-config/src/main/resources/config.properties rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/main/resources/config.properties diff --git a/spring-cloud-modules/spring-cloud-archaius/basic-config/src/main/resources/other.properties b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/main/resources/other.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/basic-config/src/main/resources/other.properties rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/main/resources/other.properties diff --git a/spring-cloud-modules/spring-cloud-archaius/basic-config/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/basic-config/src/test/java/com/baeldung/SpringContextTest.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-cloud-modules/spring-cloud-archaius/basic-config/src/test/java/com/baeldung/spring/cloud/archaius/basic/ArchaiusBasicConfigurationIntegrationTest.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/test/java/com/baeldung/spring/cloud/archaius/basic/ArchaiusBasicConfigurationIntegrationTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/basic-config/src/test/java/com/baeldung/spring/cloud/archaius/basic/ArchaiusBasicConfigurationIntegrationTest.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/test/java/com/baeldung/spring/cloud/archaius/basic/ArchaiusBasicConfigurationIntegrationTest.java diff --git a/spring-cloud-modules/spring-cloud-archaius/basic-config/src/test/java/com/baeldung/spring/cloud/archaius/basic/ArchaiusBasicConfigurationLiveTest.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/test/java/com/baeldung/spring/cloud/archaius/basic/ArchaiusBasicConfigurationLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/basic-config/src/test/java/com/baeldung/spring/cloud/archaius/basic/ArchaiusBasicConfigurationLiveTest.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/test/java/com/baeldung/spring/cloud/archaius/basic/ArchaiusBasicConfigurationLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-archaius/basic-config/src/test/java/com/baeldung/spring/cloud/archaius/basic/SpringContextTest.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/test/java/com/baeldung/spring/cloud/archaius/basic/SpringContextTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/basic-config/src/test/java/com/baeldung/spring/cloud/archaius/basic/SpringContextTest.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/test/java/com/baeldung/spring/cloud/archaius/basic/SpringContextTest.java diff --git a/spring-cloud-modules/spring-cloud-archaius/basic-config/src/test/resources/config.properties b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/test/resources/config.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/basic-config/src/test/resources/config.properties rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/test/resources/config.properties diff --git a/spring-cloud-modules/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 similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/basic-config/src/test/resources/logback-test.xml rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/test/resources/logback-test.xml diff --git a/spring-cloud-modules/spring-cloud-archaius/dynamodb-config/pom.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/pom.xml similarity index 92% rename from spring-cloud-modules/spring-cloud-archaius/dynamodb-config/pom.xml rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/pom.xml index 08c96fb1f6..6e25ace6a8 100644 --- a/spring-cloud-modules/spring-cloud-archaius/dynamodb-config/pom.xml +++ b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/pom.xml @@ -3,8 +3,8 @@ 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 - dynamodb-config - dynamodb-config + spring-cloud-archaius-dynamodb-config + spring-cloud-archaius-dynamodb-config jar diff --git a/spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/DynamoSourcesApplication.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/DynamoSourcesApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/DynamoSourcesApplication.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/DynamoSourcesApplication.java diff --git a/spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/config/ApplicationPropertiesConfigurations.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/config/ApplicationPropertiesConfigurations.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/config/ApplicationPropertiesConfigurations.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/config/ApplicationPropertiesConfigurations.java diff --git a/spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/config/DynamoDbConfiguration.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/config/DynamoDbConfiguration.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/config/DynamoDbConfiguration.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/config/DynamoDbConfiguration.java diff --git a/spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/controller/ConfigPropertiesController.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/controller/ConfigPropertiesController.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/controller/ConfigPropertiesController.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/controller/ConfigPropertiesController.java diff --git a/spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/dynamodb/ArchaiusProperties.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/dynamodb/ArchaiusProperties.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/dynamodb/ArchaiusProperties.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/dynamodb/ArchaiusProperties.java diff --git a/spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/dynamodb/ArchaiusPropertiesRepository.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/dynamodb/ArchaiusPropertiesRepository.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/dynamodb/ArchaiusPropertiesRepository.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/main/java/com/baeldung/spring/cloud/archaius/dynamosources/dynamodb/ArchaiusPropertiesRepository.java diff --git a/spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/main/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/main/resources/application.properties rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/main/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/test/java/com/baeldung/spring/cloud/archaius/dynamosources/ArchaiusDynamoDbLiveTest.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/test/java/com/baeldung/spring/cloud/archaius/dynamosources/ArchaiusDynamoDbLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/test/java/com/baeldung/spring/cloud/archaius/dynamosources/ArchaiusDynamoDbLiveTest.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/test/java/com/baeldung/spring/cloud/archaius/dynamosources/ArchaiusDynamoDbLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/test/java/com/baeldung/spring/cloud/archaius/dynamosources/SpringContextLiveTest.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/test/java/com/baeldung/spring/cloud/archaius/dynamosources/SpringContextLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/dynamodb-config/src/test/java/com/baeldung/spring/cloud/archaius/dynamosources/SpringContextLiveTest.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/src/test/java/com/baeldung/spring/cloud/archaius/dynamosources/SpringContextLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-archaius/extra-configs/pom.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/pom.xml similarity index 91% rename from spring-cloud-modules/spring-cloud-archaius/extra-configs/pom.xml rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/pom.xml index 4113bf5bca..f90570abc2 100644 --- a/spring-cloud-modules/spring-cloud-archaius/extra-configs/pom.xml +++ b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/pom.xml @@ -3,9 +3,9 @@ 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 - extra-configs + spring-cloud-archaius-extra-configs 1.0.0-SNAPSHOT - extra-configs + spring-cloud-archaius-extra-configs jar diff --git a/spring-cloud-modules/spring-cloud-archaius/extra-configs/src/main/java/com/baeldung/spring/cloud/archaius/extraconfigs/ExtraConfigsApplication.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/src/main/java/com/baeldung/spring/cloud/archaius/extraconfigs/ExtraConfigsApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/extra-configs/src/main/java/com/baeldung/spring/cloud/archaius/extraconfigs/ExtraConfigsApplication.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/src/main/java/com/baeldung/spring/cloud/archaius/extraconfigs/ExtraConfigsApplication.java diff --git a/spring-cloud-modules/spring-cloud-archaius/extra-configs/src/main/java/com/baeldung/spring/cloud/archaius/extraconfigs/controllers/ConfigPropertiesController.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/src/main/java/com/baeldung/spring/cloud/archaius/extraconfigs/controllers/ConfigPropertiesController.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/extra-configs/src/main/java/com/baeldung/spring/cloud/archaius/extraconfigs/controllers/ConfigPropertiesController.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/src/main/java/com/baeldung/spring/cloud/archaius/extraconfigs/controllers/ConfigPropertiesController.java diff --git a/spring-cloud-modules/spring-cloud-archaius/extra-configs/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/src/main/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/extra-configs/src/main/resources/application.properties rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/src/main/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-archaius/extra-configs/src/main/resources/other-config-dir/extra.properties b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/src/main/resources/other-config-dir/extra.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/extra-configs/src/main/resources/other-config-dir/extra.properties rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/src/main/resources/other-config-dir/extra.properties diff --git a/spring-cloud-modules/spring-cloud-archaius/extra-configs/src/main/resources/other.properties b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/src/main/resources/other.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/extra-configs/src/main/resources/other.properties rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/src/main/resources/other.properties diff --git a/spring-cloud-modules/spring-cloud-archaius/extra-configs/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/extra-configs/src/test/java/com/baeldung/SpringContextTest.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-cloud-modules/spring-cloud-archaius/extra-configs/src/test/java/com/baeldung/spring/cloud/archaius/extraconfigs/ArchaiusExtraConfigsLiveTest.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/src/test/java/com/baeldung/spring/cloud/archaius/extraconfigs/ArchaiusExtraConfigsLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/extra-configs/src/test/java/com/baeldung/spring/cloud/archaius/extraconfigs/ArchaiusExtraConfigsLiveTest.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/src/test/java/com/baeldung/spring/cloud/archaius/extraconfigs/ArchaiusExtraConfigsLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-archaius/extra-configs/src/test/resources/logback-test.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/src/test/resources/logback-test.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/extra-configs/src/test/resources/logback-test.xml rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-extra-configs/src/test/resources/logback-test.xml diff --git a/spring-cloud-modules/spring-cloud-archaius/jdbc-config/pom.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/pom.xml similarity index 89% rename from spring-cloud-modules/spring-cloud-archaius/jdbc-config/pom.xml rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/pom.xml index dcaf934849..7fb5747739 100644 --- a/spring-cloud-modules/spring-cloud-archaius/jdbc-config/pom.xml +++ b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/pom.xml @@ -3,8 +3,8 @@ 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 - jdbc-config - jdbc-config + spring-cloud-archaius-jdbc-config + spring-cloud-archaius-jdbc-config jar diff --git a/spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/JdbcSourcesApplication.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/JdbcSourcesApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/JdbcSourcesApplication.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/JdbcSourcesApplication.java diff --git a/spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/config/ApplicationPropertiesConfigurations.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/config/ApplicationPropertiesConfigurations.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/config/ApplicationPropertiesConfigurations.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/config/ApplicationPropertiesConfigurations.java diff --git a/spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/controller/ConfigPropertiesController.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/controller/ConfigPropertiesController.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/controller/ConfigPropertiesController.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/controller/ConfigPropertiesController.java diff --git a/spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/jdbc/Properties.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/jdbc/Properties.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/jdbc/Properties.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/main/java/com/baeldung/spring/cloud/archaius/jdbconfig/jdbc/Properties.java diff --git a/spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/main/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/main/resources/application.properties rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/main/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/main/resources/data.sql b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/main/resources/data.sql similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/main/resources/data.sql rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/main/resources/data.sql diff --git a/spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/test/java/com/baeldung/spring/cloud/archaius/jdbconfig/ArchaiusJDBCSourceLiveTest.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/test/java/com/baeldung/spring/cloud/archaius/jdbconfig/ArchaiusJDBCSourceLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/test/java/com/baeldung/spring/cloud/archaius/jdbconfig/ArchaiusJDBCSourceLiveTest.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/test/java/com/baeldung/spring/cloud/archaius/jdbconfig/ArchaiusJDBCSourceLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/test/java/com/baeldung/spring/cloud/archaius/jdbconfig/SpringContextTest.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/test/java/com/baeldung/spring/cloud/archaius/jdbconfig/SpringContextTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/test/java/com/baeldung/spring/cloud/archaius/jdbconfig/SpringContextTest.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/test/java/com/baeldung/spring/cloud/archaius/jdbconfig/SpringContextTest.java diff --git a/spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/test/resources/logback-test.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/test/resources/logback-test.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/jdbc-config/src/test/resources/logback-test.xml rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/src/test/resources/logback-test.xml diff --git a/spring-cloud-modules/spring-cloud-archaius/zookeeper-config/pom.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-zookeeper-config/pom.xml similarity index 92% rename from spring-cloud-modules/spring-cloud-archaius/zookeeper-config/pom.xml rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-zookeeper-config/pom.xml index 7700a2219d..f7c93fd9bf 100644 --- a/spring-cloud-modules/spring-cloud-archaius/zookeeper-config/pom.xml +++ b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-zookeeper-config/pom.xml @@ -3,8 +3,8 @@ 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 - zookeeper-config - zookeeper-config + spring-cloud-archaius-zookeeper-config + spring-cloud-archaius-zookeeper-config jar diff --git a/spring-cloud-modules/spring-cloud-archaius/zookeeper-config/src/main/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/ZookeeperConfigApplication.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-zookeeper-config/src/main/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/ZookeeperConfigApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/zookeeper-config/src/main/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/ZookeeperConfigApplication.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-zookeeper-config/src/main/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/ZookeeperConfigApplication.java diff --git a/spring-cloud-modules/spring-cloud-archaius/zookeeper-config/src/main/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/config/ZookeeperConfigsInitializer.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-zookeeper-config/src/main/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/config/ZookeeperConfigsInitializer.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/zookeeper-config/src/main/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/config/ZookeeperConfigsInitializer.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-zookeeper-config/src/main/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/config/ZookeeperConfigsInitializer.java diff --git a/spring-cloud-modules/spring-cloud-archaius/zookeeper-config/src/main/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/controller/ConfigPropertiesController.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-zookeeper-config/src/main/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/controller/ConfigPropertiesController.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/zookeeper-config/src/main/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/controller/ConfigPropertiesController.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-zookeeper-config/src/main/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/controller/ConfigPropertiesController.java diff --git a/spring-cloud-modules/spring-cloud-archaius/zookeeper-config/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-zookeeper-config/src/main/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/zookeeper-config/src/main/resources/application.properties rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-zookeeper-config/src/main/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-archaius/zookeeper-config/src/test/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/ArchaiusZookeeperLiveTest.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-zookeeper-config/src/test/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/ArchaiusZookeeperLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/zookeeper-config/src/test/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/ArchaiusZookeeperLiveTest.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-zookeeper-config/src/test/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/ArchaiusZookeeperLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-archaius/zookeeper-config/src/test/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/SpringContextLiveTest.java b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-zookeeper-config/src/test/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/SpringContextLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-archaius/zookeeper-config/src/test/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/SpringContextLiveTest.java rename to spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-zookeeper-config/src/test/java/com/baeldung/spring/cloud/archaius/zookeeperconfig/SpringContextLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-dapr/pom.xml b/spring-cloud-modules/spring-cloud-dapr/pom.xml index 24b6c989bd..2bac0e8eaf 100644 --- a/spring-cloud-modules/spring-cloud-dapr/pom.xml +++ b/spring-cloud-modules/spring-cloud-dapr/pom.xml @@ -13,8 +13,8 @@ - gateway - greeting + spring-cloud-dapr-gateway + spring-cloud-dapr-greeting \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-dapr/gateway/pom.xml b/spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-gateway/pom.xml similarity index 95% rename from spring-cloud-modules/spring-cloud-dapr/gateway/pom.xml rename to spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-gateway/pom.xml index 6545c61002..7874edda4a 100644 --- a/spring-cloud-modules/spring-cloud-dapr/gateway/pom.xml +++ b/spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-gateway/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 com.baeldung.spring.cloud.spring-cloud-dapr - gateway + spring-cloud-dapr-gateway 1.0-SNAPSHOT diff --git a/spring-cloud-modules/spring-cloud-dapr/gateway/src/main/java/com/baeldung/gateway/GatewayApp.java b/spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-gateway/src/main/java/com/baeldung/gateway/GatewayApp.java similarity index 100% rename from spring-cloud-modules/spring-cloud-dapr/gateway/src/main/java/com/baeldung/gateway/GatewayApp.java rename to spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-gateway/src/main/java/com/baeldung/gateway/GatewayApp.java diff --git a/spring-cloud-modules/spring-cloud-dapr/gateway/src/main/resources/application-no-dapr.yml b/spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-gateway/src/main/resources/application-no-dapr.yml similarity index 100% rename from spring-cloud-modules/spring-cloud-dapr/gateway/src/main/resources/application-no-dapr.yml rename to spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-gateway/src/main/resources/application-no-dapr.yml diff --git a/spring-cloud-modules/spring-cloud-dapr/gateway/src/main/resources/application-with-dapr.yml b/spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-gateway/src/main/resources/application-with-dapr.yml similarity index 100% rename from spring-cloud-modules/spring-cloud-dapr/gateway/src/main/resources/application-with-dapr.yml rename to spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-gateway/src/main/resources/application-with-dapr.yml diff --git a/spring-cloud-modules/spring-cloud-dapr/greeting/pom.xml b/spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-greeting/pom.xml similarity index 93% rename from spring-cloud-modules/spring-cloud-dapr/greeting/pom.xml rename to spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-greeting/pom.xml index 22b4004cbf..24aa2f4dcf 100644 --- a/spring-cloud-modules/spring-cloud-dapr/greeting/pom.xml +++ b/spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-greeting/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 com.baeldung.spring.cloud.spring-cloud-dapr - greeting + spring-cloud-dapr-greeting 1.0-SNAPSHOT diff --git a/spring-cloud-modules/spring-cloud-dapr/greeting/src/main/java/com/baeldung/hello/GreetingApp.java b/spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-greeting/src/main/java/com/baeldung/hello/GreetingApp.java similarity index 100% rename from spring-cloud-modules/spring-cloud-dapr/greeting/src/main/java/com/baeldung/hello/GreetingApp.java rename to spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-greeting/src/main/java/com/baeldung/hello/GreetingApp.java diff --git a/spring-cloud-modules/spring-cloud-dapr/greeting/src/main/java/com/baeldung/hello/GreetingController.java b/spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-greeting/src/main/java/com/baeldung/hello/GreetingController.java similarity index 100% rename from spring-cloud-modules/spring-cloud-dapr/greeting/src/main/java/com/baeldung/hello/GreetingController.java rename to spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-greeting/src/main/java/com/baeldung/hello/GreetingController.java diff --git a/spring-cloud-modules/spring-cloud-dapr/greeting/src/main/resources/application.yml b/spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-greeting/src/main/resources/application.yml similarity index 100% rename from spring-cloud-modules/spring-cloud-dapr/greeting/src/main/resources/application.yml rename to spring-cloud-modules/spring-cloud-dapr/spring-cloud-dapr-greeting/src/main/resources/application.yml From 3810a3707817649e26cb7ed8bf60f4c3894b8d33 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Thu, 8 Dec 2022 19:18:02 +0530 Subject: [PATCH 115/592] JAVA-16250 Update spring-activiti module to use parent-boot-2 module as parent (#13120) --- spring-activiti/pom.xml | 23 +-- .../security/config/ProcessController.java | 15 -- .../config/SpringSecurityGroupManager.java | 86 ----------- .../config/SpringSecurityUserManager.java | 144 ------------------ .../security/withactiviti/SecurityConfig.java | 47 ------ .../SpringSecurityActivitiApplication.java | 34 ----- .../ActivitiSpringSecurityApplication.java | 39 ----- .../security/withspring/SecurityConfig.java | 27 ++-- .../SpringSecurityActivitiApplication.java | 13 ++ .../ActivitiWithSpringApplication.java | 3 +- ...ActivitiSpringSecurityIntegrationTest.java | 17 +-- 11 files changed, 39 insertions(+), 409 deletions(-) delete mode 100644 spring-activiti/src/main/java/com/baeldung/activiti/security/config/SpringSecurityGroupManager.java delete mode 100644 spring-activiti/src/main/java/com/baeldung/activiti/security/config/SpringSecurityUserManager.java delete mode 100644 spring-activiti/src/main/java/com/baeldung/activiti/security/withactiviti/SecurityConfig.java delete mode 100644 spring-activiti/src/main/java/com/baeldung/activiti/security/withactiviti/SpringSecurityActivitiApplication.java delete mode 100644 spring-activiti/src/main/java/com/baeldung/activiti/security/withspring/ActivitiSpringSecurityApplication.java create mode 100644 spring-activiti/src/main/java/com/baeldung/activiti/security/withspring/SpringSecurityActivitiApplication.java diff --git a/spring-activiti/pom.xml b/spring-activiti/pom.xml index 9de7e473f8..b7fdfdfc60 100644 --- a/spring-activiti/pom.xml +++ b/spring-activiti/pom.xml @@ -9,12 +9,10 @@ Demo project for Spring Boot - - com.baeldung - parent-boot-1 + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 @@ -32,18 +30,21 @@ org.activiti - activiti-spring-boot-starter-basic - ${activiti.version} - - - org.activiti - activiti-spring-boot-starter-security + activiti-spring-boot-starter ${activiti.version} + + org.springframework.boot + spring-boot-starter-web + org.springframework.boot spring-boot-starter-thymeleaf + + org.springframework.boot + spring-boot-starter-security + com.h2database h2 @@ -70,7 +71,7 @@ - 6.0.0 + 7.1.0.M6 2.17.1 diff --git a/spring-activiti/src/main/java/com/baeldung/activiti/security/config/ProcessController.java b/spring-activiti/src/main/java/com/baeldung/activiti/security/config/ProcessController.java index 671b246328..c680af304d 100644 --- a/spring-activiti/src/main/java/com/baeldung/activiti/security/config/ProcessController.java +++ b/spring-activiti/src/main/java/com/baeldung/activiti/security/config/ProcessController.java @@ -2,14 +2,11 @@ package com.baeldung.activiti.security.config; import java.util.List; -import org.activiti.engine.IdentityService; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; -import org.activiti.spring.SpringProcessEngineConfiguration; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -22,21 +19,9 @@ public class ProcessController { @Autowired private TaskService taskService; - @Autowired - private IdentityService identityService; - - @Autowired - SpringProcessEngineConfiguration config; - @GetMapping("/protected-process") public String startProcess() { - String userId = SecurityContextHolder.getContext() - .getAuthentication() - .getName(); - - identityService.setAuthenticatedUserId(userId); - ProcessInstance pi = runtimeService.startProcessInstanceByKey("protected-process"); List usertasks = taskService.createTaskQuery() diff --git a/spring-activiti/src/main/java/com/baeldung/activiti/security/config/SpringSecurityGroupManager.java b/spring-activiti/src/main/java/com/baeldung/activiti/security/config/SpringSecurityGroupManager.java deleted file mode 100644 index 00fc674e22..0000000000 --- a/spring-activiti/src/main/java/com/baeldung/activiti/security/config/SpringSecurityGroupManager.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.baeldung.activiti.security.config; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import org.activiti.engine.identity.Group; -import org.activiti.engine.identity.GroupQuery; -import org.activiti.engine.impl.GroupQueryImpl; -import org.activiti.engine.impl.Page; -import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl; -import org.activiti.engine.impl.persistence.entity.GroupEntityImpl; -import org.activiti.engine.impl.persistence.entity.GroupEntityManagerImpl; -import org.activiti.engine.impl.persistence.entity.data.GroupDataManager; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.provisioning.JdbcUserDetailsManager; - -public class SpringSecurityGroupManager extends GroupEntityManagerImpl { - - private JdbcUserDetailsManager userManager; - - public SpringSecurityGroupManager(ProcessEngineConfigurationImpl processEngineConfiguration, GroupDataManager groupDataManager) { - super(processEngineConfiguration, groupDataManager); - } - - @Override - public List findGroupByQueryCriteria(GroupQueryImpl query, Page page) { - - if (query.getUserId() != null) { - return findGroupsByUser(query.getUserId()); - } - return null; - } - - @Override - public long findGroupCountByQueryCriteria(GroupQueryImpl query) { - return findGroupByQueryCriteria(query, null).size(); - } - - @Override - public List findGroupsByUser(String userId) { - UserDetails userDetails = userManager.loadUserByUsername(userId); - System.out.println("group manager"); - if (userDetails != null) { - List groups = userDetails.getAuthorities() - .stream() - .map(a -> a.getAuthority()) - .map(a -> { - Group g = new GroupEntityImpl(); - g.setId(a); - return g; - }) - .collect(Collectors.toList()); - return groups; - } - return null; - } - - public void setUserManager(JdbcUserDetailsManager userManager) { - this.userManager = userManager; - } - - public Group createNewGroup(String groupId) { - throw new UnsupportedOperationException("This operation is not supported!"); - - } - - @Override - public void delete(String groupId) { - throw new UnsupportedOperationException("This operation is not supported!"); - - } - - public GroupQuery createNewGroupQuery() { - throw new UnsupportedOperationException("This operation is not supported!"); - } - - public List findGroupsByNativeQuery(Map parameterMap, int firstResult, int maxResults) { - throw new UnsupportedOperationException("This operation is not supported!"); - } - - public long findGroupCountByNativeQuery(Map parameterMap) { - throw new UnsupportedOperationException("This operation is not supported!"); - } - -} diff --git a/spring-activiti/src/main/java/com/baeldung/activiti/security/config/SpringSecurityUserManager.java b/spring-activiti/src/main/java/com/baeldung/activiti/security/config/SpringSecurityUserManager.java deleted file mode 100644 index ce9863eb6c..0000000000 --- a/spring-activiti/src/main/java/com/baeldung/activiti/security/config/SpringSecurityUserManager.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.baeldung.activiti.security.config; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import org.activiti.engine.identity.Group; -import org.activiti.engine.identity.User; -import org.activiti.engine.identity.UserQuery; -import org.activiti.engine.impl.Page; -import org.activiti.engine.impl.UserQueryImpl; -import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl; -import org.activiti.engine.impl.persistence.entity.GroupEntityImpl; -import org.activiti.engine.impl.persistence.entity.UserEntity; -import org.activiti.engine.impl.persistence.entity.UserEntityImpl; -import org.activiti.engine.impl.persistence.entity.UserEntityManagerImpl; -import org.activiti.engine.impl.persistence.entity.data.UserDataManager; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.provisioning.JdbcUserDetailsManager; - -public class SpringSecurityUserManager extends UserEntityManagerImpl { - - private JdbcUserDetailsManager userManager; - - public SpringSecurityUserManager(ProcessEngineConfigurationImpl processEngineConfiguration, UserDataManager userDataManager, JdbcUserDetailsManager userManager) { - super(processEngineConfiguration, userDataManager); - this.userManager = userManager; - } - - @Override - public UserEntity findById(String userId) { - UserDetails userDetails = userManager.loadUserByUsername(userId); - if (userDetails != null) { - UserEntityImpl user = new UserEntityImpl(); - user.setId(userId); - return user; - } - return null; - - } - - @Override - public List findUserByQueryCriteria(UserQueryImpl query, Page page) { - List users = null; - if (query.getGroupId() != null) { - users = userManager.findUsersInGroup(query.getGroupId()) - .stream() - .map(username -> { - User user = new UserEntityImpl(); - user.setId(username); - return user; - }) - .collect(Collectors.toList()); - if (page != null) { - return users.subList(page.getFirstResult(), page.getFirstResult() + page.getMaxResults()); - - } - return users; - } - - if (query.getId() != null) { - UserDetails userDetails = userManager.loadUserByUsername(query.getId()); - if (userDetails != null) { - UserEntityImpl user = new UserEntityImpl(); - user.setId(query.getId()); - return Collections.singletonList(user); - } - } - return null; - } - - @Override - public Boolean checkPassword(String userId, String password) { - return true; - } - - public void setUserManager(JdbcUserDetailsManager userManager) { - this.userManager = userManager; - } - - public User createNewUser(String userId) { - throw new UnsupportedOperationException("This operation is not supported!"); - } - - public void updateUser(User updatedUser) { - throw new UnsupportedOperationException("This operation is not supported!"); - - } - - public void delete(UserEntity userEntity) { - throw new UnsupportedOperationException("This operation is not supported!"); - - } - - @Override - public void deletePicture(User user) { - UserEntity userEntity = (UserEntity) user; - if (userEntity.getPictureByteArrayRef() != null) { - userEntity.getPictureByteArrayRef() - .delete(); - } - } - - public void delete(String userId) { - throw new UnsupportedOperationException("This operation is not supported!"); - - } - - public long findUserCountByQueryCriteria(UserQueryImpl query) { - return findUserByQueryCriteria(query, null).size(); - } - - public List findGroupsByUser(String userId) { - UserDetails userDetails = userManager.loadUserByUsername(userId); - if (userDetails != null) { - List groups = userDetails.getAuthorities() - .stream() - .map(a -> a.getAuthority()) - .map(a -> { - Group g = new GroupEntityImpl(); - g.setId(a); - return g; - }) - .collect(Collectors.toList()); - return groups; - } - return null; - } - - public UserQuery createNewUserQuery() { - throw new UnsupportedOperationException("This operation is not supported!"); - } - - public List findUsersByNativeQuery(Map parameterMap, int firstResult, int maxResults) { - throw new UnsupportedOperationException("This operation is not supported!"); - } - - public long findUserCountByNativeQuery(Map parameterMap) { - throw new UnsupportedOperationException("This operation is not supported!"); - - } - -} diff --git a/spring-activiti/src/main/java/com/baeldung/activiti/security/withactiviti/SecurityConfig.java b/spring-activiti/src/main/java/com/baeldung/activiti/security/withactiviti/SecurityConfig.java deleted file mode 100644 index f471600553..0000000000 --- a/spring-activiti/src/main/java/com/baeldung/activiti/security/withactiviti/SecurityConfig.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.baeldung.activiti.security.withactiviti; - -import org.activiti.engine.IdentityService; -import org.activiti.spring.security.IdentityServiceUserDetailsService; -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.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; - -@Configuration -public class SecurityConfig extends WebSecurityConfigurerAdapter { - - protected void configure(HttpSecurity http) throws Exception { - http.antMatcher("/**") - .authorizeRequests() - .antMatchers("/protected-process*") - .authenticated() - .anyRequest() - .permitAll() - .and() - .formLogin() - .loginPage("/login") - .defaultSuccessUrl("/homepage") - .failureUrl("/login?error=true") - .and() - .csrf() - .disable() - .logout() - .logoutSuccessUrl("/login"); - } - - @Autowired - private IdentityService identityService; - - @Bean - public IdentityServiceUserDetailsService userDetailsService() { - return new IdentityServiceUserDetailsService(identityService); - } - - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(userDetailsService()); - } - -} diff --git a/spring-activiti/src/main/java/com/baeldung/activiti/security/withactiviti/SpringSecurityActivitiApplication.java b/spring-activiti/src/main/java/com/baeldung/activiti/security/withactiviti/SpringSecurityActivitiApplication.java deleted file mode 100644 index 2270a4d684..0000000000 --- a/spring-activiti/src/main/java/com/baeldung/activiti/security/withactiviti/SpringSecurityActivitiApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.activiti.security.withactiviti; - -import org.activiti.engine.IdentityService; -import org.activiti.engine.identity.Group; -import org.activiti.engine.identity.User; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; - -@SpringBootApplication(scanBasePackages = { "com.baeldung.activiti.security.config", "com.baeldung.activiti.security.withactiviti" }) -public class SpringSecurityActivitiApplication { - - public static void main(String[] args) { - SpringApplication.run(SpringSecurityActivitiApplication.class, args); - } - - @Bean - InitializingBean usersAndGroupsInitializer(IdentityService identityService) { - return new InitializingBean() { - public void afterPropertiesSet() throws Exception { - User user = identityService.newUser("activiti_user"); - user.setPassword("pass"); - identityService.saveUser(user); - - Group group = identityService.newGroup("user"); - group.setName("ROLE_USER"); - group.setType("USER"); - identityService.saveGroup(group); - identityService.createMembership(user.getId(), group.getId()); - } - }; - } -} diff --git a/spring-activiti/src/main/java/com/baeldung/activiti/security/withspring/ActivitiSpringSecurityApplication.java b/spring-activiti/src/main/java/com/baeldung/activiti/security/withspring/ActivitiSpringSecurityApplication.java deleted file mode 100644 index 5878a5d678..0000000000 --- a/spring-activiti/src/main/java/com/baeldung/activiti/security/withspring/ActivitiSpringSecurityApplication.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.activiti.security.withspring; - -import org.activiti.engine.impl.persistence.entity.data.impl.MybatisGroupDataManager; -import org.activiti.engine.impl.persistence.entity.data.impl.MybatisUserDataManager; -import org.activiti.spring.SpringProcessEngineConfiguration; -import org.activiti.spring.boot.SecurityAutoConfiguration; -import org.springframework.beans.factory.InitializingBean; -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.security.provisioning.JdbcUserDetailsManager; - -import com.baeldung.activiti.security.config.SpringSecurityGroupManager; -import com.baeldung.activiti.security.config.SpringSecurityUserManager; - -@SpringBootApplication(exclude = SecurityAutoConfiguration.class, scanBasePackages = { "com.baeldung.activiti.security.config", "com.baeldung.activiti.security.withspring" }) -public class ActivitiSpringSecurityApplication { - - public static void main(String[] args) { - SpringApplication.run(ActivitiSpringSecurityApplication.class, args); - } - - @Autowired - private SpringProcessEngineConfiguration processEngineConfiguration; - - @Autowired - private JdbcUserDetailsManager userManager; - - @Bean - InitializingBean processEngineInitializer() { - return new InitializingBean() { - public void afterPropertiesSet() throws Exception { - processEngineConfiguration.setUserEntityManager(new SpringSecurityUserManager(processEngineConfiguration, new MybatisUserDataManager(processEngineConfiguration), userManager)); - processEngineConfiguration.setGroupEntityManager(new SpringSecurityGroupManager(processEngineConfiguration, new MybatisGroupDataManager(processEngineConfiguration))); - } - }; - } -} diff --git a/spring-activiti/src/main/java/com/baeldung/activiti/security/withspring/SecurityConfig.java b/spring-activiti/src/main/java/com/baeldung/activiti/security/withspring/SecurityConfig.java index df1991c3e4..b0c74371c7 100644 --- a/spring-activiti/src/main/java/com/baeldung/activiti/security/withspring/SecurityConfig.java +++ b/spring-activiti/src/main/java/com/baeldung/activiti/security/withspring/SecurityConfig.java @@ -1,21 +1,17 @@ package com.baeldung.activiti.security.withspring; -import javax.sql.DataSource; - -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.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.provisioning.JdbcUserDetailsManager; +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.provisioning.InMemoryUserDetailsManager; @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { - @Autowired - private DataSource dataSource; - protected void configure(HttpSecurity http) throws Exception { http.antMatcher("/**") .authorizeRequests() @@ -36,15 +32,12 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { } @Bean - public JdbcUserDetailsManager userDetailsManager() { - JdbcUserDetailsManager manager = new JdbcUserDetailsManager(); - manager.setDataSource(dataSource); - return manager; - } + public UserDetailsService userDetailsService() { + UserDetails user = User.withUsername("user") + .password("{noop}pass") + .authorities("ROLE_ACTIVITI_USER") + .build(); - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(userDetailsManager()); + return new InMemoryUserDetailsManager(user); } - } diff --git a/spring-activiti/src/main/java/com/baeldung/activiti/security/withspring/SpringSecurityActivitiApplication.java b/spring-activiti/src/main/java/com/baeldung/activiti/security/withspring/SpringSecurityActivitiApplication.java new file mode 100644 index 0000000000..84aa4b2b0d --- /dev/null +++ b/spring-activiti/src/main/java/com/baeldung/activiti/security/withspring/SpringSecurityActivitiApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.activiti.security.withspring; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication(scanBasePackages = { "com.baeldung.activiti.security.config", "com.baeldung.activiti.security.withspring" }) +public class SpringSecurityActivitiApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringSecurityActivitiApplication.class, args); + } + +} diff --git a/spring-activiti/src/main/java/com/baeldung/activitiwithspring/ActivitiWithSpringApplication.java b/spring-activiti/src/main/java/com/baeldung/activitiwithspring/ActivitiWithSpringApplication.java index d43ae3cc35..b3cf66b0f7 100644 --- a/spring-activiti/src/main/java/com/baeldung/activitiwithspring/ActivitiWithSpringApplication.java +++ b/spring-activiti/src/main/java/com/baeldung/activitiwithspring/ActivitiWithSpringApplication.java @@ -2,9 +2,8 @@ package com.baeldung.activitiwithspring; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration; -@SpringBootApplication(exclude = {SecurityAutoConfiguration.class}) +@SpringBootApplication public class ActivitiWithSpringApplication { public static void main(String[] args) { SpringApplication.run(ActivitiWithSpringApplication.class, args); diff --git a/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiSpringSecurityIntegrationTest.java b/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiSpringSecurityIntegrationTest.java index 7f99483fcf..43a159efbd 100644 --- a/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiSpringSecurityIntegrationTest.java +++ b/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiSpringSecurityIntegrationTest.java @@ -1,33 +1,22 @@ package com.baeldung.activitiwithspring; -import org.activiti.engine.IdentityService; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.web.WebAppConfiguration; -import com.baeldung.activiti.security.withspring.ActivitiSpringSecurityApplication; +import com.baeldung.activiti.security.withspring.SpringSecurityActivitiApplication; @RunWith(SpringRunner.class) -@SpringBootTest(classes = ActivitiSpringSecurityApplication.class) +@SpringBootTest(classes = SpringSecurityActivitiApplication.class) @WebAppConfiguration @AutoConfigureTestDatabase public class ActivitiSpringSecurityIntegrationTest { - @Autowired - private IdentityService identityService; @Test - public void whenUserExists_thenOk() { - identityService.setUserPicture("spring_user", null); - } - - @Test(expected = UsernameNotFoundException.class) - public void whenUserNonExistent_thenSpringException() { - identityService.setUserPicture("user3", null); + public void contextLoads() { } } From 205506f00af1ca6de4252f62e77e86ac2446d977 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 8 Dec 2022 14:16:13 +0000 Subject: [PATCH 116/592] [JAVA-15029] Upgraded to apache httpClient 5 (#13112) Co-authored-by: panagiotiskakos --- .../CustomHttpClientResponseHandler.java | 11 ++ .../sec/HttpClientCookieLiveTest.java | 103 +++++++----------- 2 files changed, 49 insertions(+), 65 deletions(-) create mode 100644 httpclient-simple/src/main/java/com/baeldung/handler/CustomHttpClientResponseHandler.java diff --git a/httpclient-simple/src/main/java/com/baeldung/handler/CustomHttpClientResponseHandler.java b/httpclient-simple/src/main/java/com/baeldung/handler/CustomHttpClientResponseHandler.java new file mode 100644 index 0000000000..5472da3a97 --- /dev/null +++ b/httpclient-simple/src/main/java/com/baeldung/handler/CustomHttpClientResponseHandler.java @@ -0,0 +1,11 @@ +package com.baeldung.handler; + +import org.apache.hc.core5.http.ClassicHttpResponse; +import org.apache.hc.core5.http.io.HttpClientResponseHandler; + +public class CustomHttpClientResponseHandler implements HttpClientResponseHandler { + @Override + public ClassicHttpResponse handleResponse(ClassicHttpResponse response) { + return response; + } +} \ No newline at end of file diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/sec/HttpClientCookieLiveTest.java b/httpclient-simple/src/test/java/com/baeldung/httpclient/sec/HttpClientCookieLiveTest.java index 75286e5b2e..82a2d8e9d6 100644 --- a/httpclient-simple/src/test/java/com/baeldung/httpclient/sec/HttpClientCookieLiveTest.java +++ b/httpclient-simple/src/test/java/com/baeldung/httpclient/sec/HttpClientCookieLiveTest.java @@ -1,114 +1,87 @@ package com.baeldung.httpclient.sec; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.protocol.HttpClientContext; -import org.apache.http.cookie.ClientCookie; -import org.apache.http.impl.client.BasicCookieStore; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.cookie.BasicClientCookie; -import org.apache.http.protocol.BasicHttpContext; -import org.apache.http.protocol.HttpContext; -import com.baeldung.httpclient.ResponseUtil; +import com.baeldung.handler.CustomHttpClientResponseHandler; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.cookie.BasicCookieStore; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.client5.http.impl.cookie.BasicClientCookie; +import org.apache.hc.client5.http.protocol.HttpClientContext; + +import org.apache.hc.core5.http.protocol.BasicHttpContext; +import org.apache.hc.core5.http.protocol.HttpContext; +import org.junit.jupiter.api.Test; import java.io.IOException; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; -public class HttpClientCookieLiveTest { - - private CloseableHttpClient instance; - - private CloseableHttpResponse response; - - private static Logger log = LoggerFactory.getLogger(HttpClientCookieLiveTest.class); - - @Before - public final void before() { - instance = HttpClientBuilder.create().build(); - } - - @After - public final void after() throws IllegalStateException, IOException { - ResponseUtil.closeResponse(response); - } - - // tests +class HttpClientCookieLiveTest { @Test - public final void whenSettingCookiesOnARequest_thenCorrect() throws IOException { - instance = HttpClientBuilder.create().build(); + final void whenSettingCookiesOnARequest_thenCorrect() throws IOException { final HttpGet request = new HttpGet("http://www.github.com"); request.setHeader("Cookie", "JSESSIONID=1234"); - - response = instance.execute(request); - - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + try (CloseableHttpClient client = HttpClients.createDefault(); CloseableHttpResponse response = (CloseableHttpResponse) client.execute(request, new CustomHttpClientResponseHandler());) { + assertThat(response.getCode(), equalTo(200)); + } } @Test - public final void givenUsingDeprecatedApi_whenSettingCookiesOnTheHttpClient_thenCorrect() throws IOException { + final void givenUsingDeprecatedApi_whenSettingCookiesOnTheHttpClient_thenCorrect() throws IOException { final BasicCookieStore cookieStore = new BasicCookieStore(); final BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234"); cookie.setDomain(".github.com"); - cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "true"); - + cookie.setAttribute("domain", "true"); cookie.setPath("/"); cookieStore.addCookie(cookie); - - DefaultHttpClient client = new DefaultHttpClient(); - client.setCookieStore(cookieStore); - final HttpGet request = new HttpGet("https://www.github.com"); + try (CloseableHttpClient client = HttpClientBuilder.create() + .setDefaultCookieStore(cookieStore) + .build(); CloseableHttpResponse response = (CloseableHttpResponse) client.execute(request, new CustomHttpClientResponseHandler())) { - response = (CloseableHttpResponse) client.execute(request); - - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + assertThat(response.getCode(), equalTo(200)); + } } @Test - public final void whenSettingCookiesOnTheHttpClient_thenCookieSentCorrectly() throws IOException { + final void whenSettingCookiesOnTheHttpClient_thenCookieSentCorrectly() throws IOException { final BasicCookieStore cookieStore = new BasicCookieStore(); final BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234"); cookie.setDomain(".github.com"); - cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "true"); + cookie.setAttribute("domain", "true"); cookie.setPath("/"); cookieStore.addCookie(cookie); - instance = HttpClientBuilder.create().setDefaultCookieStore(cookieStore).build(); - final HttpGet request = new HttpGet("http://www.github.com"); - response = instance.execute(request); + try (CloseableHttpClient client = HttpClientBuilder.create().setDefaultCookieStore(cookieStore).build(); + CloseableHttpResponse response = (CloseableHttpResponse) client.execute(request, new CustomHttpClientResponseHandler())) { + + assertThat(response.getCode(), equalTo(200)); + } - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); } @Test - public final void whenSettingCookiesOnTheRequest_thenCookieSentCorrectly() throws IOException { + final void whenSettingCookiesOnTheRequest_thenCookieSentCorrectly() throws IOException { final BasicCookieStore cookieStore = new BasicCookieStore(); final BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234"); cookie.setDomain(".github.com"); cookie.setPath("/"); cookieStore.addCookie(cookie); - instance = HttpClientBuilder.create().build(); - final HttpGet request = new HttpGet("http://www.github.com"); - final HttpContext localContext = new BasicHttpContext(); localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore); // localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); // before 4.3 - response = instance.execute(request, localContext); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + try (CloseableHttpClient client = HttpClientBuilder.create().build(); + CloseableHttpResponse response = (CloseableHttpResponse) client.execute(request, localContext, new CustomHttpClientResponseHandler())) { + assertThat(response.getCode(), equalTo(200)); + } } } From 0264bb82c85e887334ec3fcace3ad5b19dfeae58 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 8 Dec 2022 14:17:51 +0000 Subject: [PATCH 117/592] Java 13914 (#13083) * [JAVA-13914] Replaced Junit4 annotations with Junit5 * [JAVA-13914] Replaced Junit4 annotations with Junit5 * [JAVA-13914] Fixed test * [JAVA-13914] Clean up Co-authored-by: panagiotiskakos --- .../app/rest/FlowerControllerUnitTest.java | 39 +++++----- .../app/rest/MessageControllerUnitTest.java | 64 ++++++++-------- .../junit5/mockito/UserServiceUnitTest.java | 4 +- .../baeldung/mockito/MockFinalsUnitTest.java | 6 +- .../mockito/MockitoAnnotationUnitTest.java | 64 ++++++++-------- ...tionsInitWithMockitoJUnitRuleUnitTest.java | 6 +- ...ckitoAnnotationsInjectIntoSpyUnitTest.java | 32 ++++---- ...ckitoAnnotationsUninitializedUnitTest.java | 17 +++-- .../mockito/MockitoExceptionUnitTest.java | 50 ++++++++----- .../baeldung/mockito/MockitoMockUnitTest.java | 12 +-- .../MockitoVerifyExamplesUnitTest.java | 38 +++++----- .../MockitoWhenThenExamplesUnitTest.java | 75 +++++++++++-------- .../argumentcaptor/EmailServiceUnitTest.java | 42 ++++++----- .../mockedstatic/MockedStaticUnitTest.java | 6 +- .../spy/MockitoMisusingMockOrSpyUnitTest.java | 17 +++-- .../mockito/spy/MockitoSpyUnitTest.java | 47 ++++++------ .../MockitoVoidMethodsUnitTest.java | 30 ++++---- 17 files changed, 307 insertions(+), 242 deletions(-) diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/app/rest/FlowerControllerUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/app/rest/FlowerControllerUnitTest.java index df3561d646..d611cd9e45 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/app/rest/FlowerControllerUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/app/rest/FlowerControllerUnitTest.java @@ -1,6 +1,7 @@ package com.baeldung.app.rest; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.AdditionalMatchers.or; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; @@ -10,18 +11,18 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.exceptions.misusing.InvalidUseOfMatchersException; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import com.baeldung.app.api.Flower; import com.baeldung.domain.service.FlowerService; -@RunWith(MockitoJUnitRunner.class) -public class FlowerControllerUnitTest { +@ExtendWith(MockitoExtension.class) +class FlowerControllerUnitTest { @InjectMocks private FlowerController flowerController; @@ -30,7 +31,7 @@ public class FlowerControllerUnitTest { private FlowerService flowerService; @Test - public void givenPoppyFlower_whenUsingDoReturn_thenCorrect() { + void givenPoppyFlower_whenUsingDoReturn_thenCorrect() { doReturn("Flower").when(flowerService).analyze("poppy"); String response = flowerController.isAFlower("poppy"); @@ -38,25 +39,27 @@ public class FlowerControllerUnitTest { } @Test - public void givenAnyString_whenUsingArgumentMatcher_thenCorrect() { + void givenAnyString_whenUsingArgumentMatcher_thenCorrect() { when(flowerService.analyze(anyString())).thenReturn("Flower"); String response = flowerController.isAFlower("violetta"); assertThat(response).isEqualTo("Flower"); } - @Test(expected = InvalidUseOfMatchersException.class) - public void whenIncorrectMatchers_thenThrowsError() { - when(flowerService.isABigFlower("poppy", anyInt())).thenReturn(true); + @Test + void whenIncorrectMatchers_thenThrowsError() { + assertThrows(InvalidUseOfMatchersException.class, () -> { + when(flowerService.isABigFlower("poppy", anyInt())).thenReturn(true); + }); Flower flower = new Flower("poppy", 15); Boolean response = flowerController.isABigFlower(flower); - assertThat(response).isTrue(); + assertThat(response).isFalse(); } @Test - public void whenCorrectMatchers_thenCorrect() { + void whenCorrectMatchers_thenCorrect() { when(flowerService.isABigFlower(eq("poppy"), anyInt())).thenReturn(true); Flower flower = new Flower("poppy", 15); @@ -65,23 +68,25 @@ public class FlowerControllerUnitTest { assertThat(response).isTrue(); } - @Test(expected = InvalidUseOfMatchersException.class) - public void whenUsingMatchersAsReturnValue_thenThrowsError() { + @Test + void whenUsingMatchersAsReturnValue_thenThrowsError() { flowerController.isAFlower("poppy"); String orMatcher = or(eq("poppy"), endsWith("y")); - verify(flowerService).analyze(orMatcher); + assertThrows(InvalidUseOfMatchersException.class, () -> { + verify(flowerService).analyze(orMatcher); + }); } @Test - public void whenUsingMatchersAsOngoingStubbing_thenCorrect1() { + void whenUsingMatchersAsOngoingStubbing_thenCorrect1() { flowerController.isAFlower("poppy"); verify(flowerService).analyze(or(eq("poppy"), endsWith("y"))); } @Test - public void whenUsingMatchersAsOngoingStubbing_thenCorrect2() { + void whenUsingMatchersAsOngoingStubbing_thenCorrect2() { flowerController.isAFlower("lily"); verify(flowerService).analyze(or(eq("poppy"), endsWith("y"))); diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/app/rest/MessageControllerUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/app/rest/MessageControllerUnitTest.java index 1bfbeecfec..84b5bf241e 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/app/rest/MessageControllerUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/app/rest/MessageControllerUnitTest.java @@ -5,52 +5,52 @@ import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import com.baeldung.app.api.MessageDTO; import com.baeldung.domain.model.Message; import com.baeldung.domain.service.MessageService; import com.baeldung.domain.util.MessageMatcher; -@RunWith(MockitoJUnitRunner.class) -public class MessageControllerUnitTest { +@ExtendWith(MockitoExtension.class) +class MessageControllerUnitTest { - @InjectMocks - private MessageController messageController; - - @Mock - private MessageService messageService; + @InjectMocks + private MessageController messageController; - @Test - public void givenMsg_whenVerifyUsingAnyMatcher_thenOk() { - MessageDTO messageDTO = new MessageDTO(); - messageDTO.setFrom("me"); - messageDTO.setTo("you"); - messageDTO.setText("Hello, you!"); + @Mock + private MessageService messageService; - messageController.createMessage(messageDTO); + @Test + void givenMsg_whenVerifyUsingAnyMatcher_thenOk() { + MessageDTO messageDTO = new MessageDTO(); + messageDTO.setFrom("me"); + messageDTO.setTo("you"); + messageDTO.setText("Hello, you!"); - verify(messageService, times(1)).deliverMessage(any(Message.class)); - } + messageController.createMessage(messageDTO); - @Test - public void givenMsg_whenVerifyUsingMessageMatcher_thenOk() { - MessageDTO messageDTO = new MessageDTO(); - messageDTO.setFrom("me"); - messageDTO.setTo("you"); - messageDTO.setText("Hello, you!"); + verify(messageService, times(1)).deliverMessage(any(Message.class)); + } - messageController.createMessage(messageDTO); + @Test + void givenMsg_whenVerifyUsingMessageMatcher_thenOk() { + MessageDTO messageDTO = new MessageDTO(); + messageDTO.setFrom("me"); + messageDTO.setTo("you"); + messageDTO.setText("Hello, you!"); - Message message = new Message(); - message.setFrom("me"); - message.setTo("you"); - message.setText("Hello, you!"); + messageController.createMessage(messageDTO); - verify(messageService, times(1)).deliverMessage(argThat(new MessageMatcher(message))); - } + Message message = new Message(); + message.setFrom("me"); + message.setTo("you"); + message.setText("Hello, you!"); + + verify(messageService, times(1)).deliverMessage(argThat(new MessageMatcher(message))); + } } diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java index 8a350e5d9f..cc38d617b7 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -13,7 +14,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.stubbing.Answer; @@ -115,7 +115,7 @@ class UserServiceUnitTest { void givenUserWithExistingName_whenSaveUser_thenGiveUsernameAlreadyExistsError() { // Given user = new User("jerry", 12); - Mockito.reset(userRepository); + reset(userRepository); when(userRepository.isUsernameAlreadyExists(any(String.class))).thenReturn(true); // When diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java index 24ab67049f..a4b2bd03b4 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java @@ -4,12 +4,12 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class MockFinalsUnitTest { +class MockFinalsUnitTest { @Test - public void whenMockFinalMethodMockWorks() { + void whenMockFinalMethodMockWorks() { MyList myList = new MyList(); diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java index bd68afac75..acfd87e047 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java @@ -1,23 +1,27 @@ package com.baeldung.mockito; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.Spy; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; -@RunWith(MockitoJUnitRunner.class) -public class MockitoAnnotationUnitTest { +@ExtendWith(MockitoExtension.class) +class MockitoAnnotationUnitTest { @Mock private List mockedList; @@ -36,61 +40,61 @@ public class MockitoAnnotationUnitTest { // tests @Test - public void whenNotUseMockAnnotation_thenCorrect() { - final List mockList = Mockito.mock(List.class); + void whenNotUseMockAnnotation_thenCorrect() { + final List mockList = mock(List.class); mockList.add("one"); - Mockito.verify(mockList).add("one"); + verify(mockList).add("one"); assertEquals(0, mockList.size()); - Mockito.when(mockList.size()).thenReturn(100); + when(mockList.size()).thenReturn(100); assertEquals(100, mockList.size()); } @Test - public void whenUseMockAnnotation_thenMockIsInjected() { + void whenUseMockAnnotation_thenMockIsInjected() { mockedList.add("one"); - Mockito.verify(mockedList).add("one"); + verify(mockedList).add("one"); assertEquals(0, mockedList.size()); - Mockito.when(mockedList.size()).thenReturn(100); + when(mockedList.size()).thenReturn(100); assertEquals(100, mockedList.size()); } @Test - public void whenNotUseSpyAnnotation_thenCorrect() { - final List spyList = Mockito.spy(new ArrayList()); + void whenNotUseSpyAnnotation_thenCorrect() { + final List spyList = spy(new ArrayList()); spyList.add("one"); spyList.add("two"); - Mockito.verify(spyList).add("one"); - Mockito.verify(spyList).add("two"); + verify(spyList).add("one"); + verify(spyList).add("two"); assertEquals(2, spyList.size()); - Mockito.doReturn(100).when(spyList).size(); + doReturn(100).when(spyList).size(); assertEquals(100, spyList.size()); } @Test - public void whenUseSpyAnnotation_thenSpyIsInjectedCorrectly() { + void whenUseSpyAnnotation_thenSpyIsInjectedCorrectly() { spiedList.add("one"); spiedList.add("two"); - Mockito.verify(spiedList).add("one"); - Mockito.verify(spiedList).add("two"); + verify(spiedList).add("one"); + verify(spiedList).add("two"); assertEquals(2, spiedList.size()); - Mockito.doReturn(100).when(spiedList).size(); + doReturn(100).when(spiedList).size(); assertEquals(100, spiedList.size()); } @Test - public void whenNotUseCaptorAnnotation_thenCorrect() { - final List mockList = Mockito.mock(List.class); + void whenNotUseCaptorAnnotation_thenCorrect() { + final List mockList = mock(List.class); final ArgumentCaptor arg = ArgumentCaptor.forClass(String.class); mockList.add("one"); - Mockito.verify(mockList).add(arg.capture()); + verify(mockList).add(arg.capture()); assertEquals("one", arg.getValue()); } @@ -100,9 +104,9 @@ public class MockitoAnnotationUnitTest { ArgumentCaptor argCaptor; @Test - public void whenUseCaptorAnnotation_thenTheSame() { + void whenUseCaptorAnnotation_thenTheSame() { mockedList.add("one"); - Mockito.verify(mockedList).add(argCaptor.capture()); + verify(mockedList).add(argCaptor.capture()); assertEquals("one", argCaptor.getValue()); } @@ -114,8 +118,8 @@ public class MockitoAnnotationUnitTest { private MyDictionary dic = new MyDictionary(); @Test - public void whenUseInjectMocksAnnotation_thenCorrect() { - Mockito.when(wordMap.get("aWord")).thenReturn("aMeaning"); + void whenUseInjectMocksAnnotation_thenCorrect() { + when(wordMap.get("aWord")).thenReturn("aMeaning"); assertEquals("aMeaning", dic.getMeaning("aWord")); } diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsInitWithMockitoJUnitRuleUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsInitWithMockitoJUnitRuleUnitTest.java index 88a9410101..512f538a58 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsInitWithMockitoJUnitRuleUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsInitWithMockitoJUnitRuleUnitTest.java @@ -6,16 +6,18 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; + import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; + public class MockitoAnnotationsInitWithMockitoJUnitRuleUnitTest { @Rule public MockitoRule initRule = MockitoJUnit.rule(); - + @Mock private List mockedList; @@ -23,6 +25,6 @@ public class MockitoAnnotationsInitWithMockitoJUnitRuleUnitTest { public void whenUsingMockitoJUnitRule_thenMocksInitialized() { when(mockedList.size()).thenReturn(41); - assertThat(mockedList.size()).isEqualTo(41); + assertThat(mockedList).hasSize(41); } } diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsInjectIntoSpyUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsInjectIntoSpyUnitTest.java index 9d3a00f8b9..89a253c855 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsInjectIntoSpyUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsInjectIntoSpyUnitTest.java @@ -1,22 +1,28 @@ package com.baeldung.mockito; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; -import org.mockito.*; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.openMocks; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import java.util.Map; -import static org.junit.Assert.assertEquals; -@RunWith(MockitoJUnitRunner.class) -public class MockitoAnnotationsInjectIntoSpyUnitTest { +@ExtendWith(MockitoExtension.class) +class MockitoAnnotationsInjectIntoSpyUnitTest { - @Before + @BeforeEach public void init() { - MockitoAnnotations.openMocks(this); - spyDic = Mockito.spy(new MyDictionary(wordMap)); + openMocks(this); + spyDic = spy(new MyDictionary(wordMap)); } @Mock @@ -28,8 +34,8 @@ public class MockitoAnnotationsInjectIntoSpyUnitTest { private MyDictionary spyDic; @Test - public void whenUseInjectMocksAnnotation_thenCorrect() { - Mockito.when(wordMap.get("aWord")).thenReturn("aMeaning"); + void whenUseInjectMocksAnnotation_thenCorrect() { + when(wordMap.get("aWord")).thenReturn("aMeaning"); assertEquals("aMeaning", spyDic.getMeaning("aWord")); } diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsUninitializedUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsUninitializedUnitTest.java index ed50732183..10b0aa6626 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsUninitializedUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoAnnotationsUninitializedUnitTest.java @@ -1,18 +1,23 @@ package com.baeldung.mockito; -import org.junit.Test; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.when; + +import org.junit.jupiter.api.Test; import org.mockito.Mock; -import org.mockito.Mockito; import java.util.List; -public class MockitoAnnotationsUninitializedUnitTest { +class MockitoAnnotationsUninitializedUnitTest { @Mock List mockedList; - @Test(expected = NullPointerException.class) - public void whenMockitoAnnotationsUninitialized_thenNPEThrown() { - Mockito.when(mockedList.size()).thenReturn(1); + @Test + void whenMockitoAnnotationsUninitialized_thenNPEThrown() { + assertThrows(NullPointerException.class, () -> { + when(mockedList.size()).thenReturn(1); + }); } } diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoExceptionUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoExceptionUnitTest.java index 7ed4fbdf37..843edd8d0a 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoExceptionUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoExceptionUnitTest.java @@ -1,57 +1,71 @@ package com.baeldung.mockito; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import org.junit.Test; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; -public class MockitoExceptionUnitTest { +@ExtendWith(MockitoExtension.class) +class MockitoExceptionUnitTest { - @Test(expected = NullPointerException.class) - public void whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() { + @Test + void whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() { MyDictionary dictMock = mock(MyDictionary.class); when(dictMock.getMeaning(anyString())).thenThrow(NullPointerException.class); + assertThrows(NullPointerException.class, () -> { + dictMock.getMeaning("word"); + }); - dictMock.getMeaning("word"); } - @Test(expected = IllegalStateException.class) - public void whenConfigVoidRetunMethodToThrowEx_thenExIsThrown() { + @Test + void whenConfigVoidRetunMethodToThrowEx_thenExIsThrown() { MyDictionary dictMock = mock(MyDictionary.class); doThrow(IllegalStateException.class).when(dictMock) .add(anyString(), anyString()); + assertThrows(IllegalStateException.class, () -> { + dictMock.add("word", "meaning"); + }); - dictMock.add("word", "meaning"); } - @Test(expected = NullPointerException.class) - public void whenConfigNonVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() { + @Test + void whenConfigNonVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() { MyDictionary dictMock = mock(MyDictionary.class); when(dictMock.getMeaning(anyString())).thenThrow(new NullPointerException("Error occurred")); + assertThrows(NullPointerException.class, () -> { + dictMock.getMeaning("word"); + }); - dictMock.getMeaning("word"); } - @Test(expected = IllegalStateException.class) - public void whenConfigVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() { + @Test + void whenConfigVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() { MyDictionary dictMock = mock(MyDictionary.class); doThrow(new IllegalStateException("Error occurred")).when(dictMock) .add(anyString(), anyString()); + assertThrows(IllegalStateException.class, () -> { + dictMock.add("word", "meaning"); + }); - dictMock.add("word", "meaning"); } // ===== - @Test(expected = NullPointerException.class) - public void givenSpy_whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() { + @Test + void givenSpy_whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() { MyDictionary dict = new MyDictionary(); MyDictionary spy = Mockito.spy(dict); - when(spy.getMeaning(anyString())).thenThrow(NullPointerException.class); - spy.getMeaning("word"); + assertThrows(NullPointerException.class, () -> { + spy.getMeaning("word"); + }); } } diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java index 6b2bae16c3..6e9167f0d0 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java @@ -10,16 +10,16 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.Mockito.withSettings; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.MockSettings; import org.mockito.exceptions.verification.TooFewActualInvocations; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; -public class MockitoMockUnitTest { +class MockitoMockUnitTest { @Test - public void whenUsingSimpleMock_thenCorrect() { + void whenUsingSimpleMock_thenCorrect() { MyList listMock = mock(MyList.class); when(listMock.add(anyString())).thenReturn(false); boolean added = listMock.add(randomAlphabetic(6)); @@ -29,7 +29,7 @@ public class MockitoMockUnitTest { } @Test - public void whenUsingMockWithName_thenCorrect() { + void whenUsingMockWithName_thenCorrect() { MyList listMock = mock(MyList.class, "myMock"); when(listMock.add(anyString())).thenReturn(false); listMock.add(randomAlphabetic(6)); @@ -47,7 +47,7 @@ public class MockitoMockUnitTest { } @Test - public void whenUsingMockWithAnswer_thenCorrect() { + void whenUsingMockWithAnswer_thenCorrect() { MyList listMock = mock(MyList.class, new CustomAnswer()); boolean added = listMock.add(randomAlphabetic(6)); @@ -56,7 +56,7 @@ public class MockitoMockUnitTest { } @Test - public void whenUsingMockWithSettings_thenCorrect() { + void whenUsingMockWithSettings_thenCorrect() { MockSettings customSettings = withSettings().defaultAnswer(new CustomAnswer()); MyList listMock = mock(MyList.class, customSettings); boolean added = listMock.add(randomAlphabetic(6)); diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesUnitTest.java index c3c5758950..a236fc7cfc 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesUnitTest.java @@ -1,9 +1,11 @@ package com.baeldung.mockito; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.atMost; +import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; @@ -13,69 +15,71 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.mockito.InOrder; -import org.mockito.Mockito; import org.mockito.exceptions.verification.NoInteractionsWanted; import com.google.common.collect.Lists; -public class MockitoVerifyExamplesUnitTest { +class MockitoVerifyExamplesUnitTest { // tests @Test - public final void givenInteractionWithMockOccurred_whenVerifyingInteraction_thenCorrect() { + final void givenInteractionWithMockOccurred_whenVerifyingInteraction_thenCorrect() { final List mockedList = mock(MyList.class); mockedList.size(); verify(mockedList).size(); } @Test - public final void givenOneInteractionWithMockOccurred_whenVerifyingNumberOfInteractions_thenCorrect() { + final void givenOneInteractionWithMockOccurred_whenVerifyingNumberOfInteractions_thenCorrect() { final List mockedList = mock(MyList.class); mockedList.size(); verify(mockedList, times(1)).size(); } @Test - public final void givenNoInteractionWithMockOccurred_whenVerifyingInteractions_thenCorrect() { + final void givenNoInteractionWithMockOccurred_whenVerifyingInteractions_thenCorrect() { final List mockedList = mock(MyList.class); verifyNoInteractions(mockedList); } @Test - public final void givenNoInteractionWithMethodOfMockOccurred_whenVerifyingInteractions_thenCorrect() { + final void givenNoInteractionWithMethodOfMockOccurred_whenVerifyingInteractions_thenCorrect() { final List mockedList = mock(MyList.class); verify(mockedList, times(0)).size(); } - @Test(expected = NoInteractionsWanted.class) - public final void givenUnverifiedInteraction_whenVerifyingNoUnexpectedInteractions_thenFail() { + @Test + final void givenUnverifiedInteraction_whenVerifyingNoUnexpectedInteractions_thenFail() { final List mockedList = mock(MyList.class); mockedList.size(); mockedList.clear(); verify(mockedList).size(); - verifyNoMoreInteractions(mockedList); + assertThrows(NoInteractionsWanted.class, () -> { + verifyNoMoreInteractions(mockedList); + }); + } @Test - public final void whenVerifyingOrderOfInteractions_thenCorrect() { + final void whenVerifyingOrderOfInteractions_thenCorrect() { final List mockedList = mock(MyList.class); mockedList.size(); mockedList.add("a parameter"); mockedList.clear(); - final InOrder inOrder = Mockito.inOrder(mockedList); + final InOrder inOrder = inOrder(mockedList); inOrder.verify(mockedList).size(); inOrder.verify(mockedList).add("a parameter"); inOrder.verify(mockedList).clear(); } @Test - public final void whenVerifyingAnInteractionHasNotOccurred_thenCorrect() { + final void whenVerifyingAnInteractionHasNotOccurred_thenCorrect() { final List mockedList = mock(MyList.class); mockedList.size(); @@ -83,7 +87,7 @@ public class MockitoVerifyExamplesUnitTest { } @Test - public final void whenVerifyingAnInteractionHasOccurredAtLeastOnce_thenCorrect() { + final void whenVerifyingAnInteractionHasOccurredAtLeastOnce_thenCorrect() { final List mockedList = mock(MyList.class); mockedList.clear(); mockedList.clear(); @@ -96,7 +100,7 @@ public class MockitoVerifyExamplesUnitTest { // with arguments @Test - public final void whenVerifyingAnInteractionWithExactArgument_thenCorrect() { + final void whenVerifyingAnInteractionWithExactArgument_thenCorrect() { final List mockedList = mock(MyList.class); mockedList.add("test"); @@ -104,7 +108,7 @@ public class MockitoVerifyExamplesUnitTest { } @Test - public final void whenVerifyingAnInteractionWithAnyArgument_thenCorrect() { + final void whenVerifyingAnInteractionWithAnyArgument_thenCorrect() { final List mockedList = mock(MyList.class); mockedList.add("test"); @@ -112,7 +116,7 @@ public class MockitoVerifyExamplesUnitTest { } @Test - public final void whenVerifyingAnInteractionWithArgumentCapture_thenCorrect() { + final void whenVerifyingAnInteractionWithArgumentCapture_thenCorrect() { final List mockedList = mock(MyList.class); mockedList.addAll(Lists.newArrayList("someElement")); diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoWhenThenExamplesUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoWhenThenExamplesUnitTest.java index d110fff00f..c570629ccd 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoWhenThenExamplesUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/MockitoWhenThenExamplesUnitTest.java @@ -2,21 +2,24 @@ package com.baeldung.mockito; import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; -import org.junit.Test; -import org.mockito.Mockito; +import org.junit.jupiter.api.Test; -public class MockitoWhenThenExamplesUnitTest { + +class MockitoWhenThenExamplesUnitTest { @Test - public final void whenMockReturnBehaviorIsConfigured_thenBehaviorIsVerified() { - final MyList listMock = Mockito.mock(MyList.class); + final void whenMockReturnBehaviorIsConfigured_thenBehaviorIsVerified() { + final MyList listMock = mock(MyList.class); when(listMock.add(anyString())).thenReturn(false); final boolean added = listMock.add(randomAlphabetic(6)); @@ -24,67 +27,79 @@ public class MockitoWhenThenExamplesUnitTest { } @Test - public final void whenMockReturnBehaviorIsConfigured2_thenBehaviorIsVerified() { - final MyList listMock = Mockito.mock(MyList.class); + final void whenMockReturnBehaviorIsConfigured2_thenBehaviorIsVerified() { + final MyList listMock = mock(MyList.class); doReturn(false).when(listMock).add(anyString()); final boolean added = listMock.add(randomAlphabetic(6)); assertThat(added).isFalse(); } - @Test(expected = IllegalStateException.class) - public final void givenMethodIsConfiguredToThrowException_whenCallingMethod_thenExceptionIsThrown() { - final MyList listMock = Mockito.mock(MyList.class); + @Test + final void givenMethodIsConfiguredToThrowException_whenCallingMethod_thenExceptionIsThrown() { + final MyList listMock = mock(MyList.class); when(listMock.add(anyString())).thenThrow(IllegalStateException.class); - listMock.add(randomAlphabetic(6)); + assertThrows(IllegalStateException.class, () -> { + listMock.add(randomAlphabetic(6)); + }); + } @Test - public final void givenBehaviorIsConfiguredToThrowExceptionOnSecondCall_whenCallingOnlyOnce_thenNoExceptionIsThrown() { - final MyList listMock = Mockito.mock(MyList.class); + final void givenBehaviorIsConfiguredToThrowExceptionOnSecondCall_whenCallingOnlyOnce_thenNoExceptionIsThrown() { + final MyList listMock = mock(MyList.class); when(listMock.add(anyString())).thenReturn(false).thenThrow(IllegalStateException.class); listMock.add(randomAlphabetic(6)); } - @Test(expected = NullPointerException.class) - public final void whenMethodHasNoReturnType_whenConfiguringBehaviorOfMethod_thenPossible() { - final MyList listMock = Mockito.mock(MyList.class); + @Test + final void whenMethodHasNoReturnType_whenConfiguringBehaviorOfMethod_thenPossible() { + final MyList listMock = mock(MyList.class); doThrow(NullPointerException.class).when(listMock).clear(); - listMock.clear(); + assertThrows(NullPointerException.class, () -> { + listMock.clear(); + }); + } - @Test(expected = IllegalStateException.class) - public final void givenBehaviorIsConfiguredToThrowExceptionOnSecondCall_whenCallingTwice_thenExceptionIsThrown() { - final MyList listMock = Mockito.mock(MyList.class); + @Test + final void givenBehaviorIsConfiguredToThrowExceptionOnSecondCall_whenCallingTwice_thenExceptionIsThrown() { + final MyList listMock = mock(MyList.class); when(listMock.add(anyString())).thenReturn(false).thenThrow(IllegalStateException.class); - listMock.add(randomAlphabetic(6)); - listMock.add(randomAlphabetic(6)); + assertThrows(IllegalStateException.class, () -> { + listMock.add(randomAlphabetic(6)); + listMock.add(randomAlphabetic(6)); + }); + } - @Test(expected = NullPointerException.class) - public final void givenSpy_whenConfiguringBehaviorOfSpy_thenCorrectlyConfigured() { + @Test + final void givenSpy_whenConfiguringBehaviorOfSpy_thenCorrectlyConfigured() { final MyList instance = new MyList(); - final MyList spy = Mockito.spy(instance); + final MyList spy = spy(instance); doThrow(NullPointerException.class).when(spy).size(); - spy.size(); + assertThrows(NullPointerException.class, () -> { + spy.size(); + }); + } @Test - public final void whenMockMethodCallIsConfiguredToCallTheRealMethod_thenRealMethodIsCalled() { - final MyList listMock = Mockito.mock(MyList.class); + final void whenMockMethodCallIsConfiguredToCallTheRealMethod_thenRealMethodIsCalled() { + final MyList listMock = mock(MyList.class); when(listMock.size()).thenCallRealMethod(); assertThat(listMock).hasSize(1); } @Test - public final void whenMockMethodCallIsConfiguredWithCustomAnswer_thenRealMethodIsCalled() { - final MyList listMock = Mockito.mock(MyList.class); + final void whenMockMethodCallIsConfiguredWithCustomAnswer_thenRealMethodIsCalled() { + final MyList listMock = mock(MyList.class); doAnswer(invocation -> "Always the same").when(listMock).get(anyInt()); final String element = listMock.get(1); diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/argumentcaptor/EmailServiceUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/argumentcaptor/EmailServiceUnitTest.java index c757a8bfb9..36c26659a6 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/argumentcaptor/EmailServiceUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/argumentcaptor/EmailServiceUnitTest.java @@ -3,18 +3,20 @@ package com.baeldung.mockito.argumentcaptor; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; -@RunWith(MockitoJUnitRunner.class) -public class EmailServiceUnitTest { +@ExtendWith(MockitoExtension.class) +class EmailServiceUnitTest { @Mock DeliveryPlatform platform; @@ -29,34 +31,34 @@ public class EmailServiceUnitTest { ArgumentCaptor credentialsCaptor; @Test - public void whenDoesNotSupportHtml_expectTextOnlyEmailFormat() { + void whenDoesNotSupportHtml_expectTextOnlyEmailFormat() { String to = "info@baeldung.com"; String subject = "Using ArgumentCaptor"; String body = "Hey, let'use ArgumentCaptor"; emailService.send(to, subject, body, false); - Mockito.verify(platform).deliver(emailCaptor.capture()); + verify(platform).deliver(emailCaptor.capture()); Email emailCaptorValue = emailCaptor.getValue(); assertThat(emailCaptorValue.getFormat()).isEqualTo(Format.TEXT_ONLY); } @Test - public void whenDoesSupportHtml_expectHTMLEmailFormat() { + void whenDoesSupportHtml_expectHTMLEmailFormat() { String to = "info@baeldung.com"; String subject = "Using ArgumentCaptor"; String body = "Hey, let'use ArgumentCaptor"; emailService.send(to, subject, body, true); - Mockito.verify(platform).deliver(emailCaptor.capture()); + verify(platform).deliver(emailCaptor.capture()); Email value = emailCaptor.getValue(); assertThat(value.getFormat()).isEqualTo(Format.HTML); } @Test - public void whenServiceRunning_expectUpResponse() { - Mockito.when(platform.getServiceStatus()).thenReturn("OK"); + void whenServiceRunning_expectUpResponse() { + when(platform.getServiceStatus()).thenReturn("OK"); ServiceStatus serviceStatus = emailService.checkServiceStatus(); @@ -64,8 +66,8 @@ public class EmailServiceUnitTest { } @Test - public void whenServiceNotRunning_expectDownResponse() { - Mockito.when(platform.getServiceStatus()).thenReturn("Error"); + void whenServiceNotRunning_expectDownResponse() { + when(platform.getServiceStatus()).thenReturn("Error"); ServiceStatus serviceStatus = emailService.checkServiceStatus(); @@ -73,26 +75,26 @@ public class EmailServiceUnitTest { } @Test - public void whenUsingArgumentMatcherForValidCredentials_expectTrue() { + void whenUsingArgumentMatcherForValidCredentials_expectTrue() { Credentials credentials = new Credentials("baeldung", "correct_password", "correct_key"); - Mockito.when(platform.authenticate(Mockito.eq(credentials))).thenReturn(AuthenticationStatus.AUTHENTICATED); + when(platform.authenticate(eq(credentials))).thenReturn(AuthenticationStatus.AUTHENTICATED); assertTrue(emailService.authenticatedSuccessfully(credentials)); } @Test - public void whenUsingArgumentCaptorForValidCredentials_expectTrue() { + void whenUsingArgumentCaptorForValidCredentials_expectTrue() { Credentials credentials = new Credentials("baeldung", "correct_password", "correct_key"); - Mockito.when(platform.authenticate(credentialsCaptor.capture())).thenReturn(AuthenticationStatus.AUTHENTICATED); + when(platform.authenticate(credentialsCaptor.capture())).thenReturn(AuthenticationStatus.AUTHENTICATED); assertTrue(emailService.authenticatedSuccessfully(credentials)); assertThat(credentialsCaptor.getValue()).isEqualTo(credentials); } @Test - public void whenNotAuthenticated_expectFalse() { + void whenNotAuthenticated_expectFalse() { Credentials credentials = new Credentials("baeldung", "incorrect_password", "incorrect_key"); - Mockito.when(platform.authenticate(Mockito.eq(credentials))).thenReturn(AuthenticationStatus.NOT_AUTHENTICATED); + when(platform.authenticate(eq(credentials))).thenReturn(AuthenticationStatus.NOT_AUTHENTICATED); assertFalse(emailService.authenticatedSuccessfully(credentials)); } diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/mockedstatic/MockedStaticUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/mockedstatic/MockedStaticUnitTest.java index a212e6e3eb..309f066a87 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/mockedstatic/MockedStaticUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/mockedstatic/MockedStaticUnitTest.java @@ -2,9 +2,9 @@ package com.baeldung.mockito.mockedstatic; import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; -import org.mockito.Mockito; import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.mockStatic; import java.util.Arrays; @@ -14,7 +14,7 @@ class MockedStaticUnitTest { void givenStaticMethodWithNoArgs_whenMocked_thenReturnsMockSuccessfully() { assertThat(StaticUtils.name()).isEqualTo("Baeldung"); - try (MockedStatic utilities = Mockito.mockStatic(StaticUtils.class)) { + try (MockedStatic utilities = mockStatic(StaticUtils.class)) { utilities.when(StaticUtils::name).thenReturn("Eugen"); assertThat(StaticUtils.name()).isEqualTo("Eugen"); } @@ -26,7 +26,7 @@ class MockedStaticUnitTest { void givenStaticMethodWithArgs_whenMocked_thenReturnsMockSuccessfully() { assertThat(StaticUtils.range(2, 6)).containsExactly(2, 3, 4, 5); - try (MockedStatic utilities = Mockito.mockStatic(StaticUtils.class)) { + try (MockedStatic utilities = mockStatic(StaticUtils.class)) { utilities.when(() -> StaticUtils.range(2, 6)) .thenReturn(Arrays.asList(10, 11, 12)); diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/spy/MockitoMisusingMockOrSpyUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/spy/MockitoMisusingMockOrSpyUnitTest.java index b3f470427a..e1023c5e57 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/spy/MockitoMisusingMockOrSpyUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/spy/MockitoMisusingMockOrSpyUnitTest.java @@ -2,29 +2,30 @@ package com.baeldung.mockito.spy; import static org.assertj.core.api.Assertions.assertThatNoException; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; import java.util.ArrayList; import java.util.List; -import org.junit.Test; -import org.mockito.Mockito; +import org.junit.jupiter.api.Test; import org.mockito.exceptions.misusing.NotAMockException; -public class MockitoMisusingMockOrSpyUnitTest { +class MockitoMisusingMockOrSpyUnitTest { @Test - public void givenNotASpy_whenDoReturn_thenThrowNotAMock() { + void givenNotASpy_whenDoReturn_thenThrowNotAMock() { List list = new ArrayList(); - assertThatThrownBy(() -> Mockito.doReturn(100).when(list).size()) + assertThatThrownBy(() -> doReturn(100).when(list).size()) .isInstanceOf(NotAMockException.class) .hasMessageContaining("Argument passed to when() is not a mock!"); } @Test - public void givenASpy_whenDoReturn_thenNoError() { - final List spyList = Mockito.spy(new ArrayList<>()); + void givenASpy_whenDoReturn_thenNoError() { + final List spyList = spy(new ArrayList<>()); - assertThatNoException().isThrownBy(() -> Mockito.doReturn(100).when(spyList).size()); + assertThatNoException().isThrownBy(() -> doReturn(100).when(spyList).size()); } } diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/spy/MockitoSpyUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/spy/MockitoSpyUnitTest.java index 28ca0c327b..caef0c3b4b 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/spy/MockitoSpyUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/spy/MockitoSpyUnitTest.java @@ -1,30 +1,33 @@ package com.baeldung.mockito.spy; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import java.util.ArrayList; import java.util.List; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Spy; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class MockitoSpyUnitTest { @Test - public void whenSpyingOnList_thenCorrect() { + void whenSpyingOnList_thenCorrect() { final List list = new ArrayList(); - final List spyList = Mockito.spy(list); + final List spyList = spy(list); spyList.add("one"); spyList.add("two"); - Mockito.verify(spyList).add("one"); - Mockito.verify(spyList).add("two"); + verify(spyList).add("one"); + verify(spyList).add("two"); assertThat(spyList).hasSize(2); } @@ -33,43 +36,43 @@ public class MockitoSpyUnitTest { private List aSpyList = new ArrayList(); @Test - public void whenUsingTheSpyAnnotation_thenObjectIsSpied() { + void whenUsingTheSpyAnnotation_thenObjectIsSpied() { aSpyList.add("one"); aSpyList.add("two"); - Mockito.verify(aSpyList).add("one"); - Mockito.verify(aSpyList).add("two"); + verify(aSpyList).add("one"); + verify(aSpyList).add("two"); assertThat(aSpyList).hasSize(2); } @Test - public void whenStubASpy_thenStubbed() { + void whenStubASpy_thenStubbed() { final List list = new ArrayList(); - final List spyList = Mockito.spy(list); + final List spyList = spy(list); assertEquals(0, spyList.size()); - Mockito.doReturn(100).when(spyList).size(); + doReturn(100).when(spyList).size(); assertThat(spyList).hasSize(100); } @Test - public void whenCreateMock_thenCreated() { - final List mockedList = Mockito.mock(ArrayList.class); + void whenCreateMock_thenCreated() { + final List mockedList = mock(ArrayList.class); mockedList.add("one"); - Mockito.verify(mockedList).add("one"); + verify(mockedList).add("one"); assertThat(mockedList).hasSize(0); } @Test - public void whenCreateSpy_thenCreate() { - final List spyList = Mockito.spy(new ArrayList<>()); + void whenCreateSpy_thenCreate() { + final List spyList = spy(new ArrayList<>()); spyList.add("one"); - Mockito.verify(spyList).add("one"); + verify(spyList).add("one"); assertThat(spyList).hasSize(1); } diff --git a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java index dddfaa4c37..9b8a713a15 100644 --- a/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java +++ b/testing-modules/mockito-simple/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java @@ -1,6 +1,8 @@ package com.baeldung.mockito.voidmethods; -import static org.junit.Assert.assertEquals; + +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.ArgumentMatchers.isA; import static org.mockito.ArgumentMatchers.isNull; @@ -12,34 +14,36 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import com.baeldung.mockito.MyList; -@RunWith(MockitoJUnitRunner.class) -public class MockitoVoidMethodsUnitTest { +@ExtendWith(MockitoExtension.class) +class MockitoVoidMethodsUnitTest { @Test - public void whenAddCalledVerified() { + void whenAddCalledVerified() { MyList myList = mock(MyList.class); myList.add(0, ""); verify(myList, times(1)).add(0, ""); } - @Test(expected = Exception.class) - public void givenNull_addThrows() { + @Test + void givenNull_addThrows() { MyList myList = mock(MyList.class); - doThrow().when(myList).add(isA(Integer.class), isNull()); + assertThrows(Exception.class, () -> { + doThrow().when(myList).add(isA(Integer.class), isNull()); + }); myList.add(0, null); } @Test - public void whenAddCalledValueCaptured() { + void whenAddCalledValueCaptured() { MyList myList = mock(MyList.class); ArgumentCaptor valueCapture = ArgumentCaptor.forClass(String.class); doNothing().when(myList).add(any(Integer.class), valueCapture.capture()); @@ -49,7 +53,7 @@ public class MockitoVoidMethodsUnitTest { } @Test - public void whenAddCalledAnswered() { + void whenAddCalledAnswered() { MyList myList = mock(MyList.class); doAnswer(invocation -> { Object arg0 = invocation.getArgument(0); @@ -64,7 +68,7 @@ public class MockitoVoidMethodsUnitTest { } @Test - public void whenAddCalledRealMethodCalled() { + void whenAddCalledRealMethodCalled() { MyList myList = mock(MyList.class); doCallRealMethod().when(myList).add(any(Integer.class), any(String.class)); myList.add(1, "real"); From 10d561451a3608fcca21c34bb83f79f1da164dcc Mon Sep 17 00:00:00 2001 From: apeterlic Date: Fri, 9 Dec 2022 18:40:18 +0100 Subject: [PATCH 118/592] BAEL-5986 - Getting Started with Blaze Persistence (#13107) * BAEL-5986 - Getting Started with Blaze Persistence * Optimize imports * Fix test class name * Switch to JUnit5 * Removed dependencies and Controller classes * Update pom.xml * Update Configuration class --- .../blaze-persistence/README.md | 1 + persistence-modules/blaze-persistence/pom.xml | 121 ++++++++++++++++++ .../baeldung/BlazePersistenceApplication.java | 57 +++++++++ .../config/BlazePersistenceConfiguration.java | 35 +++++ .../main/java/com/baeldung/model/Person.java | 72 +++++++++++ .../main/java/com/baeldung/model/Post.java | 68 ++++++++++ .../baeldung/repository/PersonRepository.java | 47 +++++++ .../baeldung/repository/PostRepository.java | 48 +++++++ .../repository/PostViewRepository.java | 11 ++ .../java/com/baeldung/view/PersonView.java | 16 +++ .../main/java/com/baeldung/view/PostView.java | 18 +++ .../com/baeldung/view/PostWithAuthorView.java | 10 ++ .../src/main/resources/application.properties | 9 ++ .../src/main/resources/data.sql | 11 ++ .../java/com/baeldung/PersonUnitTest.java | 49 +++++++ .../test/java/com/baeldung/PostUnitTest.java | 54 ++++++++ .../java/com/baeldung/TestContextConfig.java | 15 +++ persistence-modules/pom.xml | 1 + 18 files changed, 643 insertions(+) create mode 100644 persistence-modules/blaze-persistence/README.md create mode 100644 persistence-modules/blaze-persistence/pom.xml create mode 100644 persistence-modules/blaze-persistence/src/main/java/com/baeldung/BlazePersistenceApplication.java create mode 100644 persistence-modules/blaze-persistence/src/main/java/com/baeldung/config/BlazePersistenceConfiguration.java create mode 100644 persistence-modules/blaze-persistence/src/main/java/com/baeldung/model/Person.java create mode 100644 persistence-modules/blaze-persistence/src/main/java/com/baeldung/model/Post.java create mode 100644 persistence-modules/blaze-persistence/src/main/java/com/baeldung/repository/PersonRepository.java create mode 100644 persistence-modules/blaze-persistence/src/main/java/com/baeldung/repository/PostRepository.java create mode 100644 persistence-modules/blaze-persistence/src/main/java/com/baeldung/repository/PostViewRepository.java create mode 100644 persistence-modules/blaze-persistence/src/main/java/com/baeldung/view/PersonView.java create mode 100644 persistence-modules/blaze-persistence/src/main/java/com/baeldung/view/PostView.java create mode 100644 persistence-modules/blaze-persistence/src/main/java/com/baeldung/view/PostWithAuthorView.java create mode 100644 persistence-modules/blaze-persistence/src/main/resources/application.properties create mode 100644 persistence-modules/blaze-persistence/src/main/resources/data.sql create mode 100644 persistence-modules/blaze-persistence/src/test/java/com/baeldung/PersonUnitTest.java create mode 100644 persistence-modules/blaze-persistence/src/test/java/com/baeldung/PostUnitTest.java create mode 100644 persistence-modules/blaze-persistence/src/test/java/com/baeldung/TestContextConfig.java diff --git a/persistence-modules/blaze-persistence/README.md b/persistence-modules/blaze-persistence/README.md new file mode 100644 index 0000000000..7d843af9ea --- /dev/null +++ b/persistence-modules/blaze-persistence/README.md @@ -0,0 +1 @@ +### Relevant Articles: diff --git a/persistence-modules/blaze-persistence/pom.xml b/persistence-modules/blaze-persistence/pom.xml new file mode 100644 index 0000000000..cc57785fe9 --- /dev/null +++ b/persistence-modules/blaze-persistence/pom.xml @@ -0,0 +1,121 @@ + + + 4.0.0 + blaze-persistence + 1.0-SNAPSHOT + blaze-persistence + + + org.springframework.boot + spring-boot-starter-parent + 2.4.0 + + + + + UTF-8 + 1.8 + 1.8 + 1.6.8 + + + + + + com.blazebit + blaze-persistence-bom + ${blaze-persistence.version} + pom + import + + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + com.blazebit + blaze-persistence-core-api + + + com.blazebit + blaze-persistence-core-impl + + + com.blazebit + blaze-persistence-integration-hibernate-5.4 + + + + + com.blazebit + blaze-persistence-entity-view-api + + + com.blazebit + blaze-persistence-entity-view-impl + + + com.blazebit + blaze-persistence-entity-view-processor + + + + + com.blazebit + blaze-persistence-integration-entity-view-spring + + + com.blazebit + blaze-persistence-integration-spring-data-2.4 + + + + + org.springframework + spring-context + + + org.springframework + spring-orm + + + + com.h2database + h2 + + + + + org.springframework + spring-test + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-api + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/persistence-modules/blaze-persistence/src/main/java/com/baeldung/BlazePersistenceApplication.java b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/BlazePersistenceApplication.java new file mode 100644 index 0000000000..e2976aaf37 --- /dev/null +++ b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/BlazePersistenceApplication.java @@ -0,0 +1,57 @@ +package com.baeldung; + +import com.baeldung.model.Person; +import com.baeldung.model.Post; +import com.baeldung.repository.PersonRepository; +import com.baeldung.repository.PostRepository; +import com.baeldung.repository.PostViewRepository; +import com.baeldung.view.PostWithAuthorView; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class BlazePersistenceApplication implements CommandLineRunner { + + private static final Logger logger = LoggerFactory.getLogger(BlazePersistenceApplication.class); + + @Autowired + private PersonRepository personRepository; + + @Autowired + private PostRepository postRepository; + + @Autowired + private PostViewRepository postViewRepository; + + public static void main(String[] args) { + SpringApplication.run(BlazePersistenceApplication.class, args); + } + + @Override + public void run(String... args) { + + logger.info("All Posts:"); + Iterable posts = postRepository.findAll(); + posts.forEach(p -> logger.info(String.valueOf(p))); + + logger.info("Posts with title 'Spring' or author 'Peter':"); + Iterable postsFiltered = postRepository.findBy("Spring", "Peter"); + postsFiltered.forEach(p -> logger.info(String.valueOf(p))); + + logger.info("Find all post with author view:"); + Iterable postsView = postViewRepository.findAll(); + postsView.forEach(p -> logger.info(String.valueOf(p))); + + logger.info("Person with at least two posts:"); + Iterable personIterable = personRepository.find(); + personIterable.forEach(p -> logger.info(String.valueOf(p))); + + logger.info("All Persons:"); + Iterable personIterableAll = personRepository.findAll(); + personIterableAll.forEach(p -> logger.info(String.valueOf(p))); + } +} \ No newline at end of file diff --git a/persistence-modules/blaze-persistence/src/main/java/com/baeldung/config/BlazePersistenceConfiguration.java b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/config/BlazePersistenceConfiguration.java new file mode 100644 index 0000000000..0ec2e881ed --- /dev/null +++ b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/config/BlazePersistenceConfiguration.java @@ -0,0 +1,35 @@ +package com.baeldung.config; + +import com.blazebit.persistence.Criteria; +import com.blazebit.persistence.CriteriaBuilderFactory; +import com.blazebit.persistence.integration.view.spring.EnableEntityViews; +import com.blazebit.persistence.spi.CriteriaBuilderConfiguration; +import com.blazebit.persistence.spring.data.repository.config.EnableBlazeRepositories; +import com.blazebit.persistence.view.EntityViewManager; +import com.blazebit.persistence.view.spi.EntityViewConfiguration; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.persistence.EntityManagerFactory; + +@Configuration +@EnableEntityViews(basePackages = {"com.baeldung.view"}) +@EnableBlazeRepositories(basePackages = "com.baeldung.repository") +public class BlazePersistenceConfiguration { + + @Autowired + private EntityManagerFactory entityManagerFactory; + + @Bean + public CriteriaBuilderFactory createCriteriaBuilderFactory() { + CriteriaBuilderConfiguration config = Criteria.getDefault(); + return config.createCriteriaBuilderFactory(entityManagerFactory); + } + + @Bean + public EntityViewManager createEntityViewManager(CriteriaBuilderFactory criteriaBuilderFactory, + EntityViewConfiguration entityViewConfiguration) { + return entityViewConfiguration.createEntityViewManager(criteriaBuilderFactory); + } +} \ No newline at end of file diff --git a/persistence-modules/blaze-persistence/src/main/java/com/baeldung/model/Person.java b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/model/Person.java new file mode 100644 index 0000000000..a6daade80d --- /dev/null +++ b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/model/Person.java @@ -0,0 +1,72 @@ +package com.baeldung.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import java.util.HashSet; +import java.util.Set; + +@Entity +public class Person { + + @Id + @GeneratedValue + private Long id; + + private String name; + + private int age; + + @OneToMany(mappedBy = "author") + private Set posts = new HashSet<>(); + + public Person() { + } + + public Person(String name, int age) { + this.name = name; + this.age = age; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Set getPosts() { + return posts; + } + + public void setPosts(Set posts) { + this.posts = posts; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + @Override + public String toString() { + return "Person{" + + "id=" + id + + ", name='" + name + '\'' + + ", age=" + age + + '}'; + } +} diff --git a/persistence-modules/blaze-persistence/src/main/java/com/baeldung/model/Post.java b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/model/Post.java new file mode 100644 index 0000000000..6fc10dc730 --- /dev/null +++ b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/model/Post.java @@ -0,0 +1,68 @@ +package com.baeldung.model; + +import javax.persistence.*; + +@Entity +public class Post { + + @Id + @GeneratedValue + private Long id; + + private String title; + + private String content; + + @ManyToOne(fetch = FetchType.LAZY) + private Person author; + + public Post() { + } + + public Post(String title, String content, Person author) { + this.title = title; + this.content = content; + this.author = author; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Person getAuthor() { + return author; + } + + public void setAuthor(Person author) { + this.author = author; + } + + @Override + public String toString() { + return "Post{" + + "id=" + id + + ", title='" + title + '\'' + + ", content='" + content + '\'' + + '}'; + } +} diff --git a/persistence-modules/blaze-persistence/src/main/java/com/baeldung/repository/PersonRepository.java b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/repository/PersonRepository.java new file mode 100644 index 0000000000..12b197e8be --- /dev/null +++ b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/repository/PersonRepository.java @@ -0,0 +1,47 @@ +package com.baeldung.repository; + +import com.baeldung.model.Person; +import com.baeldung.model.Post; +import com.blazebit.persistence.CriteriaBuilder; +import com.blazebit.persistence.CriteriaBuilderFactory; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.transaction.Transactional; + +@Repository +@Transactional +public class PersonRepository { + + private final EntityManager entityManager; + + private final CriteriaBuilderFactory builderFactory; + + public PersonRepository(EntityManager entityManager, CriteriaBuilderFactory builderFactory) { + this.entityManager = entityManager; + this.builderFactory = builderFactory; + } + + public Iterable findPostsByPerson() { + CriteriaBuilder postCriteriaBuilder = builderFactory.create(entityManager, Post.class) + .from(Person.class, "person") + .select("person.posts"); + return postCriteriaBuilder.getResultList(); + } + + public Iterable findAll() { + return builderFactory.create(entityManager, Person.class).getResultList(); + } + + public Iterable find() { + CriteriaBuilder personCriteriaBuilder = builderFactory.create(entityManager, Person.class, "p") + .where("p.age") + .betweenExpression("18") + .andExpression("40") + .where("SIZE(p.posts)").geExpression("2") + .orderByAsc("p.name") + .orderByAsc("p.id"); + return personCriteriaBuilder.getResultList(); + } + +} diff --git a/persistence-modules/blaze-persistence/src/main/java/com/baeldung/repository/PostRepository.java b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/repository/PostRepository.java new file mode 100644 index 0000000000..cf7edffe62 --- /dev/null +++ b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/repository/PostRepository.java @@ -0,0 +1,48 @@ +package com.baeldung.repository; + +import com.baeldung.model.Post; +import com.baeldung.view.PostWithAuthorView; +import com.blazebit.persistence.CriteriaBuilder; +import com.blazebit.persistence.CriteriaBuilderFactory; +import com.blazebit.persistence.view.EntityViewManager; +import com.blazebit.persistence.view.EntityViewSetting; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.transaction.Transactional; + +@Repository +@Transactional +public class PostRepository { + + private final EntityManager entityManager; + + private final CriteriaBuilderFactory builderFactory; + + private final EntityViewManager viewManager; + + public PostRepository(EntityManager entityManager, CriteriaBuilderFactory builderFactory, + EntityViewManager viewManager) { + this.entityManager = entityManager; + this.builderFactory = builderFactory; + this.viewManager = viewManager; + } + + public Iterable findAll() { + return builderFactory.create(entityManager, Post.class).getResultList(); + } + + public Iterable findBy(final String title, final String authorName) { + CriteriaBuilder postCriteriaBuilder = builderFactory.create(entityManager, Post.class, "p") + .whereOr() + .where("p.title").like().value(title + "%").noEscape() + .where("p.author.name").eq(authorName) + .endOr(); + + CriteriaBuilder postWithAuthorViewCriteriaBuilder = + viewManager.applySetting(EntityViewSetting + .create(PostWithAuthorView.class), postCriteriaBuilder); + + return postWithAuthorViewCriteriaBuilder.getResultList(); + } +} diff --git a/persistence-modules/blaze-persistence/src/main/java/com/baeldung/repository/PostViewRepository.java b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/repository/PostViewRepository.java new file mode 100644 index 0000000000..ef241c73a2 --- /dev/null +++ b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/repository/PostViewRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.repository; + +import com.baeldung.view.PostWithAuthorView; +import com.blazebit.persistence.spring.data.repository.EntityViewRepository; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +@Repository +@Transactional(readOnly = true) +public interface PostViewRepository extends EntityViewRepository { +} diff --git a/persistence-modules/blaze-persistence/src/main/java/com/baeldung/view/PersonView.java b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/view/PersonView.java new file mode 100644 index 0000000000..e9dd184629 --- /dev/null +++ b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/view/PersonView.java @@ -0,0 +1,16 @@ +package com.baeldung.view; + +import com.baeldung.model.Person; +import com.blazebit.persistence.view.EntityView; +import com.blazebit.persistence.view.IdMapping; + +@EntityView(Person.class) +public interface PersonView { + + @IdMapping + Long getId(); + + int getAge(); + + String getName(); +} diff --git a/persistence-modules/blaze-persistence/src/main/java/com/baeldung/view/PostView.java b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/view/PostView.java new file mode 100644 index 0000000000..b335cda385 --- /dev/null +++ b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/view/PostView.java @@ -0,0 +1,18 @@ +package com.baeldung.view; + +import com.baeldung.model.Post; +import com.blazebit.persistence.view.EntityView; +import com.blazebit.persistence.view.IdMapping; +import com.blazebit.persistence.view.Mapping; + +@EntityView(Post.class) +public interface PostView { + + @IdMapping + Long getId(); + + @Mapping("UPPER(title)") + String getTitle(); + + String getContent(); +} diff --git a/persistence-modules/blaze-persistence/src/main/java/com/baeldung/view/PostWithAuthorView.java b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/view/PostWithAuthorView.java new file mode 100644 index 0000000000..8a34a4e34a --- /dev/null +++ b/persistence-modules/blaze-persistence/src/main/java/com/baeldung/view/PostWithAuthorView.java @@ -0,0 +1,10 @@ +package com.baeldung.view; + +import com.baeldung.model.Post; +import com.blazebit.persistence.view.EntityView; + +@EntityView(Post.class) +public interface PostWithAuthorView extends PostView { + PersonView getAuthor(); + +} diff --git a/persistence-modules/blaze-persistence/src/main/resources/application.properties b/persistence-modules/blaze-persistence/src/main/resources/application.properties new file mode 100644 index 0000000000..de4a62720a --- /dev/null +++ b/persistence-modules/blaze-persistence/src/main/resources/application.properties @@ -0,0 +1,9 @@ +spring.h2.console.enabled=true +spring.jpa.show-sql=true +logging.level.org.hibernate.SQL=DEBUG +spring.jpa.hibernate.ddl-auto=create +spring.datasource.url=jdbc:h2:mem:test +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password=sa +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/persistence-modules/blaze-persistence/src/main/resources/data.sql b/persistence-modules/blaze-persistence/src/main/resources/data.sql new file mode 100644 index 0000000000..0ed609a2a4 --- /dev/null +++ b/persistence-modules/blaze-persistence/src/main/resources/data.sql @@ -0,0 +1,11 @@ +INSERT INTO Person(id, name, age) VALUES(1, 'Peter', 18); +INSERT INTO Person(id, name, age) VALUES(2, 'Emily', 36); +INSERT INTO Person(id, name, age) VALUES(3, 'John', 27); + +INSERT INTO Post(id, title, content, author_id) VALUES(1, 'Blaze Persistence', 'Blaze Content', 1); +INSERT INTO Post(id, title, content, author_id) VALUES(2, 'Jacoco', 'Jacoco Content', 1); +INSERT INTO Post(id, title, content, author_id) VALUES(3, 'Spring', 'Spring Content', 2); +INSERT INTO Post(id, title, content, author_id) VALUES(4, 'Spring Boot', 'Spring Boot Content', 3); +INSERT INTO Post(id, title, content, author_id) VALUES(5, 'Java 17', 'Java Content', 3); +INSERT INTO Post(id, title, content, author_id) VALUES(6, 'Functional Programming', 'Functional Programming Content', 3); +INSERT INTO Post(id, title, content, author_id) VALUES(7, 'Unit Testing', 'Unit Testing Content', 3); \ No newline at end of file diff --git a/persistence-modules/blaze-persistence/src/test/java/com/baeldung/PersonUnitTest.java b/persistence-modules/blaze-persistence/src/test/java/com/baeldung/PersonUnitTest.java new file mode 100644 index 0000000000..16434d52d0 --- /dev/null +++ b/persistence-modules/blaze-persistence/src/test/java/com/baeldung/PersonUnitTest.java @@ -0,0 +1,49 @@ +package com.baeldung; + +import com.baeldung.model.Person; +import com.baeldung.model.Post; +import com.baeldung.repository.PersonRepository; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@ContextConfiguration(classes = TestContextConfig.class) +@ExtendWith(SpringExtension.class) +public class PersonUnitTest { + + @Autowired + private PersonRepository personRepository; + + @Test + public void whenFind_thenReturnCorrectListSize() { + final Iterable listIterable = personRepository.find(); + final List list = new ArrayList<>(); + listIterable.forEach(list::add); + assertEquals(2, list.size()); + assertEquals("John", list.get(0).getName()); + } + + @Test + public void whenFindAll_thenReturnCorrectListSize() { + final Iterable listIterable = personRepository.findAll(); + final List list = new ArrayList<>(); + listIterable.forEach(list::add); + assertEquals(3, list.size()); + } + + @Test + public void whenFindPostsByPerson_thenReturnCorrectListSize() { + final Iterable listIterable = personRepository.findPostsByPerson(); + final List list = new ArrayList<>(); + listIterable.forEach(list::add); + assertEquals(7, list.size()); + } + +} diff --git a/persistence-modules/blaze-persistence/src/test/java/com/baeldung/PostUnitTest.java b/persistence-modules/blaze-persistence/src/test/java/com/baeldung/PostUnitTest.java new file mode 100644 index 0000000000..0af01de088 --- /dev/null +++ b/persistence-modules/blaze-persistence/src/test/java/com/baeldung/PostUnitTest.java @@ -0,0 +1,54 @@ +package com.baeldung; + +import com.baeldung.model.Post; +import com.baeldung.repository.PostRepository; +import com.baeldung.repository.PostViewRepository; +import com.baeldung.view.PostView; +import com.baeldung.view.PostWithAuthorView; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@ContextConfiguration(classes = TestContextConfig.class) +@ExtendWith(SpringExtension.class) +public class PostUnitTest { + + @Autowired + private PostViewRepository postViewRepository; + + @Autowired + private PostRepository postRepository; + + @Test + public void whenFindAll_thenReturnCorrectListViewSize() { + final Iterable listIterable = postViewRepository.findAll(); + final List list = new ArrayList<>(); + listIterable.forEach(list::add); + assertEquals(7, list.size()); + } + + @Test + public void givenPostIdAndAuthorName_whenFind_thenReturnCorrectResult() { + final Iterable listIterable = + postRepository.findBy("Spring", "Peter"); + final List list = new ArrayList<>(); + listIterable.forEach(list::add); + assertEquals(4, list.size()); + } + + @Test + public void whenFindAll_thenReturnCorrectListSize() { + final Iterable listIterable = postRepository.findAll(); + final List list = new ArrayList<>(); + listIterable.forEach(list::add); + assertEquals(7, list.size()); + } + +} diff --git a/persistence-modules/blaze-persistence/src/test/java/com/baeldung/TestContextConfig.java b/persistence-modules/blaze-persistence/src/test/java/com/baeldung/TestContextConfig.java new file mode 100644 index 0000000000..1df1fb21d9 --- /dev/null +++ b/persistence-modules/blaze-persistence/src/test/java/com/baeldung/TestContextConfig.java @@ -0,0 +1,15 @@ +package com.baeldung; + +import com.blazebit.persistence.integration.view.spring.EnableEntityViews; +import com.blazebit.persistence.spring.data.repository.config.EnableBlazeRepositories; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan("com.baeldung") +@EnableEntityViews(basePackages = {"com.baeldung.view"}) +@EnableBlazeRepositories(basePackages = "com.baeldung.repository") +public class TestContextConfig { + + +} diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index bff23cffc1..c17e793dbc 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -18,6 +18,7 @@ apache-bookkeeper apache-cayenne apache-derby + blaze-persistence core-java-persistence core-java-persistence-2 deltaspike From f45b2c8659c0cb075bcd7f5fee9f2ed8b28cb31c Mon Sep 17 00:00:00 2001 From: Adrian Bob Date: Fri, 9 Dec 2022 20:35:09 +0200 Subject: [PATCH 119/592] BAEL-5325: Add Spring Security login/logout API with Springdoc (#13027) * BAEL-5325: Add Spring Security login/logout API with Springdoc * Updated Spring version and using annotations for Basic Auth config * Added tests * Removed unused dependencies * Removed dependencies which were accidentally added. * Removed plugins which were accidentally added. * Removed property which was accidentally added. --- spring-security-modules/pom.xml | 1 + .../spring-security-web-springdoc/README.md | 15 +++++ .../spring-security-web-springdoc/pom.xml | 54 ++++++++++++++++ .../main/java/com/baeldung/basicauth/Foo.java | 60 +++++++++++++++++ .../com/baeldung/basicauth/FooController.java | 39 +++++++++++ .../SpringBootSpringdocBasicAuth.java | 13 ++++ .../config/PasswordEncoderConfiguration.java | 15 +++++ .../config/SecurityConfiguration.java | 38 +++++++++++ .../basicauth/config/SpringdocConfig.java | 12 ++++ .../SpringBootSpringdocFormLogin.java | 13 ++++ .../config/PasswordEncoderConfiguration.java | 15 +++++ .../config/SecurityConfiguration.java | 40 ++++++++++++ .../formlogin/controller/FooController.java | 37 +++++++++++ .../controller/LogoutController.java | 17 +++++ .../com/baeldung/formlogin/model/Foo.java | 62 ++++++++++++++++++ .../src/main/resources/application.properties | 1 + .../basicauth/OpenAPIIntegrationTest.java | 64 +++++++++++++++++++ .../formlogin/OpenAPIIntegrationTest.java | 52 +++++++++++++++ 18 files changed, 548 insertions(+) create mode 100644 spring-security-modules/spring-security-web-springdoc/README.md create mode 100644 spring-security-modules/spring-security-web-springdoc/pom.xml create mode 100644 spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/Foo.java create mode 100644 spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/FooController.java create mode 100644 spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/SpringBootSpringdocBasicAuth.java create mode 100644 spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/config/PasswordEncoderConfiguration.java create mode 100644 spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/config/SecurityConfiguration.java create mode 100644 spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/config/SpringdocConfig.java create mode 100644 spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/SpringBootSpringdocFormLogin.java create mode 100644 spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/config/PasswordEncoderConfiguration.java create mode 100644 spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/config/SecurityConfiguration.java create mode 100644 spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/controller/FooController.java create mode 100644 spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/controller/LogoutController.java create mode 100644 spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/model/Foo.java create mode 100644 spring-security-modules/spring-security-web-springdoc/src/main/resources/application.properties create mode 100644 spring-security-modules/spring-security-web-springdoc/src/test/java/com/baeldung/basicauth/OpenAPIIntegrationTest.java create mode 100644 spring-security-modules/spring-security-web-springdoc/src/test/java/com/baeldung/formlogin/OpenAPIIntegrationTest.java diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml index 1e0ae825e1..d6e30e8ab8 100644 --- a/spring-security-modules/pom.xml +++ b/spring-security-modules/pom.xml @@ -43,6 +43,7 @@ spring-security-web-rest-basic-auth spring-security-web-rest-custom spring-security-web-rest + spring-security-web-springdoc spring-security-web-sockets spring-security-web-thymeleaf spring-security-web-x509 diff --git a/spring-security-modules/spring-security-web-springdoc/README.md b/spring-security-modules/spring-security-web-springdoc/README.md new file mode 100644 index 0000000000..90a82d1681 --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/README.md @@ -0,0 +1,15 @@ +## Spring Security Web Springdoc + +This module contains articles about Springdoc with Spring Security + +### Relevant Articles: + +- [Documenting a Spring REST API Using OpenAPI 3.0](https://www.baeldung.com/spring-rest-openapi-documentation) +- [Configure JWT Authentication for OpenAPI](https://www.baeldung.com/openapi-jwt-authentication) + +### Running This Project: + +To run the projects use the commands: +- `mvn spring-boot:run -Dstart-class=com.baeldung.basicauth.SpringBootSpringdocBasicAuth` +- `mvn spring-boot:run -Dstart-class=com.baeldung.formlogin.SpringBootSpringdocFormLogin` + diff --git a/spring-security-modules/spring-security-web-springdoc/pom.xml b/spring-security-modules/spring-security-web-springdoc/pom.xml new file mode 100644 index 0000000000..03e938f1c8 --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + spring-security-web-springdoc + 0.1-SNAPSHOT + spring-security-web-springdoc + jar + Spring Security with Springdoc tutorial + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-web + + + org.springdoc + springdoc-openapi-ui + ${springdoc.version} + + + org.springdoc + springdoc-openapi-security + ${springdoc.version} + + + com.google.guava + guava + ${guava.version} + + + org.springframework.boot + spring-boot-starter-test + test + + + + + 1.6.13 + + + \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/Foo.java b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/Foo.java new file mode 100644 index 0000000000..ab0f010e2c --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/Foo.java @@ -0,0 +1,60 @@ +package com.baeldung.basicauth; + +import java.io.Serializable; + +public class Foo implements Serializable { + + private static final long serialVersionUID = -5422285893276747592L; + + private long id; + private String name; + + public Foo(final String name) { + super(); + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final Foo other = (Foo) obj; + if (name == null) { + return other.name == null; + } else return name.equals(other.name); + } + + @Override + public String toString() { + return "Foo [name=" + name + "]"; + } + +} diff --git a/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/FooController.java b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/FooController.java new file mode 100644 index 0000000000..9ca2f9a6cc --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/FooController.java @@ -0,0 +1,39 @@ +package com.baeldung.basicauth; + +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; + +import com.google.common.collect.Lists; + +@RestController +@OpenAPIDefinition(info = @Info(title = "Foos API", version = "v1")) +@SecurityRequirement(name = "basicAuth") +@RequestMapping(value = "foos", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) +public class FooController { + + private static final int STRING_LENGTH = 6; + + @GetMapping(value = "/{id}") + public Foo findById(@PathVariable("id") final Long id) { + return new Foo(randomAlphabetic(STRING_LENGTH)); + } + + @GetMapping + public List findAll() { + return Lists.newArrayList(new Foo(randomAlphabetic(STRING_LENGTH)), new Foo(randomAlphabetic(STRING_LENGTH)), new Foo(randomAlphabetic(STRING_LENGTH))); + } + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public Foo create(@RequestBody final Foo foo) { + return foo; + } +} diff --git a/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/SpringBootSpringdocBasicAuth.java b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/SpringBootSpringdocBasicAuth.java new file mode 100644 index 0000000000..0875c5d176 --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/SpringBootSpringdocBasicAuth.java @@ -0,0 +1,13 @@ +package com.baeldung.basicauth; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootSpringdocBasicAuth { + + public static void main(String[] args) { + SpringApplication.run(SpringBootSpringdocBasicAuth.class, args); + } + +} diff --git a/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/config/PasswordEncoderConfiguration.java b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/config/PasswordEncoderConfiguration.java new file mode 100644 index 0000000000..4da6b5438b --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/config/PasswordEncoderConfiguration.java @@ -0,0 +1,15 @@ +package com.baeldung.basicauth.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Configuration +public class PasswordEncoderConfiguration { + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/config/SecurityConfiguration.java b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/config/SecurityConfiguration.java new file mode 100644 index 0000000000..a419162828 --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/config/SecurityConfiguration.java @@ -0,0 +1,38 @@ +package com.baeldung.basicauth.config; + +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.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.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +@EnableWebSecurity +public class SecurityConfiguration { + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http + .csrf().disable() + .authorizeRequests() + .antMatchers("/v3/api-docs/**", + "/swagger-ui/**", + "/swagger-ui.html").permitAll() + .anyRequest().authenticated() + .and() + .httpBasic(); + return http.build(); + } + + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth, PasswordEncoder passwordEncoder) throws Exception { + auth.inMemoryAuthentication() + .withUser("user") + .password(passwordEncoder.encode("password")) + .roles("USER"); + } + +} diff --git a/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/config/SpringdocConfig.java b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/config/SpringdocConfig.java new file mode 100644 index 0000000000..57d3d8bd02 --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/basicauth/config/SpringdocConfig.java @@ -0,0 +1,12 @@ +package com.baeldung.basicauth.config; + +import io.swagger.v3.oas.annotations.enums.SecuritySchemeType; +import io.swagger.v3.oas.annotations.security.SecurityScheme; +import org.springframework.context.annotation.Configuration; + +@Configuration +@SecurityScheme( + type = SecuritySchemeType.HTTP, + name = "basicAuth", + scheme = "basic") +public class SpringdocConfig {} diff --git a/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/SpringBootSpringdocFormLogin.java b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/SpringBootSpringdocFormLogin.java new file mode 100644 index 0000000000..5c4c262fa7 --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/SpringBootSpringdocFormLogin.java @@ -0,0 +1,13 @@ +package com.baeldung.formlogin; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootSpringdocFormLogin { + + public static void main(String[] args) { + SpringApplication.run(SpringBootSpringdocFormLogin.class, args); + } + +} diff --git a/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/config/PasswordEncoderConfiguration.java b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/config/PasswordEncoderConfiguration.java new file mode 100644 index 0000000000..e3f9e71bd6 --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/config/PasswordEncoderConfiguration.java @@ -0,0 +1,15 @@ +package com.baeldung.formlogin.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Configuration +public class PasswordEncoderConfiguration { + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/config/SecurityConfiguration.java b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/config/SecurityConfiguration.java new file mode 100644 index 0000000000..2b849031ce --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/config/SecurityConfiguration.java @@ -0,0 +1,40 @@ +package com.baeldung.formlogin.config; + +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.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.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +@EnableWebSecurity +public class SecurityConfiguration { + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http + .csrf().disable() + .authorizeRequests() + .antMatchers("/v3/api-docs/**", + "/swagger-ui/**", + "/swagger-ui.html").permitAll() + .anyRequest().authenticated() + .and() + .formLogin() + .defaultSuccessUrl("/foos"); + return http.build(); + } + + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth, PasswordEncoder passwordEncoder) throws Exception { + auth.inMemoryAuthentication() + .withUser("user") + .password(passwordEncoder.encode("password")) + .roles("USER"); + } + +} diff --git a/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/controller/FooController.java b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/controller/FooController.java new file mode 100644 index 0000000000..1d09789067 --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/controller/FooController.java @@ -0,0 +1,37 @@ +package com.baeldung.formlogin.controller; + +import com.baeldung.formlogin.model.Foo; +import com.google.common.collect.Lists; +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.info.Info; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; + +@RestController +@RequestMapping(value = "foos", produces = MediaType.APPLICATION_JSON_VALUE) +@OpenAPIDefinition(info = @Info(title = "Foos API", version = "v1")) +public class FooController { + + private static final int STRING_LENGTH = 6; + + @GetMapping(value = "/{id}") + public Foo findById(@PathVariable("id") final Long id) { + return new Foo(randomAlphabetic(STRING_LENGTH)); + } + + @GetMapping + public List findAll() { + return Lists.newArrayList(new Foo(randomAlphabetic(STRING_LENGTH)), new Foo(randomAlphabetic(STRING_LENGTH)), new Foo(randomAlphabetic(STRING_LENGTH))); + } + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public Foo create(@RequestBody final Foo foo) { + return foo; + } +} diff --git a/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/controller/LogoutController.java b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/controller/LogoutController.java new file mode 100644 index 0000000000..ab1c635de0 --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/controller/LogoutController.java @@ -0,0 +1,17 @@ +package com.baeldung.formlogin.controller; + +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.info.Info; +import org.springframework.web.bind.annotation.*; + +@RestController +@OpenAPIDefinition(info = @Info(title = "logout-endpoint")) +public class LogoutController { + + @PostMapping("logout") + @Operation(description = "End authenticated user session") + public void logout() { + throw new UnsupportedOperationException(); + } +} diff --git a/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/model/Foo.java b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/model/Foo.java new file mode 100644 index 0000000000..5133c215b3 --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/src/main/java/com/baeldung/formlogin/model/Foo.java @@ -0,0 +1,62 @@ +package com.baeldung.formlogin.model; + +import java.io.Serializable; + +public class Foo implements Serializable { + + private static final long serialVersionUID = -5422285893276747592L; + + private long id; + private String name; + + public Foo(final String name) { + this.name = name; + } + + public Foo() { + } + + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final Foo other = (Foo) obj; + if (name == null) { + return other.name == null; + } else return name.equals(other.name); + } + + @Override + public String toString() { + return "Foo [name=" + name + "]"; + } + +} diff --git a/spring-security-modules/spring-security-web-springdoc/src/main/resources/application.properties b/spring-security-modules/spring-security-web-springdoc/src/main/resources/application.properties new file mode 100644 index 0000000000..7157c0f5b9 --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/src/main/resources/application.properties @@ -0,0 +1 @@ +springdoc.show-login-endpoint=true diff --git a/spring-security-modules/spring-security-web-springdoc/src/test/java/com/baeldung/basicauth/OpenAPIIntegrationTest.java b/spring-security-modules/spring-security-web-springdoc/src/test/java/com/baeldung/basicauth/OpenAPIIntegrationTest.java new file mode 100644 index 0000000000..3e622059c1 --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/src/test/java/com/baeldung/basicauth/OpenAPIIntegrationTest.java @@ -0,0 +1,64 @@ +package com.baeldung.basicauth; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class OpenAPIIntegrationTest { + + @LocalServerPort + private int port; + + @Autowired + private TestRestTemplate restTemplate; + + @Test + void whenInvokeSwagger_thenRenderIndexPage() { + String response = this.restTemplate.getForObject("http://localhost:" + port + "/swagger-ui/index.html", String.class); + + assertNotNull(response); + assertTrue(response.contains("Swagger UI")); + assertTrue(response.contains("
")); + } + + @Test + void whenInvokeOpenApi_thenCheckHeaders() { + ResponseEntity response = this.restTemplate.getForEntity("http://localhost:" + port + "/v3/api-docs", String.class); + + assertNotNull(response); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertNotNull(response.getHeaders().get("Content-Type")); + assertEquals(1, response.getHeaders().get("Content-Type").size()); + assertEquals("application/json", response.getHeaders().get("Content-Type").get(0)); + } + + @Test + void whenInvokeOpenApi_thenVerifyOpenApiDoc() { + ResponseEntity response = this.restTemplate.getForEntity("http://localhost:" + port + "/v3/api-docs", String.class); + + assertNotNull(response); + assertNotNull(response.getBody()); + assertTrue(response.getBody().contains("\"openapi\":")); + assertTrue(response.getBody().contains("Foos API")); + assertTrue(response.getBody().contains("\"post\"")); + } + + @Test + void whenInvokeOpenApi_thenCheckSecurityConfig() { + ResponseEntity response = this.restTemplate.getForEntity("http://localhost:" + port + "/v3/api-docs", String.class); + + assertNotNull(response); + assertNotNull(response.getBody()); + assertTrue(response.getBody().contains("\"securitySchemes\"")); + assertTrue(response.getBody().contains("\"type\":\"http\"")); + assertTrue(response.getBody().contains("\"scheme\":\"basic\"")); + } +} diff --git a/spring-security-modules/spring-security-web-springdoc/src/test/java/com/baeldung/formlogin/OpenAPIIntegrationTest.java b/spring-security-modules/spring-security-web-springdoc/src/test/java/com/baeldung/formlogin/OpenAPIIntegrationTest.java new file mode 100644 index 0000000000..5d942f2126 --- /dev/null +++ b/spring-security-modules/spring-security-web-springdoc/src/test/java/com/baeldung/formlogin/OpenAPIIntegrationTest.java @@ -0,0 +1,52 @@ +package com.baeldung.formlogin; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class OpenAPIIntegrationTest { + + @LocalServerPort + private int port; + + @Autowired + private TestRestTemplate restTemplate; + + @Test + void whenInvokeSwagger_thenRenderIndexPage() { + String response = this.restTemplate.getForObject("http://localhost:" + port + "/swagger-ui/index.html", String.class); + + assertNotNull(response); + assertTrue(response.contains("Swagger UI")); + assertTrue(response.contains("
")); + } + + @Test + void whenInvokeOpenApi_thenCheckHeaders() { + ResponseEntity response = this.restTemplate.getForEntity("http://localhost:" + port + "/v3/api-docs", String.class); + + assertNotNull(response); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertNotNull(response.getHeaders().get("Content-Type")); + assertEquals(1, response.getHeaders().get("Content-Type").size()); + assertEquals("application/json", response.getHeaders().get("Content-Type").get(0)); + } + + @Test + void whenInvokeOpenApi_thenVerifyOpenApiDoc() { + ResponseEntity response = this.restTemplate.getForEntity("http://localhost:" + port + "/v3/api-docs", String.class); + + assertNotNull(response); + assertNotNull(response.getBody()); + assertTrue(response.getBody().contains("\"openapi\":")); + assertTrue(response.getBody().contains("Foos API")); + assertTrue(response.getBody().contains("\"post\"")); + } +} From 5c1c08e7136afea00cf7e7ea3d827dd5b9849c85 Mon Sep 17 00:00:00 2001 From: Avin Buricha Date: Sun, 11 Dec 2022 08:30:01 +0530 Subject: [PATCH 120/592] BAEL-5982 | Article code (#13097) * BAEL-5982 | Article code * Renaming unit test methods * Rearranging module list in alphabetic order --- security-modules/jwt/.gitignore | 3 + security-modules/jwt/pom.xml | 28 ++++ .../baeldung/jwt/auth0/Auth0JsonWebToken.java | 99 ++++++++++++++ .../jwt/auth0/Auth0JsonWebTokenUnitTest.java | 127 ++++++++++++++++++ security-modules/pom.xml | 3 +- 5 files changed, 259 insertions(+), 1 deletion(-) create mode 100644 security-modules/jwt/.gitignore create mode 100644 security-modules/jwt/pom.xml create mode 100644 security-modules/jwt/src/main/java/com/baeldung/jwt/auth0/Auth0JsonWebToken.java create mode 100644 security-modules/jwt/src/test/java/com/baeldung/jwt/auth0/Auth0JsonWebTokenUnitTest.java diff --git a/security-modules/jwt/.gitignore b/security-modules/jwt/.gitignore new file mode 100644 index 0000000000..f83e8cf07c --- /dev/null +++ b/security-modules/jwt/.gitignore @@ -0,0 +1,3 @@ +.idea +target +*.iml diff --git a/security-modules/jwt/pom.xml b/security-modules/jwt/pom.xml new file mode 100644 index 0000000000..5ec563dcfa --- /dev/null +++ b/security-modules/jwt/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + jwt + jwt + jar + + + com.baeldung + security-modules + 1.0.0-SNAPSHOT + + + + + com.auth0 + java-jwt + ${auth0-jwt.version} + + + + + 4.2.1 + + + \ No newline at end of file diff --git a/security-modules/jwt/src/main/java/com/baeldung/jwt/auth0/Auth0JsonWebToken.java b/security-modules/jwt/src/main/java/com/baeldung/jwt/auth0/Auth0JsonWebToken.java new file mode 100644 index 0000000000..0d5e7a4839 --- /dev/null +++ b/security-modules/jwt/src/main/java/com/baeldung/jwt/auth0/Auth0JsonWebToken.java @@ -0,0 +1,99 @@ +package com.baeldung.jwt.auth0; + +import java.util.Date; +import java.util.UUID; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.exceptions.JWTVerificationException; +import com.auth0.jwt.interfaces.Claim; +import com.auth0.jwt.interfaces.DecodedJWT; + +public class Auth0JsonWebToken { + + private static final String SECRET = "baeldung"; + private static final String ISSUER = "Baeldung"; + private static final String SUBJECT = "Baeldung Details"; + private static final String DATA_CLAIM = "userId"; + private static final String DATA = "1234"; + private static final long TOKEN_VALIDITY_IN_MILLIS = 5000L; + + private static Algorithm algorithm; + private static JWTVerifier verifier; + + public static void initialize() { + algorithm = Algorithm.HMAC256(SECRET); + + verifier = JWT.require(algorithm) + .withIssuer(ISSUER) + .build(); + } + + private static String createJWT() { + String jwtToken = JWT.create() + .withIssuer(ISSUER) + .withSubject(SUBJECT) + .withClaim(DATA_CLAIM, DATA) + .withIssuedAt(new Date()) + .withExpiresAt(new Date(System.currentTimeMillis() + TOKEN_VALIDITY_IN_MILLIS)) + .withJWTId(UUID.randomUUID() + .toString()) + .withNotBefore(new Date(System.currentTimeMillis() + 1000L)) + .sign(algorithm); + + return jwtToken; + } + + private static DecodedJWT verifyJWT(String jwtToken) { + try { + DecodedJWT decodedJWT = verifier.verify(jwtToken); + return decodedJWT; + } catch (JWTVerificationException e) { + System.out.println(e.getMessage()); + } + return null; + } + + private static boolean isJWTExpired(DecodedJWT decodedJWT) { + Date expiresAt = decodedJWT.getExpiresAt(); + return expiresAt.getTime() < System.currentTimeMillis(); + } + + private static String getClaim(DecodedJWT decodedJWT, String claimName) { + Claim claim = decodedJWT.getClaim(claimName); + return claim != null ? claim.asString() : null; + } + + public static void main(String args[]) throws InterruptedException { + + initialize(); + + String jwtToken = createJWT(); + System.out.println("Created JWT : " + jwtToken); + + DecodedJWT decodedJWT = verifyJWT(jwtToken); + if (decodedJWT == null) { + System.out.println("JWT Verification Failed"); + } + + Thread.sleep(1000L); + + decodedJWT = verifyJWT(jwtToken); + if (decodedJWT != null) { + System.out.println("Token Issued At : " + decodedJWT.getIssuedAt()); + System.out.println("Token Expires At : " + decodedJWT.getExpiresAt()); + System.out.println("Subject : " + decodedJWT.getSubject()); + System.out.println("Data : " + getClaim(decodedJWT, DATA_CLAIM)); + System.out.println("Header : " + decodedJWT.getHeader()); + System.out.println("Payload : " + decodedJWT.getPayload()); + System.out.println("Signature : " + decodedJWT.getSignature()); + System.out.println("Algorithm : " + decodedJWT.getAlgorithm()); + System.out.println("JWT Id : " + decodedJWT.getId()); + + Boolean isExpired = isJWTExpired(decodedJWT); + System.out.println("Is Expired : " + isExpired); + } + } + +} diff --git a/security-modules/jwt/src/test/java/com/baeldung/jwt/auth0/Auth0JsonWebTokenUnitTest.java b/security-modules/jwt/src/test/java/com/baeldung/jwt/auth0/Auth0JsonWebTokenUnitTest.java new file mode 100644 index 0000000000..a9c3b4185d --- /dev/null +++ b/security-modules/jwt/src/test/java/com/baeldung/jwt/auth0/Auth0JsonWebTokenUnitTest.java @@ -0,0 +1,127 @@ +package com.baeldung.jwt.auth0; + +import static org.junit.jupiter.api.Assertions.assertEquals; +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 java.util.Date; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.exceptions.IncorrectClaimException; +import com.auth0.jwt.exceptions.SignatureVerificationException; +import com.auth0.jwt.exceptions.TokenExpiredException; +import com.auth0.jwt.interfaces.Claim; +import com.auth0.jwt.interfaces.DecodedJWT; + +public class Auth0JsonWebTokenUnitTest { + + private static final String SECRET = "baeldung"; + private static final String SECRET_NEW = "baeldung.com"; + private static final String ISSUER = "Baeldung"; + private static final String DATA_CLAIM = "userId"; + private static final String DATA = "1234"; + + private static Algorithm algorithm; + private static Algorithm algorithmWithDifferentSecret; + private static JWTVerifier verifier; + private static String jwtToken; + + @BeforeAll + public static void setUp() { + algorithm = Algorithm.HMAC256(SECRET); + + algorithmWithDifferentSecret = Algorithm.HMAC256(SECRET_NEW); + + verifier = JWT.require(algorithm) + .withIssuer(ISSUER) + .build(); + } + + private static boolean isJWTExpired(DecodedJWT decodedJWT) { + Date expiresAt = decodedJWT.getExpiresAt(); + return expiresAt.getTime() < System.currentTimeMillis(); + } + + private static DecodedJWT verifyJWT(String jwtToken) { + DecodedJWT decodedJWT = verifier.verify(jwtToken); + return decodedJWT; + } + + @Test + public void givenJWT_whenNotExpired_thenCheckingIfNotExpired() { + + jwtToken = JWT.create() + .withIssuer(ISSUER) + .withClaim(DATA_CLAIM, DATA) + .withExpiresAt(new Date(System.currentTimeMillis() + 1000L)) + .sign(algorithm); + + DecodedJWT decodedJWT = verifyJWT(jwtToken); + assertNotNull(decodedJWT); + assertFalse(isJWTExpired(decodedJWT)); + } + + @Test + public void givenJWT_whenExpired_thenCheckingIfExpired() { + + jwtToken = JWT.create() + .withIssuer(ISSUER) + .withClaim(DATA_CLAIM, DATA) + .withExpiresAt(new Date(System.currentTimeMillis() - 1000L)) + .sign(algorithm); + + assertThrows(TokenExpiredException.class, () -> { + verifyJWT(jwtToken); + }); + } + + @Test + public void givenJWT_whenCreatedWithCustomClaim_thenCheckingForCustomClaim() { + + jwtToken = JWT.create() + .withIssuer(ISSUER) + .withClaim(DATA_CLAIM, DATA) + .withExpiresAt(new Date(System.currentTimeMillis() + 1000L)) + .sign(algorithm); + + DecodedJWT decodedJWT = verifyJWT(jwtToken); + assertNotNull(decodedJWT); + + Claim claim = decodedJWT.getClaim(DATA_CLAIM); + assertEquals(DATA, claim.asString()); + } + + @Test + public void givenJWT_whenCreatedWithNotBefore_thenThrowException() { + + jwtToken = JWT.create() + .withIssuer(ISSUER) + .withClaim(DATA_CLAIM, DATA) + .withNotBefore(new Date(System.currentTimeMillis() + 1000L)) + .sign(algorithm); + + assertThrows(IncorrectClaimException.class, () -> { + verifyJWT(jwtToken); + }); + } + + @Test + public void givenJWT_whenVerifyingUsingDifferentSecret_thenThrowException() { + + jwtToken = JWT.create() + .withIssuer(ISSUER) + .withClaim(DATA_CLAIM, DATA) + .withExpiresAt(new Date(System.currentTimeMillis() + 1000L)) + .sign(algorithmWithDifferentSecret); + + assertThrows(SignatureVerificationException.class, () -> { + verifyJWT(jwtToken); + }); + } +} diff --git a/security-modules/pom.xml b/security-modules/pom.xml index 480ee0819e..1ed081a273 100644 --- a/security-modules/pom.xml +++ b/security-modules/pom.xml @@ -20,8 +20,9 @@ jee-7-security jjwt + jwt oauth2-framework-impl - sql-injection-samples + sql-injection-samples \ No newline at end of file From 795200d2a7e5c2ae97ccbf68fc7f3fc9cbafeba9 Mon Sep 17 00:00:00 2001 From: TomVerkon Date: Sun, 11 Dec 2022 00:13:05 -0500 Subject: [PATCH 121/592] Master java 15108 (#13144) * Added server.servlet.register-default-servlet=true to application.properties file to eliminate java.lang.IllegalStateException: Unable to locate the default servlet for serving static content. error * Changed mysql-connector name space to eliminate warning message The artifact mysql:mysql-connector-java:jar:8.0.31 has been relocated to com.mysql:mysql-connector-j:jar:8.0.31 * Fixed test givenDisabledSecurityExpression_whenGetFooByName_thenError() Removed second assert, because "java.lang.RuntimeException: method hasAuthority() not allowed" is seen in console but is not passed to testing. Test returns "Internal Server Error" * Removed location changes I previously made to mysql-connector-java in the pom Co-authored-by: tverk --- spring-security-modules/spring-security-web-boot-1/pom.xml | 3 ++- .../src/main/resources/application.properties | 1 + .../test/java/com/baeldung/roles/web/ApplicationLiveTest.java | 1 - 3 files changed, 3 insertions(+), 2 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 fa0fd567fe..d9f797cb6c 100644 --- a/spring-security-modules/spring-security-web-boot-1/pom.xml +++ b/spring-security-modules/spring-security-web-boot-1/pom.xml @@ -217,7 +217,8 @@ com.baeldung.roles.custom.Application - + 1.1.2 diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/resources/application.properties b/spring-security-modules/spring-security-web-boot-1/src/main/resources/application.properties index 3cf12afeb9..cc1e92d43a 100644 --- a/spring-security-modules/spring-security-web-boot-1/src/main/resources/application.properties +++ b/spring-security-modules/spring-security-web-boot-1/src/main/resources/application.properties @@ -1 +1,2 @@ server.port=8082 +server.servlet.register-default-servlet=true diff --git a/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/roles/web/ApplicationLiveTest.java b/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/roles/web/ApplicationLiveTest.java index 56f87e8aee..ea848468b4 100644 --- a/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/roles/web/ApplicationLiveTest.java +++ b/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/roles/web/ApplicationLiveTest.java @@ -53,7 +53,6 @@ public class ApplicationLiveTest { public void givenDisabledSecurityExpression_whenGetFooByName_thenError() { final Response response = givenAuth("john", "123").get("http://localhost:8082/foos?name=sample"); assertEquals(500, response.getStatusCode()); - assertTrue(response.asString().contains("method hasAuthority() not allowed")); } private RequestSpecification givenAuth(String username, String password) { From 5eddf177a522f425a74238a3d2481e92e1665ac1 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Sun, 11 Dec 2022 05:16:29 +0000 Subject: [PATCH 122/592] [JAVA-16680] Update Spring version to 5.3.24 (#13142) * [JAVA-16680] Update Spring version to 5.3.24 * [JAVA-16680] Fix parent module path --- di-modules/cdi/pom.xml | 2 +- parent-spring-5/pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/di-modules/cdi/pom.xml b/di-modules/cdi/pom.xml index 6b2382ba0e..647192bed2 100644 --- a/di-modules/cdi/pom.xml +++ b/di-modules/cdi/pom.xml @@ -10,7 +10,7 @@ com.baeldung parent-spring-5 0.0.1-SNAPSHOT - ../parent-spring-5 + ../../parent-spring-5
diff --git a/parent-spring-5/pom.xml b/parent-spring-5/pom.xml index 3525522ea7..80a8c7d77d 100644 --- a/parent-spring-5/pom.xml +++ b/parent-spring-5/pom.xml @@ -24,9 +24,9 @@ - 5.3.23 + 5.3.24 5.7.3 1.5.10.RELEASE - \ No newline at end of file + From 6fb90f67ebeda8eef4b294b9be11a604f0f5a8ba Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 11 Dec 2022 12:14:57 +0530 Subject: [PATCH 123/592] JAVA-15689 Update spring-activiti module to remove usage of deprecated WebSecurityConfigurerAdapter (#13141) --- .../activiti/security/withspring/SecurityConfig.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/spring-activiti/src/main/java/com/baeldung/activiti/security/withspring/SecurityConfig.java b/spring-activiti/src/main/java/com/baeldung/activiti/security/withspring/SecurityConfig.java index b0c74371c7..8dc3eee05e 100644 --- a/spring-activiti/src/main/java/com/baeldung/activiti/security/withspring/SecurityConfig.java +++ b/spring-activiti/src/main/java/com/baeldung/activiti/security/withspring/SecurityConfig.java @@ -3,16 +3,17 @@ package com.baeldung.activiti.security.withspring; 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.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; @Configuration -public class SecurityConfig extends WebSecurityConfigurerAdapter { +public class SecurityConfig { - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.antMatcher("/**") .authorizeRequests() .antMatchers("/protected-process*") @@ -29,6 +30,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .disable() .logout() .logoutSuccessUrl("/login"); + return http.build(); } @Bean From 4fc53df1185fe9d46f0d0d137a94a7aacc7ab774 Mon Sep 17 00:00:00 2001 From: Adrian Bob Date: Sun, 11 Dec 2022 19:23:11 +0200 Subject: [PATCH 124/592] Updated README (#13152) --- .../spring-security-web-springdoc/README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/spring-security-modules/spring-security-web-springdoc/README.md b/spring-security-modules/spring-security-web-springdoc/README.md index 90a82d1681..2f1ec59f6e 100644 --- a/spring-security-modules/spring-security-web-springdoc/README.md +++ b/spring-security-modules/spring-security-web-springdoc/README.md @@ -4,9 +4,6 @@ This module contains articles about Springdoc with Spring Security ### Relevant Articles: -- [Documenting a Spring REST API Using OpenAPI 3.0](https://www.baeldung.com/spring-rest-openapi-documentation) -- [Configure JWT Authentication for OpenAPI](https://www.baeldung.com/openapi-jwt-authentication) - ### Running This Project: To run the projects use the commands: From 29d97308f6eb48116cd39e5f13bc4f8b292587f0 Mon Sep 17 00:00:00 2001 From: apeterlic Date: Mon, 12 Dec 2022 08:35:27 +0100 Subject: [PATCH 125/592] Add Type Parameter vs Wildcard in Java Generics (#12988) * Add Type Parameter vs Wildcard in Java Generics * Fix Logger variable and code format * Update Cat class * Add missing import * Add warning comment --- .../java/com/baeldung/generics/Animal.java | 22 ++++++++ .../com/baeldung/generics/AnimalDemo.java | 26 +++++++++ .../main/java/com/baeldung/generics/Cat.java | 41 ++++++++++++++ .../baeldung/generics/CollectionUtils.java | 56 +++++++++++++++++++ .../generics/CollectionUtilsDemo.java | 48 ++++++++++++++++ .../main/java/com/baeldung/generics/Dog.java | 14 +++++ 6 files changed, 207 insertions(+) create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Animal.java create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/AnimalDemo.java create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Cat.java create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/CollectionUtils.java create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/CollectionUtilsDemo.java create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Dog.java diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Animal.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Animal.java new file mode 100644 index 0000000000..fd247a4eff --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Animal.java @@ -0,0 +1,22 @@ +package com.baeldung.generics; + +abstract class Animal { + + protected final String type; + protected final String name; + + protected Animal(String type, String name) { + this.type = type; + this.name = name; + } + + abstract String makeSound(); + + public String getType() { + return type; + } + + public String getName() { + return name; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/AnimalDemo.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/AnimalDemo.java new file mode 100644 index 0000000000..3d33180fa3 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/AnimalDemo.java @@ -0,0 +1,26 @@ +package com.baeldung.generics; + +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class AnimalDemo { + + private static final Logger logger = LoggerFactory.getLogger(AnimalDemo.class); + + public static void main(String[] args) { + List cats = new ArrayList<>(); + cats.add(new Cat("Persian", "Bono")); + cats.add(new Cat("Egyptian", "Lulu")); + cats.add(new Cat("Siamese", "Ra")); + + order(cats); + logger.info("Ordered cats: {}", cats); + } + + public static > void order(List list) { + list.sort(Comparable::compareTo); + } +} diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Cat.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Cat.java new file mode 100644 index 0000000000..bb6f9ba8f0 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Cat.java @@ -0,0 +1,41 @@ +package com.baeldung.generics; + +import java.util.Objects; + +class Cat extends Animal implements Comparable { + public Cat(String type, String name) { + super(type, name); + } + + @Override + public String makeSound() { + return "Meow"; + } + + /** + * Warning: Inconsistent with the equals method. + */ + @Override + public int compareTo(Cat cat) { + return this.getName().length() - cat.getName().length(); + } + + @Override + public String toString() { + return "Cat{" + "type='" + type + '\'' + ", name='" + name + '\'' + '}'; + } + + @Override + public int hashCode() { + return Objects.hash(type, name); + } + + @Override + public boolean equals(Object o) { + if(o == this) return true; + if(!(o instanceof Cat)) return false; + Cat cat = (Cat) o; + return type.equals(cat.type) && name.equals(cat.name); + } + +} diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/CollectionUtils.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/CollectionUtils.java new file mode 100644 index 0000000000..6d84f5199b --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/CollectionUtils.java @@ -0,0 +1,56 @@ +package com.baeldung.generics; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class CollectionUtils { + + private CollectionUtils() { + } + + public static void print(T item) { + System.out.println(item); + } + + public static void swap(List list, int src, int des) { + swapHelper(list, src, des); + } + + private static void swapHelper(List list, int src, int des) { + list.set(src, list.set(des, list.get(src))); + } + + public static List mergeTypeParameter(List listOne, List listTwo) { + return Stream.concat(listOne.stream(), listTwo.stream()) + .collect(Collectors.toList()); + } + + public static List mergeWildcard(List listOne, List listTwo) { + return Stream.concat(listOne.stream(), listTwo.stream()) + .collect(Collectors.toList()); + } + + public static long sum(List numbers) { + return numbers.stream() + .mapToLong(Number::longValue) + .sum(); + } + + public static long sumTypeParameter(List numbers) { + return numbers.stream() + .mapToLong(Number::longValue) + .sum(); + } + + public static long sumWildcard(List numbers) { + return numbers.stream() + .mapToLong(Number::longValue) + .sum(); + } + + public static void addNumber(List list, Integer number) { + list.add(number); + } + +} diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/CollectionUtilsDemo.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/CollectionUtilsDemo.java new file mode 100644 index 0000000000..012d9a3110 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/CollectionUtilsDemo.java @@ -0,0 +1,48 @@ +package com.baeldung.generics; + +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class CollectionUtilsDemo { + + private static final Logger logger = LoggerFactory.getLogger(CollectionUtilsDemo.class); + + public static void main(String[] args) { + CollectionUtils.print("Baeldung"); + + List numbers1 = new ArrayList<>(); + numbers1.add(5); + numbers1.add(10L); + + List numbers2 = new ArrayList<>(); + numbers2.add(15f); + numbers2.add(20.0); + + List numbersMerged = CollectionUtils.mergeTypeParameter(numbers1, numbers2); + logger.info("Merged numbers: {}", numbersMerged); + + List numbers = new ArrayList<>(); + numbers.add(5); + numbers.add(10L); + numbers.add(15f); + numbers.add(20.0); + + logger.info("Sum: {}", CollectionUtils.sum(numbers)); + logger.info("Sum (wildcard): {}", CollectionUtils.sumWildcard(numbers)); + logger.info("Sum (type parameter): {}", CollectionUtils.sumTypeParameter(numbers)); + + List integers = new ArrayList<>(); + integers.add(5); + logger.info("Sum integers (wildcard): {}", CollectionUtils.sumWildcard(integers)); + + CollectionUtils.addNumber(numbers, 4); + CollectionUtils.addNumber(integers, 5); + + logger.info("Before swap: {}", numbers); + CollectionUtils.swap(numbers, 0, 1); + logger.info("After swap: {}", numbers); + } +} diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Dog.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Dog.java new file mode 100644 index 0000000000..cec6f39422 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/generics/Dog.java @@ -0,0 +1,14 @@ +package com.baeldung.generics; + +public class Dog extends Animal { + + public Dog(String type, String name) { + super(type, name); + } + + @Override + public String makeSound() { + return "Wuf"; + } + +} From a288f8db7e6187b047baba472d71b44edfa42bb1 Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Mon, 12 Dec 2022 08:53:16 +0100 Subject: [PATCH 126/592] BAEL-5844: Convert Anonymous Class into Lambda in Java (#13088) --- .../anonymousclass/EmailSenderService.java | 10 ++++++ .../com/baeldung/anonymousclass/Sender.java | 7 ++++ .../anonymousclass/SenderService.java | 7 ++++ .../anonymousclass/SmsSenderService.java | 10 ++++++ ...AnonymousClassToLambdaIntegrationTest.java | 34 +++++++++++++++++++ 5 files changed, 68 insertions(+) create mode 100644 core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/EmailSenderService.java create mode 100644 core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/Sender.java create mode 100644 core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/SenderService.java create mode 100644 core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/SmsSenderService.java create mode 100644 core-java-modules/core-java-lambdas/src/test/java/com/baeldung/anonymousclass/AnonymousClassToLambdaIntegrationTest.java diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/EmailSenderService.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/EmailSenderService.java new file mode 100644 index 0000000000..f0c41b1cc9 --- /dev/null +++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/EmailSenderService.java @@ -0,0 +1,10 @@ +package com.baeldung.anonymousclass; + +public class EmailSenderService implements SenderService { + + @Override + public String callSender(Sender sender) { + return sender.send("Email Notification"); + } + +} diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/Sender.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/Sender.java new file mode 100644 index 0000000000..9e59960c14 --- /dev/null +++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/Sender.java @@ -0,0 +1,7 @@ +package com.baeldung.anonymousclass; + +public interface Sender { + + String send(final String message); + +} diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/SenderService.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/SenderService.java new file mode 100644 index 0000000000..cbb0977f89 --- /dev/null +++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/SenderService.java @@ -0,0 +1,7 @@ +package com.baeldung.anonymousclass; + +public interface SenderService { + + String callSender(Sender sender); + +} diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/SmsSenderService.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/SmsSenderService.java new file mode 100644 index 0000000000..9c84664ec4 --- /dev/null +++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/anonymousclass/SmsSenderService.java @@ -0,0 +1,10 @@ +package com.baeldung.anonymousclass; + +public class SmsSenderService implements SenderService { + + @Override + public String callSender(Sender sender) { + return sender.send("SMS Notification"); + } + +} diff --git a/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/anonymousclass/AnonymousClassToLambdaIntegrationTest.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/anonymousclass/AnonymousClassToLambdaIntegrationTest.java new file mode 100644 index 0000000000..b329e003f4 --- /dev/null +++ b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/anonymousclass/AnonymousClassToLambdaIntegrationTest.java @@ -0,0 +1,34 @@ +package com.baeldung.anonymousclass; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class AnonymousClassToLambdaIntegrationTest { + + @Test + public void whenPassingAnonymousClass_thenSuccess() { + final SenderService emailSenderService = new EmailSenderService(); + + final String emailNotif = emailSenderService.callSender(new Sender() { + @Override + public String send(String message) { + return message; + } + }); + + assertEquals(emailNotif, "Email Notification"); + } + + @Test + public void whenPassingLambdaExpression_thenSuccess() { + final SenderService smsSenderService = new SmsSenderService(); + + final String smsNotif = smsSenderService.callSender((String message) -> { + return message; + }); + + assertEquals(smsNotif, "SMS Notification"); + } + +} From 9c8d1d127d674b68c7718ab4dac808817a4d1a24 Mon Sep 17 00:00:00 2001 From: vunamtien Date: Mon, 12 Dec 2022 17:24:54 +0700 Subject: [PATCH 127/592] BAEL-5919-java-print-pascal-triangle (#13155) * pascal triangle * pascal triangle Co-authored-by: tienvn4 --- .../math/pascaltriangle/PascalTriangle.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/pascaltriangle/PascalTriangle.java diff --git a/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/pascaltriangle/PascalTriangle.java b/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/pascaltriangle/PascalTriangle.java new file mode 100644 index 0000000000..ae47a48375 --- /dev/null +++ b/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/pascaltriangle/PascalTriangle.java @@ -0,0 +1,48 @@ +package com.baeldung.math.pascaltriangle; + +public class PascalTriangle { + + public static int factorial(int i) { + if (i == 0) { + return 1; + } + return i * factorial(i - 1); + } + + private static void printUseRecursion(int n) { + for (int i = 0; i <= n; i++) { + for (int j = 0; j <= n - i; j++) { + System.out.print(" "); + } + + for (int k = 0; k <= i; k++) { + System.out.print(" " + factorial(i) / (factorial(i - k) * factorial(k))); + } + + System.out.println(); + } + } + +public static void printUseBinomialExpansion(int n) { + for (int line = 1; line <= n; line++) { + for (int j = 0; j <= n - line; j++) { + System.out.print(" "); + } + + int k = 1; + for (int i = 1; i <= line; i++) { + System.out.print(k + " "); + k = k * (line - i) / i; + } + + System.out.println(); + } +} + + public static void main(String[] args) { + int n = 5; + printUseRecursion(n); +// printUseBinomialExpansion(n); + } + +} From abd9f8a38be0112dea4136a8ce414eddbb55ef84 Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Tue, 13 Dec 2022 02:56:43 +0000 Subject: [PATCH 128/592] BAEL-5979 Instanceof Alternatives (#13082) * simple-thymeleaf-expression * expression-update * instanceof * instanceof * instanceof * update * Update pom.xml * Update pom.xml * instanceof * update * instanceofnew * instanceofnew * instanceofnew * instanceofnew * instanceofnew * instanceofnew * update * pom * Revert "pom" This reverts commit c5075e6ba7e1e91159864d57bcbc18dd90314e16. * Revert "Update pom.xml" This reverts commit 7dd02df1aea201572fb64d8bc4a2990a94b6b4c0. * Revert "Revert "Update pom.xml"" This reverts commit a02a1f67d16eb0bc781cc588af48f36fcc93d601. * Update pom.xml * Revert "Update pom.xml" This reverts commit 7dd02df1aea201572fb64d8bc4a2990a94b6b4c0. * Update pom.xml * JAVA-8436: Remove AssertJ depenendency from the child modules - part 4 * Update pom.xml * JAVA-8436: Remove AssertJ depenendency from the child modules - part 4 * BAEL-5979 Instanceof Alternatives --- core-java-modules/core-java-16/pom.xml | 2 +- .../enumallt/DinosaurEnum.java | 19 ++++++++++ .../model/Anatotitan.java | 15 ++++++++ .../model/Dinosaur.java | 9 +++++ .../model/Euraptor.java | 15 ++++++++ .../visitorspattern/Anatotitan.java | 14 ++++++++ .../visitorspattern/Dino.java | 7 ++++ .../visitorspattern/DinoVisitorImpl.java | 15 ++++++++ .../visitorspattern/Euraptor.java | 14 ++++++++ .../visitorspattern/Visitor.java | 9 +++++ .../EnumUnitTest.java | 26 ++++++++++++++ .../ExampleSetupUnitTest.java | 35 ++++++++++++++++++ .../GetClassUnitTest.java | 36 +++++++++++++++++++ .../PolymorphismUnitTest.java | 27 ++++++++++++++ .../VisitorsPatternUnitTest.java | 29 +++++++++++++++ .../core-java-lang-operators-2/pom.xml | 2 +- 16 files changed, 272 insertions(+), 2 deletions(-) create mode 100644 core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/enumallt/DinosaurEnum.java create mode 100644 core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/model/Anatotitan.java create mode 100644 core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/model/Dinosaur.java create mode 100644 core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/model/Euraptor.java create mode 100644 core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/Anatotitan.java create mode 100644 core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/Dino.java create mode 100644 core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/DinoVisitorImpl.java create mode 100644 core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/Euraptor.java create mode 100644 core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/Visitor.java create mode 100644 core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/EnumUnitTest.java create mode 100644 core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/ExampleSetupUnitTest.java create mode 100644 core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/GetClassUnitTest.java create mode 100644 core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/PolymorphismUnitTest.java create mode 100644 core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/VisitorsPatternUnitTest.java diff --git a/core-java-modules/core-java-16/pom.xml b/core-java-modules/core-java-16/pom.xml index 4adc3ee6d1..a2c0d4855b 100644 --- a/core-java-modules/core-java-16/pom.xml +++ b/core-java-modules/core-java-16/pom.xml @@ -63,4 +63,4 @@ 3.0.0-M5 - \ No newline at end of file + diff --git a/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/enumallt/DinosaurEnum.java b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/enumallt/DinosaurEnum.java new file mode 100644 index 0000000000..a50f79947c --- /dev/null +++ b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/enumallt/DinosaurEnum.java @@ -0,0 +1,19 @@ +package com.baeldung.instanceofalternative.enumallt; + +public enum DinosaurEnum { + Anatotitan { + @Override + public String move() { + return "running"; + } + }, + Euraptor { + @Override + public String move() { + return "flying"; + } + }; + + public abstract String move(); + +} diff --git a/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/model/Anatotitan.java b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/model/Anatotitan.java new file mode 100644 index 0000000000..ce59b58ad7 --- /dev/null +++ b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/model/Anatotitan.java @@ -0,0 +1,15 @@ +package com.baeldung.instanceofalternative.model; + +public class Anatotitan extends Dinosaur { + // polymorphism + @Override + public String move() { + return "running"; + } + + // non-polymorphism + public String run() { + return "running"; + } + +} diff --git a/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/model/Dinosaur.java b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/model/Dinosaur.java new file mode 100644 index 0000000000..38055054f5 --- /dev/null +++ b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/model/Dinosaur.java @@ -0,0 +1,9 @@ +package com.baeldung.instanceofalternative.model; + +public class Dinosaur { + + public String move() { + return "default movement"; + } + +} diff --git a/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/model/Euraptor.java b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/model/Euraptor.java new file mode 100644 index 0000000000..1de5257a0d --- /dev/null +++ b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/model/Euraptor.java @@ -0,0 +1,15 @@ +package com.baeldung.instanceofalternative.model; + +public class Euraptor extends Dinosaur { + // polymorphism + @Override + public String move() { + return "flying"; + } + + // non-polymorphism + public String flies() { + return "flying"; + } + +} diff --git a/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/Anatotitan.java b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/Anatotitan.java new file mode 100644 index 0000000000..84d93e7350 --- /dev/null +++ b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/Anatotitan.java @@ -0,0 +1,14 @@ +package com.baeldung.instanceofalternative.visitorspattern; + +public class Anatotitan implements Dino { + + String run() { + return "running"; + } + + @Override + public String move(Visitor dinobehave) { + return dinobehave.visit(this); + } + +} diff --git a/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/Dino.java b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/Dino.java new file mode 100644 index 0000000000..ef33baf2a4 --- /dev/null +++ b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/Dino.java @@ -0,0 +1,7 @@ +package com.baeldung.instanceofalternative.visitorspattern; + +public interface Dino { + + String move(Visitor dinoMove); + +} diff --git a/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/DinoVisitorImpl.java b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/DinoVisitorImpl.java new file mode 100644 index 0000000000..6fd71374fa --- /dev/null +++ b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/DinoVisitorImpl.java @@ -0,0 +1,15 @@ +package com.baeldung.instanceofalternative.visitorspattern; + +public class DinoVisitorImpl implements Visitor { + + @Override + public String visit(Anatotitan anatotitan) { + return anatotitan.run(); + } + + @Override + public String visit(Euraptor euraptor) { + return euraptor.flies(); + } + +} diff --git a/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/Euraptor.java b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/Euraptor.java new file mode 100644 index 0000000000..fdce1e6c0b --- /dev/null +++ b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/Euraptor.java @@ -0,0 +1,14 @@ +package com.baeldung.instanceofalternative.visitorspattern; + +public class Euraptor implements Dino { + + String flies() { + return "flying"; + } + + @Override + public String move(Visitor dinobehave) { + return dinobehave.visit(this); + } + +} diff --git a/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/Visitor.java b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/Visitor.java new file mode 100644 index 0000000000..75fada3533 --- /dev/null +++ b/core-java-modules/core-java-16/src/main/java/com/baeldung/instanceof_alternatives/visitorspattern/Visitor.java @@ -0,0 +1,9 @@ +package com.baeldung.instanceofalternative.visitorspattern; + +public interface Visitor { + + String visit(Anatotitan anatotitan); + + String visit(Euraptor euraptor); + +} diff --git a/core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/EnumUnitTest.java b/core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/EnumUnitTest.java new file mode 100644 index 0000000000..73faa2a1ef --- /dev/null +++ b/core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/EnumUnitTest.java @@ -0,0 +1,26 @@ +package com.baeldung.instanceoftest; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.baeldung.instanceofalternative.enumallt.*; + +public class EnumUnitTest { + @Test + public void givenADinosaurSpecie_whenUsingEnum_thenGetMovementOfEuraptor() { + + assertEquals("flying", moveDinosaurUsingEnum(DinosaurEnum.Euraptor)); + } + + @Test + public void givenADinosaurSpecie_whenUsingEnum_thenGetMovementOfAnatotitan() { + assertEquals("running", moveDinosaurUsingEnum(DinosaurEnum.Anatotitan)); + } + + public static String moveDinosaurUsingEnum(DinosaurEnum dinosaurenum) { + return dinosaurenum.move(); + + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/ExampleSetupUnitTest.java b/core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/ExampleSetupUnitTest.java new file mode 100644 index 0000000000..c42f77849b --- /dev/null +++ b/core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/ExampleSetupUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.instanceoftest; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.baeldung.instanceofalternative.model.*; + +public class ExampleSetupUnitTest { + + @Test + public void givenADinosaurSpecie_whenUsingInstancof_thenGetMovementOfAnatotitan() { + + assertEquals("running", moveDinosaurUsingInstanceof(new Anatotitan())); + } + + @Test + public void givenADinosaurSpecie_whenUsingInstanceof_thenGetMovementOfEuraptor() { + assertEquals("flying", moveDinosaurUsingInstanceof(new Euraptor())); + } + + public static String moveDinosaurUsingInstanceof(Dinosaur dinosaur) { + + if (dinosaur instanceof Anatotitan) { + + Anatotitan anatotitan = (Anatotitan) dinosaur; + return anatotitan.run(); + } else if (dinosaur instanceof Euraptor) { + Euraptor euraptor = (Euraptor) dinosaur; + return euraptor.flies(); + } + return ""; + } + +} diff --git a/core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/GetClassUnitTest.java b/core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/GetClassUnitTest.java new file mode 100644 index 0000000000..6a4886c8a3 --- /dev/null +++ b/core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/GetClassUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.instanceoftest; + +import static org.junit.Assert.*; +import org.junit.Test; + +import com.baeldung.instanceofalternative.model.*; + +public class GetClassUnitTest { + + @Test + public void givenADinosaurSpecie_whenUsingGetClass_thenGetMovementOfAnatotitan() { + + assertEquals("running", moveDinosaurUsingGetClass(new Anatotitan())); + } + + @Test + public void givenADinosaurSpecie_whenUsingGetClass_thenGetMovementOfEuraptor() { + assertEquals("flying", moveDinosaurUsingGetClass(new Euraptor())); + } + + public static String moveDinosaurUsingGetClass(Dinosaur dinosaur) { + + if (dinosaur.getClass() + .equals(Anatotitan.class)) { + + Anatotitan anatotitan = (Anatotitan) dinosaur; + return anatotitan.run(); + } else if (dinosaur.getClass() + .equals(Euraptor.class)) { + Euraptor euraptor = (Euraptor) dinosaur; + return euraptor.flies(); + } + return ""; + } + +} diff --git a/core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/PolymorphismUnitTest.java b/core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/PolymorphismUnitTest.java new file mode 100644 index 0000000000..960ed34c82 --- /dev/null +++ b/core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/PolymorphismUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.instanceoftest; + +import static org.junit.Assert.*; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.baeldung.instanceofalternative.model.*; + +public class PolymorphismUnitTest { + + @Test + public void givenADinosaurSpecie_whenUsingPolymorphism_thenGetMovementOfAnatotitan() { + + assertEquals("running", moveDinosaurUsingPolymorphism(new Anatotitan())); + } + + @Test + public void givenADinosaurSpecie_whenUsingPolymorphism_thenGetMovementOfEuraptor() { + assertEquals("flying", moveDinosaurUsingPolymorphism(new Euraptor())); + } + + public static String moveDinosaurUsingPolymorphism(Dinosaur dinosaur) { + return dinosaur.move(); + } + +} diff --git a/core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/VisitorsPatternUnitTest.java b/core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/VisitorsPatternUnitTest.java new file mode 100644 index 0000000000..287f7df798 --- /dev/null +++ b/core-java-modules/core-java-16/src/test/java/com/baeldung/instanceof_alternative_test/VisitorsPatternUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.instanceoftest; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.baeldung.instanceofalternative.visitorspattern.*; + +public class VisitorsPatternUnitTest { + + @Test + public void givenADinosaurSpecie_whenUsingVisitorPattern_thenGetMovementOfAnatotitan() { + + assertEquals("running", moveDinosaurUsingVisitorPattern((Dino) new Anatotitan())); + } + + @Test + public void givenADinosaurSpecie_whenUsingVisitorPattern_thenGetMovementOfEuraptor() { + + assertEquals("flying", moveDinosaurUsingVisitorPattern((Dino) new Euraptor())); + } + + public static String moveDinosaurUsingVisitorPattern(Dino dinosaur) { + Visitor visitor = new DinoVisitorImpl(); + + return dinosaur.move(visitor); + } + +} diff --git a/core-java-modules/core-java-lang-operators-2/pom.xml b/core-java-modules/core-java-lang-operators-2/pom.xml index c36250f1ae..9d925c553a 100644 --- a/core-java-modules/core-java-lang-operators-2/pom.xml +++ b/core-java-modules/core-java-lang-operators-2/pom.xml @@ -38,4 +38,4 @@
- \ No newline at end of file + From 78124d60dd20babab13b1649503eaefdd37091fd Mon Sep 17 00:00:00 2001 From: Carlos Chacin Date: Tue, 13 Dec 2022 16:55:12 -0800 Subject: [PATCH 129/592] [BAEL-5976]: Extract Values using AssertJ in Java (#13105) JIRA: https://jira.baeldung.com/browse/BAEL-5976 --- .../baeldung/assertj/extracting/Address.java | 25 ++++++++++ .../baeldung/assertj/extracting/Person.java | 25 ++++++++++ .../baeldung/assertj/extracting/ZipCode.java | 13 ++++++ .../extracting/AssertJExtractingUnitTest.java | 46 +++++++++++++++++++ 4 files changed, 109 insertions(+) create mode 100644 testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/extracting/Address.java create mode 100644 testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/extracting/Person.java create mode 100644 testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/extracting/ZipCode.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/extracting/AssertJExtractingUnitTest.java diff --git a/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/extracting/Address.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/extracting/Address.java new file mode 100644 index 0000000000..aa6ee85351 --- /dev/null +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/extracting/Address.java @@ -0,0 +1,25 @@ +package com.baeldung.assertj.extracting; + +class Address { + private String street; + private String city; + private ZipCode zipCode; + + Address(String street, String city, ZipCode zipCode) { + this.street = street; + this.city = city; + this.zipCode = zipCode; + } + + public String getStreet() { + return street; + } + + public String getCity() { + return city; + } + + public ZipCode getZipCode() { + return zipCode; + } +} diff --git a/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/extracting/Person.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/extracting/Person.java new file mode 100644 index 0000000000..b8a987cf09 --- /dev/null +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/extracting/Person.java @@ -0,0 +1,25 @@ +package com.baeldung.assertj.extracting; + +class Person { + private String firstName; + private String lastName; + private Address address; + + Person(String firstName, String lastName, Address address) { + this.firstName = firstName; + this.lastName = lastName; + this.address = address; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public Address getAddress() { + return address; + } +} diff --git a/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/extracting/ZipCode.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/extracting/ZipCode.java new file mode 100644 index 0000000000..1523ef7144 --- /dev/null +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/extracting/ZipCode.java @@ -0,0 +1,13 @@ +package com.baeldung.assertj.extracting; + +class ZipCode { + private long zipcode; + + ZipCode(long zipcode) { + this.zipcode = zipcode; + } + + public long getZipcode() { + return zipcode; + } +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/extracting/AssertJExtractingUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/extracting/AssertJExtractingUnitTest.java new file mode 100644 index 0000000000..aae4f8a041 --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/extracting/AssertJExtractingUnitTest.java @@ -0,0 +1,46 @@ +package com.baeldung.assertj.extracting; + +import org.assertj.core.api.InstanceOfAssertFactories; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.as; +import static org.assertj.core.api.Assertions.assertThat; + +class AssertJExtractingUnitTest { + static final List
RESTRICTED_ADDRESSES = new ArrayList<>(); + + @Test + void whenUsingRegularAssertionFlow_thenCorrect() { + + // Given + Person person = new Person("aName", "aLastName", new Address("aStreet", "aCity", new ZipCode(90210))); + + // Then + Address address = person.getAddress(); + assertThat(address).isNotNull() + .isNotIn(RESTRICTED_ADDRESSES); + ZipCode zipCode = address.getZipCode(); + assertThat(zipCode).isNotNull(); + assertThat(zipCode.getZipcode()).isBetween(1000L, 100_000L); + } + + @Test + void whenUsingExtractingAssertionFlow_thenCorrect() { + + // Given + Person person = new Person("aName", "aLastName", new Address("aStreet", "aCity", new ZipCode(90210))); + + // Then + assertThat(person) + .extracting(Person::getAddress) + .isNotNull() + .isNotIn(RESTRICTED_ADDRESSES) + .extracting(Address::getZipCode) + .isNotNull() + .extracting(ZipCode::getZipcode, as(InstanceOfAssertFactories.LONG)) + .isBetween(1_000L, 100_000L); + } +} From 9e7a6d2b3d66d0c435edbbe4495c7745020d447f Mon Sep 17 00:00:00 2001 From: rafyen <59937338+rafyen@users.noreply.github.com> Date: Wed, 14 Dec 2022 14:58:33 +0400 Subject: [PATCH 130/592] Add code for BAEL-5878: Getting a Value in JSONObject (#13157) * BAEL-5878: Getting a Value in JSONObject. Add JsonObjectValueGetter with unit tests * Move json-value-getter under json-2 module * Update packages for the source and unit test files * Rename test class, move employee.json under test/resources Co-authored-by: Rafael Engibaryan --- json-modules/json-2/pom.xml | 11 +++ .../JSONObjectValueGetter.java | 87 +++++++++++++++++++ .../JSONObjectValueGetterUnitTest.java | 69 +++++++++++++++ .../json-2/src/test/resources/employee.json | 30 +++++++ 4 files changed, 197 insertions(+) create mode 100644 json-modules/json-2/src/main/java/com/baeldung/jsonvaluegetter/JSONObjectValueGetter.java create mode 100644 json-modules/json-2/src/test/java/com/baeldung/jsonvaluegetter/JSONObjectValueGetterUnitTest.java create mode 100644 json-modules/json-2/src/test/resources/employee.json diff --git a/json-modules/json-2/pom.xml b/json-modules/json-2/pom.xml index ecffd719c7..ee58ab8b25 100644 --- a/json-modules/json-2/pom.xml +++ b/json-modules/json-2/pom.xml @@ -108,6 +108,17 @@ + + commons-io + commons-io + 2.11.0 + + + org.junit.jupiter + junit-jupiter + RELEASE + test + diff --git a/json-modules/json-2/src/main/java/com/baeldung/jsonvaluegetter/JSONObjectValueGetter.java b/json-modules/json-2/src/main/java/com/baeldung/jsonvaluegetter/JSONObjectValueGetter.java new file mode 100644 index 0000000000..f8d38106fd --- /dev/null +++ b/json-modules/json-2/src/main/java/com/baeldung/jsonvaluegetter/JSONObjectValueGetter.java @@ -0,0 +1,87 @@ +package com.baeldung.jsonvaluegetter; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +public class JSONObjectValueGetter { + + /** + * Get values associated with the provided key in the given JSONObject instance + * + * @param jsonObject JSONObject instance in which to search the key + * @param key Key we're interested in + * + * @return List of values associated with the given key, in the order of appearance. + * If the key is absent, empty list is returned. + */ + public List getValuesInObject(JSONObject jsonObject, String key) { + List accumulatedValues = new ArrayList<>(); + for (String currentKey : jsonObject.keySet()) { + Object value = jsonObject.get(currentKey); + if (currentKey.equals(key)) { + accumulatedValues.add(value.toString()); + } + + if (value instanceof JSONObject) { + accumulatedValues.addAll(getValuesInObject((JSONObject)value, key)); + } else if (value instanceof JSONArray) { + accumulatedValues.addAll(getValuesInArray((JSONArray)value, key)); + } + } + + return accumulatedValues; + } + + /** + * Get values associated with the provided key in the given JSONArray instance + * + * @param jsonArray JSONArray instance in which to search the key + * @param key Key we're interested in + * + * @return List of values associated with the given key, in the order of appearance. + * If the key is absent, empty list is returned. + */ + public List getValuesInArray(JSONArray jsonArray, String key) { + List accumulatedValues = new ArrayList<>(); + for (Object obj : jsonArray) { + if (obj instanceof JSONArray) { + accumulatedValues.addAll(getValuesInArray((JSONArray)obj, key)); + } else if (obj instanceof JSONObject) { + accumulatedValues.addAll(getValuesInObject((JSONObject)obj, key)); + } + } + + return accumulatedValues; + } + + /** + * Among all the values associated with the given key, get the N-th value + * + * @param jsonObject JSONObject instance in which to search the key + * @param key Key we're interested in + * @param N Index of the value to get + * + * @return N-th value associated with the key, or null if the key is absent or + * the number of values associated with the key is less than N + */ + public String getNthValue(JSONObject jsonObject, String key, int N) { + List values = getValuesInObject(jsonObject, key); + return (values.size() >= N) ? values.get(N - 1) : null; + } + + /** + * Count the number of values associated with the given key + * + * @param jsonObject JSONObject instance in which to count the key + * @param key Key we're interested in + * + * @return The number of values associated with the given key + */ + public int getCount(JSONObject jsonObject, String key) { + List values = getValuesInObject(jsonObject, key); + return values.size(); + } +} diff --git a/json-modules/json-2/src/test/java/com/baeldung/jsonvaluegetter/JSONObjectValueGetterUnitTest.java b/json-modules/json-2/src/test/java/com/baeldung/jsonvaluegetter/JSONObjectValueGetterUnitTest.java new file mode 100644 index 0000000000..fc17e700eb --- /dev/null +++ b/json-modules/json-2/src/test/java/com/baeldung/jsonvaluegetter/JSONObjectValueGetterUnitTest.java @@ -0,0 +1,69 @@ +package com.baeldung.jsonvaluegetter; + +import org.apache.commons.io.IOUtils; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +public class JSONObjectValueGetterUnitTest { + + private static JSONObject jsonObject; + private static JSONObjectValueGetter jsonObjectValueGetter = new JSONObjectValueGetter(); + + @BeforeAll + public static void loadJsonContent() throws IOException { + InputStream inputStream = JSONObjectValueGetterUnitTest.class.getClassLoader().getResourceAsStream("employee.json"); + String jsonString = IOUtils.toString(inputStream, "UTF-8"); + jsonObject = new JSONObject(jsonString); + } + + @Test + public void getValueDirectly() { + JSONArray family = jsonObject.getJSONArray("family"); + JSONObject sonObject = family.getJSONObject(1); + JSONObject sonData = sonObject.getJSONObject("son"); + String sonName = sonData.getString("name"); + Assertions.assertEquals(sonName, "Peter"); + } + + @Test + public void getAllAssociatedValuesRecursively() { + List values = jsonObjectValueGetter.getValuesInObject(jsonObject, "son"); + Assertions.assertEquals(values.size(), 1); + + String sonString = values.get(0); + Assertions.assertTrue(sonString.contains("Peter")); + Assertions.assertTrue(sonString.contains("Schoolboy")); + Assertions.assertTrue(sonString.contains("11")); + + values = jsonObjectValueGetter.getValuesInObject(jsonObject, "name"); + Assertions.assertEquals(values.size(), 3); + + Assertions.assertEquals(values.get(0), "Bob"); + Assertions.assertEquals(values.get(1), "Alice"); + Assertions.assertEquals(values.get(2), "Peter"); + } + + @Test + public void getNthValueRecursively() { + Assertions.assertEquals(jsonObjectValueGetter.getNthValue(jsonObject, "name", 1), "Bob"); + Assertions.assertEquals(jsonObjectValueGetter.getNthValue(jsonObject, "name", 2), "Alice"); + Assertions.assertEquals(jsonObjectValueGetter.getNthValue(jsonObject, "name", 3), "Peter"); + Assertions.assertNull(jsonObjectValueGetter.getNthValue(jsonObject, "nonExistingKey", 1)); + } + + @Test + public void getCountRecursively() { + Assertions.assertEquals(jsonObjectValueGetter.getCount(jsonObject, "name"), 3); + Assertions.assertEquals(jsonObjectValueGetter.getCount(jsonObject, "age"), 3); + Assertions.assertEquals(jsonObjectValueGetter.getCount(jsonObject, "occupation"), 1); + Assertions.assertEquals(jsonObjectValueGetter.getCount(jsonObject, "nonExistingKey"), 0); + } +} diff --git a/json-modules/json-2/src/test/resources/employee.json b/json-modules/json-2/src/test/resources/employee.json new file mode 100644 index 0000000000..095190212a --- /dev/null +++ b/json-modules/json-2/src/test/resources/employee.json @@ -0,0 +1,30 @@ +{ + "name" : "Bob", + "profession" : "Software engineer", + "department" : "Research", + "age" : 40, + "family" : [ + { + "wife" : { + "name" : "Alice", + "profession" : "Doctor", + "age" : 38 + } + }, + { + "son" : { + "name" : "Peter", + "occupation" : "Schoolboy", + "age" : 11 + } + } + ], + "performance" : [ + { + "2020" : 4.5 + }, + { + "2021" : 4.8 + } + ] +} \ No newline at end of file From df30c2986f9eb417304da57228ba4b66c64217c7 Mon Sep 17 00:00:00 2001 From: Bogdan Pistol Date: Thu, 15 Dec 2022 06:03:07 +0200 Subject: [PATCH 131/592] https://jira.baeldung.com/browse/BAEL-5871 added sample code used in article (#12986) --- .../ConvertCharToIntUnitTest.java | 47 +++++++++++++++++++ .../ConvertIntToCharUnitTest.java | 36 ++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertinttochar/ConvertCharToIntUnitTest.java create mode 100644 core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertinttochar/ConvertIntToCharUnitTest.java diff --git a/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertinttochar/ConvertCharToIntUnitTest.java b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertinttochar/ConvertCharToIntUnitTest.java new file mode 100644 index 0000000000..75826cd7be --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertinttochar/ConvertCharToIntUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung.convertinttochar; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +public class ConvertCharToIntUnitTest { + + @Test + public void givenAChar_whenUsingGetNumericValue_thenExpectedNumericType() { + //char value + char c = '7'; + // using getNumericValue + int n = Character.getNumericValue(c); + + assertEquals(7, n); + } + + @Test + public void givenAChar_whenSubtracting0_thenExpectedNumericType() { + //char value + char c = '7'; + // subtract '0' from the char + int n = c - '0'; + + assertEquals(7, n); + } + + @Test + public void givenAChar_whenUsingParseInt_thenExpectedNumericType() { + //char value + char c = '7'; + // using parseInt + int n = Integer.parseInt(String.valueOf(c)); + + assertEquals(7, n); + } + + @Test + public void givenAChar_whenCastingFromCharToInt_thenExpectedUnicodeRepresentation() { + //char value + char c = '7'; + //cast to int + assertEquals(55, (int) c); + } + +} diff --git a/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertinttochar/ConvertIntToCharUnitTest.java b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertinttochar/ConvertIntToCharUnitTest.java new file mode 100644 index 0000000000..276bcbc55b --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertinttochar/ConvertIntToCharUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.convertinttochar; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +public class ConvertIntToCharUnitTest { + + @Test + public void givenAnInt_whenAdding0_thenExpectedCharType() { + int num = 7; + //add '0' to convert int to char + char c = (char) ('0' + num); + + assertEquals('7', c); + } + + @Test + public void givenAnInt_whenUsingForDigit_thenExpectedCharType() { + int num = 7; + // Convert using forDigit() method + char c = Character.forDigit(num, 10); + + assertEquals('7', c); + } + + @Test + public void givenAnInt_whenUsingToString_thenExpectedCharType() { + int num = 7; + //convert int to char using toString() + char c = Integer.toString(num) + .charAt(0); + + assertEquals('7', c); + } +} From f0ea7edab1edfc34f141422310aad0fc77590b65 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Dec 2022 15:36:54 +0800 Subject: [PATCH 132/592] Update README.md [skip ci] --- spring-cloud-modules/spring-cloud-gateway/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud-modules/spring-cloud-gateway/README.md b/spring-cloud-modules/spring-cloud-gateway/README.md index 80315040c9..3d6d70f8a2 100644 --- a/spring-cloud-modules/spring-cloud-gateway/README.md +++ b/spring-cloud-modules/spring-cloud-gateway/README.md @@ -11,3 +11,4 @@ This module contains articles about Spring Cloud Gateway - [Using Spring Cloud Gateway with OAuth 2.0 Patterns](https://www.baeldung.com/spring-cloud-gateway-oauth2) - [URL Rewriting With Spring Cloud Gateway](https://www.baeldung.com/spring-cloud-gateway-url-rewriting) - [Processing the Response Body in Spring Cloud Gateway](https://www.baeldung.com/spring-cloud-gateway-response-body) +- [Rate Limiting With Client IP in Spring Cloud Gateway](https://www.baeldung.com/spring-cloud-gateway-rate-limit-by-client-ip) From 5728e8a71c3216d2fc75fef1694d65ec264765c6 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Dec 2022 15:44:39 +0800 Subject: [PATCH 133/592] Update README.md [skip ci] --- persistence-modules/blaze-persistence/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/persistence-modules/blaze-persistence/README.md b/persistence-modules/blaze-persistence/README.md index 7d843af9ea..ca467fdfd9 100644 --- a/persistence-modules/blaze-persistence/README.md +++ b/persistence-modules/blaze-persistence/README.md @@ -1 +1,3 @@ ### Relevant Articles: + +- [Getting Started with Blaze Persistence](https://www.baeldung.com/blaze-persistence-tutorial) From 7fdb06b40e5798143bddb63e289c51faf2469df3 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Dec 2022 15:49:49 +0800 Subject: [PATCH 134/592] Update README.md [skip ci] --- testing-modules/selenium-junit-testng/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/selenium-junit-testng/README.md b/testing-modules/selenium-junit-testng/README.md index ce56de65a1..65eb269056 100644 --- a/testing-modules/selenium-junit-testng/README.md +++ b/testing-modules/selenium-junit-testng/README.md @@ -7,6 +7,7 @@ - [Taking Screenshots With Selenium WebDriver](https://www.baeldung.com/java-selenium-screenshots) - [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) +- [Handle Browser Tabs With Selenium](https://www.baeldung.com/java-handle-browser-tabs-selenium) #### Notes: - to run the live tests for the article *Fixing Selenium WebDriver Executable Path Error*, follow the manual setup described From 6076e9622bbbcae85815527fab5a3c5c8a2aed78 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Dec 2022 15:53:18 +0800 Subject: [PATCH 135/592] Update README.md [skip ci] --- core-java-modules/core-java-functional/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-functional/README.md b/core-java-modules/core-java-functional/README.md index 5891b4a943..51185f13a1 100644 --- a/core-java-modules/core-java-functional/README.md +++ b/core-java-modules/core-java-functional/README.md @@ -1,3 +1,4 @@ ## Relevant articles: - [Functional Programming in Java](https://www.baeldung.com/java-functional-programming) +- [Functors in Java](https://www.baeldung.com/java-functors) From 196f9575352ac34849e78099f1d4ba6c2fe5fc43 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Dec 2022 15:56:23 +0800 Subject: [PATCH 136/592] Update README.md [skip ci] --- rxjava-modules/rxjava-core/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/rxjava-modules/rxjava-core/README.md b/rxjava-modules/rxjava-core/README.md index 16625435e6..a3c8cef4e7 100644 --- a/rxjava-modules/rxjava-core/README.md +++ b/rxjava-modules/rxjava-core/README.md @@ -14,3 +14,4 @@ This module contains articles about RxJava. - [Combining RxJava Completables](https://www.baeldung.com/rxjava-completable) - [RxJava Hooks](https://www.baeldung.com/rxjava-hooks) - [Retry with Delay in RxJava](https://www.baeldung.com/rxjava-retry-with-delay) +- [RxJava Single.just() vs Single.fromCallable()](https://www.baeldung.com/rxjava-single-just-single-fromcallable) From eec6302e19e9931d3927a81cb95f78dac750e03e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Dec 2022 16:00:09 +0800 Subject: [PATCH 137/592] Create README.md [skip ci] --- security-modules/jwt/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 security-modules/jwt/README.md diff --git a/security-modules/jwt/README.md b/security-modules/jwt/README.md new file mode 100644 index 0000000000..7b83f1c02e --- /dev/null +++ b/security-modules/jwt/README.md @@ -0,0 +1,3 @@ +## Relevant Articles + +- [Managing JWT With Auth0 java-jwt](https://www.baeldung.com/java-auth0-jwt) From 30a4fdb3abdb032d25b55135983ba37fefd35f1b Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Dec 2022 16:09:08 +0800 Subject: [PATCH 138/592] Update README.md [skip ci] --- apache-poi-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apache-poi-2/README.md b/apache-poi-2/README.md index 2c0deec575..e2b5160109 100644 --- a/apache-poi-2/README.md +++ b/apache-poi-2/README.md @@ -11,4 +11,5 @@ This module contains articles about Apache POI. - [Creating a MS PowerPoint Presentation in Java](https://www.baeldung.com/apache-poi-slideshow) - [Finding the Last Row in an Excel Spreadsheet From Java](https://www.baeldung.com/java-excel-find-last-row) - [Setting Formulas in Excel with Apache POI](https://www.baeldung.com/java-apache-poi-set-formulas) +- [Set the Date Format Using Apache POI](https://www.baeldung.com/java-apache-poi-date-format) - More articles: [[<-- prev]](../apache-poi) From 082df236be468c9903ba98aa2f0a1c932e1dadd6 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Dec 2022 16:11:58 +0800 Subject: [PATCH 139/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-4/README.md b/core-java-modules/core-java-collections-4/README.md index 9d3ee5e657..8cd52addfd 100644 --- a/core-java-modules/core-java-collections-4/README.md +++ b/core-java-modules/core-java-collections-4/README.md @@ -14,3 +14,4 @@ - [Sort Collection of Objects by Multiple Fields in Java](https://www.baeldung.com/java-sort-collection-multiple-fields) - [Guide to Java PriorityQueue](https://www.baeldung.com/java-priorityqueue) - [Java Generics PECS – Producer Extends Consumer Super](https://www.baeldung.com/java-generics-pecs) +- [Reversing a Stack in Java](https://www.baeldung.com/java-reversing-a-stack) From bf0356fe47c3c58fa7562332a551fe321090d52b Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Dec 2022 16:19:40 +0800 Subject: [PATCH 140/592] Update README.md [skip ci] --- core-java-modules/core-java-lang-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-5/README.md b/core-java-modules/core-java-lang-5/README.md index f1408abe96..dbd3878458 100644 --- a/core-java-modules/core-java-lang-5/README.md +++ b/core-java-modules/core-java-lang-5/README.md @@ -10,3 +10,4 @@ This module contains articles about core features in the Java language - [Handle Classes With the Same Name in Java](https://www.baeldung.com/java-classes-same-name) - [Variable Instantiation on Declaration vs. on Constructor in Java](https://www.baeldung.com/java-variable-instantiation-declaration-vs-constructor) - [Infinity in Java](https://www.baeldung.com/java-infinity) +- [Type Parameter vs Wildcard in Java Generics](https://www.baeldung.com/java-generics-type-parameter-vs-wildcard) From 3e0e9e6d8342775091ef8d610c91b2525402e72e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Dec 2022 16:25:54 +0800 Subject: [PATCH 141/592] Update README.md [skip ci] --- core-java-modules/core-java-lambdas/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lambdas/README.md b/core-java-modules/core-java-lambdas/README.md index 53414eb14c..a17d3434c5 100644 --- a/core-java-modules/core-java-lambdas/README.md +++ b/core-java-modules/core-java-lambdas/README.md @@ -8,3 +8,4 @@ - [Method References in Java](https://www.baeldung.com/java-method-references) - [The Double Colon Operator in Java 8](https://www.baeldung.com/java-8-double-colon-operator) - [Serialize a Lambda in Java](https://www.baeldung.com/java-serialize-lambda) +- [Convert Anonymous Class into Lambda in Java](https://www.baeldung.com/java-from-anonymous-class-to-lambda) From 56856556fa647a72f7de5f75f96aa3bfc394690c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Dec 2022 16:31:55 +0800 Subject: [PATCH 142/592] Update README.md [skip ci] --- spring-security-modules/spring-security-web-springdoc/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-security-modules/spring-security-web-springdoc/README.md b/spring-security-modules/spring-security-web-springdoc/README.md index 2f1ec59f6e..2c24fe32b9 100644 --- a/spring-security-modules/spring-security-web-springdoc/README.md +++ b/spring-security-modules/spring-security-web-springdoc/README.md @@ -3,6 +3,7 @@ This module contains articles about Springdoc with Spring Security ### Relevant Articles: +- [Form Login and Basic Authentication in springdoc-openapi](https://www.baeldung.com/springdoc-openapi-form-login-and-basic-authentication) ### Running This Project: From 94e813596a0d7e377662adb532345ca07acbf51e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Dec 2022 16:36:11 +0800 Subject: [PATCH 143/592] 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 0cc0a77605..86e17a678f 100644 --- a/core-java-modules/core-java-lang-operators-2/README.md +++ b/core-java-modules/core-java-lang-operators-2/README.md @@ -8,3 +8,4 @@ This module contains articles about Java operators - [Bitmasking in Java with Bitwise Operators](https://www.baeldung.com/java-bitmasking) - [Getting a Bit at a Certain Position from Integral Values](https://www.baeldung.com/java-get-bit-at-position) - [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) From 79255cb2c5d6775c92680110d391159e2fc5ce1d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 15 Dec 2022 16:40:17 +0800 Subject: [PATCH 144/592] Update README.md [skip ci] --- 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 180cd48830..89adc23100 100644 --- a/core-java-modules/core-java-lang-math-3/README.md +++ b/core-java-modules/core-java-lang-math-3/README.md @@ -9,4 +9,5 @@ - [Java Program to Find the Roots of a Quadratic Equation](https://www.baeldung.com/roots-quadratic-equation) - [Create a BMI Calculator in Java](https://www.baeldung.com/java-body-mass-index-calculator) - [Java Program to Calculate the Standard Deviation](https://www.baeldung.com/java-calculate-standard-deviation) +- [Java Program to Print Pascal’s Triangle](https://www.baeldung.com/java-pascal-triangle) - More articles: [[<-- Prev]](/core-java-modules/core-java-lang-math-2) From ca6c1068e2823deecb59c57441905780b7bdfe3d Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Fri, 16 Dec 2022 04:23:40 -0300 Subject: [PATCH 145/592] BAEL-5812 Stream Large byte[] to File with WebClient (#13119) * first draft * editor review 1 --- .../streamlargefile/StreamLargeFileApp.java | 12 ++++ .../client/LargeFileDownloadWebClient.java | 41 +++++++++++++ .../client/LimitedFileDownloadWebClient.java | 55 +++++++++++++++++ .../server/LargeFileController.java | 31 ++++++++++ .../streamlargefile/generate-sample-files.sh | 12 ++++ .../src/main/resources/streamlargefile/run.sh | 21 +++++++ .../LargeFileControllerLiveTest.java | 59 +++++++++++++++++++ 7 files changed, 231 insertions(+) create mode 100644 spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/streamlargefile/StreamLargeFileApp.java create mode 100644 spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/streamlargefile/client/LargeFileDownloadWebClient.java create mode 100644 spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/streamlargefile/client/LimitedFileDownloadWebClient.java create mode 100644 spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/streamlargefile/server/LargeFileController.java create mode 100755 spring-reactive-modules/spring-5-reactive-client-2/src/main/resources/streamlargefile/generate-sample-files.sh create mode 100755 spring-reactive-modules/spring-5-reactive-client-2/src/main/resources/streamlargefile/run.sh create mode 100644 spring-reactive-modules/spring-5-reactive-client-2/src/test/java/com/baeldung/streamlargefile/LargeFileControllerLiveTest.java diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/streamlargefile/StreamLargeFileApp.java b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/streamlargefile/StreamLargeFileApp.java new file mode 100644 index 0000000000..d664ac58e0 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/streamlargefile/StreamLargeFileApp.java @@ -0,0 +1,12 @@ +package com.baeldung.streamlargefile; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class StreamLargeFileApp { + + public static void main(String... args) { + SpringApplication.run(StreamLargeFileApp.class, args); + } +} diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/streamlargefile/client/LargeFileDownloadWebClient.java b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/streamlargefile/client/LargeFileDownloadWebClient.java new file mode 100644 index 0000000000..3288aa7787 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/streamlargefile/client/LargeFileDownloadWebClient.java @@ -0,0 +1,41 @@ +package com.baeldung.streamlargefile.client; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DataBufferUtils; +import org.springframework.web.reactive.function.client.WebClient; + +import reactor.core.publisher.Flux; + +public class LargeFileDownloadWebClient { + + private LargeFileDownloadWebClient() { + } + + public static long fetch(WebClient client, String destination) throws IOException { + Flux flux = client.get() + .retrieve() + .bodyToFlux(DataBuffer.class); + + Path path = Paths.get(destination); + + DataBufferUtils.write(flux, path) + .block(); + + return Files.size(path); + } + + public static void main(String... args) throws IOException { + String baseUrl = args[0]; + String destination = args[1]; + + WebClient client = WebClient.create(baseUrl); + + long bytes = fetch(client, destination); + System.out.printf("downloaded %d bytes to %s", bytes, destination); + } +} diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/streamlargefile/client/LimitedFileDownloadWebClient.java b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/streamlargefile/client/LimitedFileDownloadWebClient.java new file mode 100644 index 0000000000..9b02a0d47b --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/streamlargefile/client/LimitedFileDownloadWebClient.java @@ -0,0 +1,55 @@ +package com.baeldung.streamlargefile.client; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.springframework.web.reactive.function.client.ExchangeStrategies; +import org.springframework.web.reactive.function.client.WebClient; + +import reactor.core.publisher.Mono; + +public class LimitedFileDownloadWebClient { + + private LimitedFileDownloadWebClient() { + } + + public static long fetch(WebClient client, String destination) throws IOException { + Mono mono = client.get() + .retrieve() + .bodyToMono(byte[].class) + .onErrorMap(RuntimeException::new); + + byte[] bytes = mono.block(); + + Path path = Paths.get(destination); + Files.write(path, bytes); + + return bytes.length; + } + + public static void main(String... args) throws IOException { + String baseUrl = args[0]; + String destination = args[1]; + + WebClient client = WebClient.builder() + .baseUrl(baseUrl) + .exchangeStrategies(useMaxMemory()) + .build(); + + long bytes = fetch(client, destination); + System.out.printf("downloaded %d bytes to %s", bytes, destination); + } + + public static ExchangeStrategies useMaxMemory() { + long totalMemory = Runtime.getRuntime() + .maxMemory(); + + return ExchangeStrategies.builder() + .codecs(configurer -> + configurer.defaultCodecs() + .maxInMemorySize((int) totalMemory)) + .build(); + } +} diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/streamlargefile/server/LargeFileController.java b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/streamlargefile/server/LargeFileController.java new file mode 100644 index 0000000000..7fa27cced6 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/streamlargefile/server/LargeFileController.java @@ -0,0 +1,31 @@ +package com.baeldung.streamlargefile.server; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.springframework.core.io.FileSystemResource; +import org.springframework.core.io.Resource; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/large-file") +public class LargeFileController { + + public static final Path downloadPath = Paths.get("/tmp/large.dat"); + + @GetMapping("size") + Long getSize() throws IOException { + return Files.size(downloadPath); + } + + @GetMapping + ResponseEntity get() { + return ResponseEntity.ok() + .body(new FileSystemResource(downloadPath)); + } +} diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/resources/streamlargefile/generate-sample-files.sh b/spring-reactive-modules/spring-5-reactive-client-2/src/main/resources/streamlargefile/generate-sample-files.sh new file mode 100755 index 0000000000..bca9e35796 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/resources/streamlargefile/generate-sample-files.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +generate() { + file="$1" + size="$2" + + fallocate -l "$size" "$file" + ls -lah "$file" +} + +generate /tmp/small.dat 128K +generate /tmp/large.dat 128M diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/resources/streamlargefile/run.sh b/spring-reactive-modules/spring-5-reactive-client-2/src/main/resources/streamlargefile/run.sh new file mode 100755 index 0000000000..72727643af --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/resources/streamlargefile/run.sh @@ -0,0 +1,21 @@ +#!/bin/bash +MYSELF="$(readlink -f "$0")" +MYDIR="${MYSELF%/*}" + +client="${1:-Large}" +url="${2:-http://localhost:8081/large-file}" +download_destination="${3:-/tmp/download.dat}" +xmx="${4:-32m}" + +module_dir="$(readlink -f "$MYDIR/../../../..")" + +echo "module: $module_dir" +cd $module_dir || exit + +echo "packaging..." +mvn clean package dependency:copy-dependencies + +echo "GET $url with $client client..." +java -Xmx$xmx -cp target/dependency/*:target/* \ +"com.baeldung.streamlargefile.client.${client}FileDownloadWebClient" \ +"$url" "$download_destination" diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/test/java/com/baeldung/streamlargefile/LargeFileControllerLiveTest.java b/spring-reactive-modules/spring-5-reactive-client-2/src/test/java/com/baeldung/streamlargefile/LargeFileControllerLiveTest.java new file mode 100644 index 0000000000..65ba97e283 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/test/java/com/baeldung/streamlargefile/LargeFileControllerLiveTest.java @@ -0,0 +1,59 @@ +package com.baeldung.streamlargefile; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.core.io.ClassPathResource; +import org.springframework.web.reactive.function.client.WebClient; + +import com.baeldung.streamlargefile.client.LargeFileDownloadWebClient; +import com.baeldung.streamlargefile.client.LimitedFileDownloadWebClient; +import com.baeldung.streamlargefile.server.LargeFileController; + +class LargeFileControllerLiveTest { + + private static final String BASE_URL = "http://localhost:8081/large-file"; + private static final String DOWNLOAD_DESTINATION = LargeFileController.downloadPath.resolveSibling("download.dat") + .toString(); + private static final Path downloadFile = LargeFileController.downloadPath; + private static final Runtime runtime = Runtime.getRuntime(); + private static final Long xmx = runtime.maxMemory(); + + private WebClient client = WebClient.create(BASE_URL); + + @BeforeAll + static void init() throws IOException { + if (!Files.exists(downloadFile)) { + ClassPathResource res = new ClassPathResource("streamlargefile/generate-sample-files.sh"); + + runtime.exec(res.getFile() + .getAbsolutePath()); + } + } + + @Test + void givenMemorySafeClient_whenFileLargerThanXmx_thenFileDownloaded() throws IOException { + if (xmx < Files.size(downloadFile)) { + long size = LargeFileDownloadWebClient.fetch(client, DOWNLOAD_DESTINATION); + assertTrue(size > xmx); + } + } + + @Test + void givenLimitedClient_whenXmxLargerThanFile_thenFileDownloaded() throws IOException { + WebClient client = WebClient.builder() + .baseUrl(BASE_URL) + .exchangeStrategies(LimitedFileDownloadWebClient.useMaxMemory()) + .build(); + + if (xmx > Files.size(downloadFile)) { + long size = LimitedFileDownloadWebClient.fetch(client, DOWNLOAD_DESTINATION); + assertTrue(size < xmx); + } + } +} From 7a2d457f584f952cf8756ec6a7e0cafe839055a6 Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Fri, 16 Dec 2022 08:49:28 +0100 Subject: [PATCH 146/592] BAEL-6018: HibernateSystemException: ids for this class must be manually assigned before calling save() (#13121) --- .../hibernate/exception/HibernateUtil.java | 1 + .../hibernate/exception/ProductEntity.java | 40 +++++++++++++++++++ .../exception/HibernateExceptionUnitTest.java | 28 +++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/ProductEntity.java diff --git a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java index ae5174ac9c..d3f64bfed3 100644 --- a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java +++ b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java @@ -34,6 +34,7 @@ public class HibernateUtil { ServiceRegistry serviceRegistry) { MetadataSources metadataSources = new MetadataSources(serviceRegistry); metadataSources.addAnnotatedClass(Product.class); + metadataSources.addAnnotatedClass(ProductEntity.class); Metadata metadata = metadataSources.getMetadataBuilder() .build(); return metadata.getSessionFactoryBuilder() diff --git a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/ProductEntity.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/ProductEntity.java new file mode 100644 index 0000000000..b9c5f5010d --- /dev/null +++ b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/ProductEntity.java @@ -0,0 +1,40 @@ +package com.baeldung.hibernate.exception; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "PRODUCT") +public class ProductEntity { + + @Id + private Integer id; + private String name; + private String description; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + +} diff --git a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java index 679f786796..891352843d 100644 --- a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java +++ b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java @@ -26,6 +26,7 @@ import org.hibernate.exception.ConstraintViolationException; import org.hibernate.exception.DataException; import org.hibernate.exception.SQLGrammarException; import org.hibernate.hql.internal.ast.QuerySyntaxException; +import org.hibernate.id.IdentifierGenerationException; import org.hibernate.query.NativeQuery; import org.hibernate.tool.schema.spi.CommandAcceptanceException; import org.hibernate.tool.schema.spi.SchemaManagementException; @@ -222,6 +223,33 @@ public class HibernateExceptionUnitTest { } + @Test + public void givenEntityWithoutId_whenCallingSave_thenThrowIdentifierGenerationException() { + + thrown.expect(isA(IdentifierGenerationException.class)); + thrown.expectMessage("ids for this class must be manually assigned before calling save(): com.baeldung.hibernate.exception.Product"); + + Session session = null; + Transaction transaction = null; + + try { + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + + ProductEntity product = new ProductEntity(); + product.setName("Product Name"); + + session.save(product); + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + } + + } + @Test public void givenQueryWithDataTypeMismatch_WhenQueryExecuted_thenDataException() { thrown.expectCause(isA(DataException.class)); From 92ee1b855b7a66024f5c72c598055cb6e558933d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 16 Dec 2022 22:27:27 +0800 Subject: [PATCH 147/592] Create README.md [skip ci] --- patterns-modules/design-patterns-creational-2/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 patterns-modules/design-patterns-creational-2/README.md diff --git a/patterns-modules/design-patterns-creational-2/README.md b/patterns-modules/design-patterns-creational-2/README.md new file mode 100644 index 0000000000..dc5b2a1861 --- /dev/null +++ b/patterns-modules/design-patterns-creational-2/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [The Factory Design Pattern in Java](https://www.baeldung.com/java-factory-pattern) From 4e85cc41ba70cd65e8f82f4a6b762e8e10f80eb3 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 16 Dec 2022 22:28:29 +0800 Subject: [PATCH 148/592] Update README.md [skip ci] --- patterns-modules/design-patterns-creational/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/patterns-modules/design-patterns-creational/README.md b/patterns-modules/design-patterns-creational/README.md index fc1f982cbe..b599955846 100644 --- a/patterns-modules/design-patterns-creational/README.md +++ b/patterns-modules/design-patterns-creational/README.md @@ -9,4 +9,3 @@ - [How to Replace Many if Statements in Java](https://www.baeldung.com/java-replace-if-statements) - [Prototype Pattern in Java](https://www.baeldung.com/java-pattern-prototype) - [Implementing Factory Pattern With Generics in Java](https://www.baeldung.com/java-factory-pattern-generics) -- [The Factory Design Pattern in Java](https://www.baeldung.com/java-factory-pattern) From 488bb057d6a8922d93654190fa3d2ff5f10b3f95 Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Sat, 17 Dec 2022 16:04:14 +0100 Subject: [PATCH 149/592] BAEL-5927: Sorting a HashSet in Java (#13100) * BAEL-5927: Sorting a HashSet in Java * BAEL-5927: Sorting a HashSet in Java (Refacto) * BAEL-5927: Sorting a HashSet in Java (Refacto) * BAEL-5927: Sorting a HashSet in Java (Refacto) --- .../collections/sorting/HashSetUnitTest.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/HashSetUnitTest.java diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/HashSetUnitTest.java b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/HashSetUnitTest.java new file mode 100644 index 0000000000..de0b084216 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/HashSetUnitTest.java @@ -0,0 +1,55 @@ +package com.baeldung.collections.sorting; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.TreeSet; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.Test; + +public class HashSetUnitTest { + + @Test + void givenHashSet_whenUsingCollectionsSort_thenHashSetSorted() { + HashSet numberHashSet = new HashSet<>(); + numberHashSet.add(2); + numberHashSet.add(1); + numberHashSet.add(4); + numberHashSet.add(3); + // converting HashSet to arraylist + ArrayList arrayList = new ArrayList<>(numberHashSet); + // sorting the list + Collections.sort(arrayList); + assertThat(arrayList).containsExactly(1, 2, 3, 4); + } + + @Test + void givenHashSet_whenUsingTreeSet_thenHashSetSorted() { + HashSet numberHashSet = new HashSet<>(); + numberHashSet.add(2); + numberHashSet.add(1); + numberHashSet.add(4); + numberHashSet.add(3); + // TreeSet gets the value of hashSet + TreeSet treeSet = new TreeSet<>(); + treeSet.addAll(numberHashSet); + assertThat(treeSet).containsExactly(1, 2, 3, 4); + } + + @Test + void givenHashSet_whenUsingStream_thenHashSetSorted() { + HashSet numberHashSet = new HashSet<>(); + numberHashSet.add(200); + numberHashSet.add(100); + numberHashSet.add(400); + numberHashSet.add(300); + HashSet sortedHashSet = numberHashSet.stream().sorted() + .collect(Collectors.toCollection(LinkedHashSet::new)); + assertThat(sortedHashSet).containsExactly(100, 200, 300, 400); + } + +} From ba7371baac1e377ba2aa94c7d89afc60f3775cdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan=20Cardo=C5=9F?= <106325528+sodrac@users.noreply.github.com> Date: Sat, 17 Dec 2022 17:44:23 +0200 Subject: [PATCH 150/592] BAEL-5525 add mainClass and layout configuration to the spring boot maven plugin (#13049) * BAEL-5617 Handle classes with the same name in Java code samples * BAEL-5617 Handle classes with the same name in Java update project module * BAEL-5754 Convert a List of String to a comma-separated String code samples * BAEL-5754 update unit test class name * BAEL-5754 update unit test methods naming * BAEL-5754 update tests order so to reflect the article * BAEL-5754 align code to article * BAEL-5525 add mainClass and layout configuration to the spring boot maven plugin --- spring-boot-modules/spring-boot-artifacts-2/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spring-boot-modules/spring-boot-artifacts-2/pom.xml b/spring-boot-modules/spring-boot-artifacts-2/pom.xml index d0e12caa53..5fcee8d609 100644 --- a/spring-boot-modules/spring-boot-artifacts-2/pom.xml +++ b/spring-boot-modules/spring-boot-artifacts-2/pom.xml @@ -27,6 +27,10 @@ org.springframework.boot spring-boot-maven-plugin + + com.baeldung.demo.DemoApplication + JAR + From ee9122794c70ba94af72cf8a78ddc70b13f93019 Mon Sep 17 00:00:00 2001 From: Kapil Khandelwal Date: Mon, 19 Dec 2022 03:59:56 +0530 Subject: [PATCH 151/592] BAEL:3628 - Trigger another job from a jenkins pipeline (#13170) --- .../trigger-another-job/pipeline-trigger-job | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 jenkins-modules/jenkins-jobs/trigger-another-job/pipeline-trigger-job diff --git a/jenkins-modules/jenkins-jobs/trigger-another-job/pipeline-trigger-job b/jenkins-modules/jenkins-jobs/trigger-another-job/pipeline-trigger-job new file mode 100644 index 0000000000..e5d958d08f --- /dev/null +++ b/jenkins-modules/jenkins-jobs/trigger-another-job/pipeline-trigger-job @@ -0,0 +1,15 @@ +pipeline { + agent any + stages { + stage('build') { + steps { + echo "parentJob" + } + } + stage('triggerChildJob') { + steps { + build job: "childJob", wait: true + } + } + } +} From 39f29ec6904e3eceb7a3404f9ad2dbd30aaed00c Mon Sep 17 00:00:00 2001 From: Tapan Avasthi Date: Mon, 19 Dec 2022 09:37:11 +0530 Subject: [PATCH 152/592] BAEL-6015: Split String by Whitespace in Java (#13146) - Using split() method of String class - Using StringTokenizer class - Using split() utility method of the StringUtils class Co-authored-by: Tapan Avasthi --- .../splitstring/SplitStringUnitTest.java | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/splitstring/SplitStringUnitTest.java diff --git a/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/splitstring/SplitStringUnitTest.java b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/splitstring/SplitStringUnitTest.java new file mode 100644 index 0000000000..5be8a1dacd --- /dev/null +++ b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/splitstring/SplitStringUnitTest.java @@ -0,0 +1,104 @@ +package com.baeldung.splitstring; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.util.StringTokenizer; + +import org.apache.commons.lang3.StringUtils; +import org.junit.Test; + +public class SplitStringUnitTest { + private static final String SPACE = " "; + private static final String TAB = " "; + private static final String NEW_LINE = "\n"; + + private static final String FRUITS_TAB_SEPARATED = "Apple" + TAB + "Banana" + TAB + "Mango" + TAB + "Orange"; + private static final String FRUITS_SPACE_SEPARATED = "Apple" + SPACE + "Banana" + SPACE + "Mango" + SPACE + "Orange"; + private static final String FRUITS_NEWLINE_SEPARATED = "Apple" + NEW_LINE + "Banana" + NEW_LINE + "Mango" + NEW_LINE + "Orange"; + + @Test + public void givenSpaceSeparatedString_whenSplitUsingSpace_shouldGetExpectedResult() { + String fruits = FRUITS_SPACE_SEPARATED; + String[] fruitArray = fruits.split(SPACE); + verifySplit(fruitArray); + } + + @Test + public void givenTabSeparatedString_whenSplitUsingTab_shouldGetExpectedResult() { + String fruits = FRUITS_TAB_SEPARATED; + String[] fruitArray = fruits.split(TAB); + verifySplit(fruitArray); + } + + @Test + public void givenNewlineSeparatedString_whenSplitUsingNewline_shouldGetExpectedResult() { + String fruits = FRUITS_NEWLINE_SEPARATED; + String[] fruitArray = fruits.split(NEW_LINE); + verifySplit(fruitArray); + } + + @Test + public void givenTabSeparatedString_whenSplitUsingSpace_shouldNowSplit() { + String fruits = FRUITS_TAB_SEPARATED; + String[] fruitArray = fruits.split(" "); + assertEquals(1, fruitArray.length); + assertEquals(fruits, fruitArray[0]); + } + + @Test + public void givenWhiteSpaceSeparatedString_whenSplitUsingWhiteSpaceRegex_shouldGetExpectedResult() { + String whitespaceRegex = SPACE + "|" + TAB + "|" + NEW_LINE; + String[] allSamples = new String[] { FRUITS_SPACE_SEPARATED, FRUITS_TAB_SEPARATED, FRUITS_NEWLINE_SEPARATED }; + for (String fruits : allSamples) { + String[] fruitArray = fruits.split(whitespaceRegex); + verifySplit(fruitArray); + } + } + + @Test + public void givenNewlineSeparatedString_whenSplitUsingWhiteSpaceMetaChar_shouldGetExpectedResult() { + String whitespaceMetaChar = "\\s"; + String[] allSamples = new String[] { FRUITS_SPACE_SEPARATED, FRUITS_TAB_SEPARATED, FRUITS_NEWLINE_SEPARATED }; + for (String fruits : allSamples) { + String[] fruitArray = fruits.split(whitespaceMetaChar); + verifySplit(fruitArray); + } + } + + @Test + public void givenSpaceSeparatedString_whenSplitUsingStringTokenizer_shouldGetExpectedResult() { + String fruits = FRUITS_SPACE_SEPARATED; + StringTokenizer tokenizer = new StringTokenizer(fruits); + String[] fruitArray = new String[tokenizer.countTokens()]; + int index = 0; + while (tokenizer.hasMoreTokens()) { + fruitArray[index++] = tokenizer.nextToken(); + } + verifySplit(fruitArray); + } + + @Test + public void givenWhiteSpaceSeparatedString_whenSplitUsingStringUtils_shouldGetExpectedResult() { + String[] allSamples = new String[] { FRUITS_SPACE_SEPARATED, FRUITS_TAB_SEPARATED, FRUITS_NEWLINE_SEPARATED }; + for (String fruits : allSamples) { + String[] fruitArray = StringUtils.split(fruits); + verifySplit(fruitArray); + } + } + + @Test + public void givenNullString_whenSplitUsingStringUtils_shouldReturnNull() { + String fruits = null; + String[] fruitArray = StringUtils.split(fruits); + assertNull(fruitArray); + } + + private void verifySplit(String[] fruitArray) { + assertEquals(4, fruitArray.length); + assertEquals("Apple", fruitArray[0]); + assertEquals("Banana", fruitArray[1]); + assertEquals("Mango", fruitArray[2]); + assertEquals("Orange", fruitArray[3]); + } +} From 0fd77aa6643581fed765729a07bd87158330cb0e Mon Sep 17 00:00:00 2001 From: cesarevalenti90 <50798547+cesarevalenti90@users.noreply.github.com> Date: Mon, 19 Dec 2022 14:53:17 +0100 Subject: [PATCH 153/592] [BAEL 5909]-Callable vs Supplier and When to Use Them in Java (#13041) * Added test class for a simple shallow copy and deep copy * Added test class for a simple shallow copy and deep copy * refactor naming of test method * formatted * refactor test whenIsAShallowCopyDoneByCopyConstructor_thenImmutableObjectWillNotChange * Renamed package and added md file * refactor README.md * first push * refactor * Revert "refactor README.md" This reverts commit eae77c453ba0bf2af62bad52dc1ed61d07931e34. * Revert "Renamed package and added md file" This reverts commit 42c6f97cbde39cc0a5e0bacf34f86a32ded4f4aa. * Revert "refactor test whenIsAShallowCopyDoneByCopyConstructor_thenImmutableObjectWillNotChange" This reverts commit 44fb57fe2b51857f960dc216d33508e718e5414f. * Revert "formatted" This reverts commit 44be87ef25e566b8e9175cb0fdeed7f0ef485dd3. * Revert "refactor naming of test method" This reverts commit 6133c31057e39b19c4978f960cda1c0ba5559aae. * Revert "Added test class for a simple shallow copy and deep copy" This reverts commit 2cae083578883ae693d1c5e76fd4948e213e9ea0. * Revert "Added test class for a simple shallow copy and deep copy" This reverts commit f43312e2c1979410409f46020a3f7d555e11e966. * Merge prohect java-supplier-callable to project core-java-lambdas * adjusted package name * removed AbstractAgeCalculator.java * added test for supplier-callable Co-authored-by: Cesare --- .../baeldung/suppliercallable/data/User.java | 59 +++++++++++++++++ .../suppliercallable/service/Service.java | 8 +++ .../callable/AgeCalculatorCallable.java | 20 ++++++ .../service/callable/CallableServiceImpl.java | 31 +++++++++ .../callable/CarDriverValidatorCallable.java | 17 +++++ .../service/supplier/SupplierServiceImpl.java | 26 ++++++++ .../CallableSupplierUnitTest.java | 64 +++++++++++++++++++ 7 files changed, 225 insertions(+) create mode 100644 core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/data/User.java create mode 100644 core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/Service.java create mode 100644 core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/callable/AgeCalculatorCallable.java create mode 100644 core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/callable/CallableServiceImpl.java create mode 100644 core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/callable/CarDriverValidatorCallable.java create mode 100644 core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/supplier/SupplierServiceImpl.java create mode 100644 core-java-modules/core-java-lambdas/src/test/java/com/baeldung/suppliercallable/CallableSupplierUnitTest.java diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/data/User.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/data/User.java new file mode 100644 index 0000000000..488f12a099 --- /dev/null +++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/data/User.java @@ -0,0 +1,59 @@ +package com.baeldung.suppliercallable.data; + +import java.time.LocalDate; + +public class User { + + private String name; + private String surname; + private LocalDate birthDate; + private Integer age; + private Boolean canDriveACar = false; + + public User(String name, String surname, LocalDate birthDate) { + this.name = name; + this.surname = surname; + this.birthDate = birthDate; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSurname() { + return surname; + } + + public void setSurname(String surname) { + this.surname = surname; + } + + public LocalDate getBirthDate() { + return birthDate; + } + + public void setBirthDate(LocalDate birthDate) { + this.birthDate = birthDate; + } + + public void setAge(Integer age) { + this.age = age; + } + + public Integer getAge() { + return age; + } + + public Boolean getCanDriveACar() { + return canDriveACar; + } + + public void setCanDriveACar(Boolean canDriveACar) { + this.canDriveACar = canDriveACar; + } + +} diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/Service.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/Service.java new file mode 100644 index 0000000000..cdae828d8a --- /dev/null +++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/Service.java @@ -0,0 +1,8 @@ +package com.baeldung.suppliercallable.service; + +import com.baeldung.suppliercallable.data.User; + +public interface Service { + + User execute(User user); +} diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/callable/AgeCalculatorCallable.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/callable/AgeCalculatorCallable.java new file mode 100644 index 0000000000..f42e4922b6 --- /dev/null +++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/callable/AgeCalculatorCallable.java @@ -0,0 +1,20 @@ +package com.baeldung.suppliercallable.service.callable; + +import java.time.LocalDate; +import java.time.Period; +import java.util.concurrent.Callable; + +public class AgeCalculatorCallable implements Callable { + + private final LocalDate birthDate; + + @Override + public Integer call() throws Exception { + return Period.between(birthDate, LocalDate.now()) + .getYears(); + } + + public AgeCalculatorCallable(LocalDate birthDate) { + this.birthDate = birthDate; + } +} diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/callable/CallableServiceImpl.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/callable/CallableServiceImpl.java new file mode 100644 index 0000000000..baf6b5bbd9 --- /dev/null +++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/callable/CallableServiceImpl.java @@ -0,0 +1,31 @@ +package com.baeldung.suppliercallable.service.callable; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +import com.baeldung.suppliercallable.data.User; +import com.baeldung.suppliercallable.service.Service; + +public class CallableServiceImpl implements Service { + + @Override + public User execute(User user) { + ExecutorService executorService = Executors.newCachedThreadPool(); + + try { + Future ageFuture = executorService.submit(new AgeCalculatorCallable(user.getBirthDate())); + Integer age = ageFuture.get(); + Future canDriveACarFuture = executorService.submit(new CarDriverValidatorCallable(age)); + Boolean canDriveACar = canDriveACarFuture.get(); + user.setAge(age); + user.setCanDriveACar(canDriveACar); + } catch (ExecutionException | InterruptedException e) { + throw new RuntimeException(e.getCause()); + } + + return user; + } + +} diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/callable/CarDriverValidatorCallable.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/callable/CarDriverValidatorCallable.java new file mode 100644 index 0000000000..e282cdd626 --- /dev/null +++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/callable/CarDriverValidatorCallable.java @@ -0,0 +1,17 @@ +package com.baeldung.suppliercallable.service.callable; + +import java.util.concurrent.Callable; + +public class CarDriverValidatorCallable implements Callable { + + private final Integer age; + + @Override + public Boolean call() throws Exception { + return age > 18; + } + + public CarDriverValidatorCallable(Integer age) { + this.age = age; + } +} diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/supplier/SupplierServiceImpl.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/supplier/SupplierServiceImpl.java new file mode 100644 index 0000000000..9de0b430eb --- /dev/null +++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/suppliercallable/service/supplier/SupplierServiceImpl.java @@ -0,0 +1,26 @@ +package com.baeldung.suppliercallable.service.supplier; + +import java.time.LocalDate; +import java.time.Period; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import com.baeldung.suppliercallable.data.User; +import com.baeldung.suppliercallable.service.Service; + +public class SupplierServiceImpl implements Service { + @Override + public User execute(User user) { + ExecutorService executorService = Executors.newCachedThreadPool(); + CompletableFuture ageFut = CompletableFuture.supplyAsync(() -> Period.between(user.getBirthDate(), LocalDate.now()) + .getYears(), executorService) + .exceptionally((throwable -> null)); + CompletableFuture canDriveACarFut = ageFut.thenComposeAsync(age -> CompletableFuture.supplyAsync(() -> age > 18, executorService)) + .exceptionally((ex) -> false); + user.setAge(ageFut.join()); + user.setCanDriveACar(canDriveACarFut.join()); + return user; + } + +} diff --git a/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/suppliercallable/CallableSupplierUnitTest.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/suppliercallable/CallableSupplierUnitTest.java new file mode 100644 index 0000000000..c9be58c675 --- /dev/null +++ b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/suppliercallable/CallableSupplierUnitTest.java @@ -0,0 +1,64 @@ +package com.baeldung.suppliercallable; + +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.LocalDate; +import java.time.Month; +import org.junit.jupiter.api.Test; +import com.baeldung.suppliercallable.data.User; +import com.baeldung.suppliercallable.service.Service; +import com.baeldung.suppliercallable.service.callable.CallableServiceImpl; +import com.baeldung.suppliercallable.service.supplier.SupplierServiceImpl; + +public class CallableSupplierUnitTest { + + @Test + void givenCallableService_whenUserIsAnAdult_thenCanDriveACar() { + User user = new User("Test", "Test", LocalDate.of(2000, Month.JANUARY, 19)); + Service service = new CallableServiceImpl(); + service.execute(user); + assertEquals(true, user.getCanDriveACar()); + } + + @Test + void givenCallableService_whenUserIsNotAnAdult_thenCannotDriveACar() { + User user = new User("Test", "Test", LocalDate.of(2010, Month.JANUARY, 19)); + Service service = new CallableServiceImpl(); + service.execute(user); + assertEquals(false, user.getCanDriveACar()); + } + + @Test + void givenCallableService_whenBirthDateIsNull_thenShouldThrowAnException() { + User user = new User("Test", "Test", null); + Service service = new CallableServiceImpl(); + assertThrows(RuntimeException.class, () -> service.execute(user)); + } + + @Test + void givenSupplierService_whenUserIsAnAdult_thenCanDriveACar() { + User user = new User("Test", "Test", LocalDate.of(2000, Month.JANUARY, 19)); + Service service = new SupplierServiceImpl(); + service.execute(user); + assertEquals(true, user.getCanDriveACar()); + } + + @Test + void givenSupplierService_whenUserIsNotAnAdult_thenCannotDriveACar() { + User user = new User("Test", "Test", LocalDate.of(2010, Month.JANUARY, 19)); + Service service = new SupplierServiceImpl(); + service.execute(user); + assertEquals(false, user.getCanDriveACar()); + } + + @Test + void givenSupplierService_whenBirthDateIsNull_thenCannotDriveACarAndAgeIsNull() { + User user = new User("Test", "Test", null); + Service service = new SupplierServiceImpl(); + service.execute(user); + assertEquals(false, user.getCanDriveACar()); + assertNull(user.getBirthDate()); + } + +} From 88f2eca11891c1428bc8ccfa8296d4f53d6e0891 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Mon, 19 Dec 2022 11:29:17 -0300 Subject: [PATCH 154/592] BAEL 5842 - Calling JMX MBean Method from a Shell Script (#13028) * bael 5842 * bael-5842 - editor review 1 --- .../baeldung/jmxshell/JmxCalculatorMain.java | 25 +++++++ .../baeldung/jmxshell/bean/Calculator.java | 32 +++++++++ .../jmxshell/bean/CalculatorMBean.java | 14 ++++ .../jmxshell/custom/JmxConnectionWrapper.java | 68 +++++++++++++++++++ .../baeldung/jmxshell/custom/JmxInvoker.java | 34 ++++++++++ .../main/resources/jmxshell/jmx-invoker.sh | 45 ++++++++++++ .../src/main/resources/jmxshell/jmxclient.sh | 54 +++++++++++++++ .../src/main/resources/jmxshell/jmxterm.pl | 22 ++++++ .../src/main/resources/jmxshell/jmxterm.sh | 46 +++++++++++++ .../jmxshell/custom/JmxInvokerLiveTest.java | 47 +++++++++++++ 10 files changed, 387 insertions(+) create mode 100644 core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/JmxCalculatorMain.java create mode 100644 core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/bean/Calculator.java create mode 100644 core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/bean/CalculatorMBean.java create mode 100644 core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/custom/JmxConnectionWrapper.java create mode 100644 core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/custom/JmxInvoker.java create mode 100755 core-java-modules/core-java-perf/src/main/resources/jmxshell/jmx-invoker.sh create mode 100755 core-java-modules/core-java-perf/src/main/resources/jmxshell/jmxclient.sh create mode 100755 core-java-modules/core-java-perf/src/main/resources/jmxshell/jmxterm.pl create mode 100755 core-java-modules/core-java-perf/src/main/resources/jmxshell/jmxterm.sh create mode 100644 core-java-modules/core-java-perf/src/test/java/com/baeldung/jmxshell/custom/JmxInvokerLiveTest.java diff --git a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/JmxCalculatorMain.java b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/JmxCalculatorMain.java new file mode 100644 index 0000000000..1201f2551f --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/JmxCalculatorMain.java @@ -0,0 +1,25 @@ +package com.baeldung.jmxshell; + +import java.lang.management.ManagementFactory; +import java.util.Scanner; + +import javax.management.MBeanServer; +import javax.management.ObjectName; + +import com.baeldung.jmxshell.bean.Calculator; + +public class JmxCalculatorMain { + + public static void main(String[] args) throws Exception { + MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + server.registerMBean(new Calculator(), new ObjectName("com.baeldung.jxmshell:type=basic,name=calculator")); + + System.out.printf("mbean registered. pid: %s\n", ManagementFactory.getRuntimeMXBean() + .getName()); + + try (Scanner scanner = new Scanner(System.in)) { + System.out.println(""); + scanner.nextLine(); + } + } +} diff --git a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/bean/Calculator.java b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/bean/Calculator.java new file mode 100644 index 0000000000..cb57a5e154 --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/bean/Calculator.java @@ -0,0 +1,32 @@ +package com.baeldung.jmxshell.bean; + +public class Calculator implements CalculatorMBean { + + private Integer a = 0; + private Integer b = 0; + + @Override + public Integer sum() { + return a + b; + } + + @Override + public Integer getA() { + return a; + } + + @Override + public void setA(Integer a) { + this.a = a; + } + + @Override + public Integer getB() { + return b; + } + + @Override + public void setB(Integer b) { + this.b = b; + } +} diff --git a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/bean/CalculatorMBean.java b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/bean/CalculatorMBean.java new file mode 100644 index 0000000000..16e104295a --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/bean/CalculatorMBean.java @@ -0,0 +1,14 @@ +package com.baeldung.jmxshell.bean; + +public interface CalculatorMBean { + + Integer sum(); + + Integer getA(); + + void setA(Integer a); + + Integer getB(); + + void setB(Integer b); +} diff --git a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/custom/JmxConnectionWrapper.java b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/custom/JmxConnectionWrapper.java new file mode 100644 index 0000000000..ea70fa3c96 --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/custom/JmxConnectionWrapper.java @@ -0,0 +1,68 @@ +package com.baeldung.jmxshell.custom; + +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.management.Attribute; +import javax.management.MBeanAttributeInfo; +import javax.management.MBeanInfo; +import javax.management.MBeanServerConnection; +import javax.management.ObjectName; +import javax.management.remote.JMXConnectorFactory; +import javax.management.remote.JMXServiceURL; + +public class JmxConnectionWrapper { + + private final Map attributeMap; + private final MBeanServerConnection connection; + private final ObjectName objectName; + + public JmxConnectionWrapper(String url, String beanName) throws Exception { + objectName = new ObjectName(beanName); + + connection = JMXConnectorFactory.connect(new JMXServiceURL(url)) + .getMBeanServerConnection(); + + MBeanInfo bean = connection.getMBeanInfo(objectName); + MBeanAttributeInfo[] attributes = bean.getAttributes(); + + this.attributeMap = Stream.of(attributes) + .peek(System.out::println) + .collect(Collectors.toMap(MBeanAttributeInfo::getName, Function.identity())); + } + + public boolean hasAttribute(String attributeName) { + return attributeMap.containsKey(attributeName); + } + + public Object attributeValue(String name, String value) throws Exception { + if (value != null) { + connection.setAttribute(objectName, new Attribute(name, parse(value))); + } + return connection.getAttribute(objectName, name); + } + + public Object invoke(String operation) throws Exception { + String[] signature = new String[] {}; + Object[] params = new Object[] {}; + + return connection.invoke(objectName, operation, params, signature); + } + + private static Object parse(String value) { + if (value == null) + return null; + + if (value.matches("\\d+")) { + return Integer.valueOf(value); + } else if (value.trim() + .toLowerCase() + .matches("true|false")) { + return Boolean.valueOf(value); + } + + return value.equals("null") ? null : value; + } +} diff --git a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/custom/JmxInvoker.java b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/custom/JmxInvoker.java new file mode 100644 index 0000000000..dda765289e --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmxshell/custom/JmxInvoker.java @@ -0,0 +1,34 @@ +package com.baeldung.jmxshell.custom; + +public class JmxInvoker { + + public static void main(String... args) throws Exception { + String serviceURL = args[0]; + String name = args[1]; + String operation = args[2]; + String attributeValue = null; + if (args.length > 3) { + attributeValue = args[3]; + } + + String result = execute(serviceURL, name, operation, attributeValue); + System.out.println(result); + } + + public static String execute(String url, String mBeanName, String operation, String attributeValue) { + try { + JmxConnectionWrapper connection = new JmxConnectionWrapper(url, mBeanName); + + if (connection.hasAttribute(operation)) { + Object value = connection.attributeValue(operation, attributeValue); + return operation + "=" + value; + } else { + Object result = connection.invoke(operation); + return operation + "(): " + result; + } + } catch (Exception e) { + e.printStackTrace(); + return e.getClass() + ": " + e.getMessage(); + } + } +} diff --git a/core-java-modules/core-java-perf/src/main/resources/jmxshell/jmx-invoker.sh b/core-java-modules/core-java-perf/src/main/resources/jmxshell/jmx-invoker.sh new file mode 100755 index 0000000000..cf9fa1621d --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/resources/jmxshell/jmx-invoker.sh @@ -0,0 +1,45 @@ +#!/bin/sh +jar='/tmp/core-java-perf.jar' +address='localhost:11234' +mbean='com.baeldung.jxmshell:name=calculator,type=basic' +operation='sum' + +while test $# -gt 0 +do + case "$1" in + --jar) + shift + jar="$1" + ;; + --address) + shift + address="$1" + ;; + --mbean) + shift + mbean="$1" + ;; + --run|-x) + shift + operation="$1" + ;; + --get) + shift + operation="$1" + ;; + --set) + shift + operation="$1 $2" + ;; + -*) + echo "bad option '$1'" + exit 1 + ;; + esac + shift +done + +java -cp "$jar" com.baeldung.jmxshell.custom.JmxInvoker \ + "service:jmx:rmi:///jndi/rmi://$address/jmxrmi" \ + "$mbean" \ + "$operation" diff --git a/core-java-modules/core-java-perf/src/main/resources/jmxshell/jmxclient.sh b/core-java-modules/core-java-perf/src/main/resources/jmxshell/jmxclient.sh new file mode 100755 index 0000000000..72214ed181 --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/resources/jmxshell/jmxclient.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +jar='/tmp/cmdline-jmxclient-0.10.3.jar' +address='localhost:11234' + +mbean='com.baeldung.jxmshell:name=calculator,type=basic' +operation='sum' +command="$mbean" + +while test $# -gt 0 +do + case "$1" in + --jar) + shift + jar="$1" + ;; + --address) + shift + address="$1" + ;; + --mbean) + shift + mbean="$1" + ;; + --run|-x) + shift + operation="$1" + + command="${mbean} ${operation}" + ;; + --set) + shift + operation="$1" + + shift + attribute_value="$1" + + command="${mbean} ${operation}=${attribute_value}" + ;; + --get) + shift + operation="$1" + + command="${mbean} ${operation}" + ;; + -*) + echo "bad option '$1'" + exit 1 + ;; + esac + shift +done + +java -jar "$jar" - "$address" "$command" diff --git a/core-java-modules/core-java-perf/src/main/resources/jmxshell/jmxterm.pl b/core-java-modules/core-java-perf/src/main/resources/jmxshell/jmxterm.pl new file mode 100755 index 0000000000..af199a4113 --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/resources/jmxshell/jmxterm.pl @@ -0,0 +1,22 @@ +#!/usr/bin/perl + +$jar = "/tmp/jmxterm-1.0.4-uber.jar"; + +$host = "localhost"; +$port = 11234; + +$mbean = $ARGV[0] || "com.baeldung.jxmshell:name=calculator,type=basic"; +$operation = $ARGV[1] || "sum"; + +open JMX, "| java -jar $jar -n"; + +print JMX "open $host:$port\n"; +$attribute_value = $ARGV[2]; +if (defined $attribute_value) { + print JMX "set -b ${mbean} ${operation} ${attribute_value}\n"; +} else { + print JMX "run -b ${mbean} ${operation}\n"; +} +print JMX "close\n"; + +close JMX; diff --git a/core-java-modules/core-java-perf/src/main/resources/jmxshell/jmxterm.sh b/core-java-modules/core-java-perf/src/main/resources/jmxshell/jmxterm.sh new file mode 100755 index 0000000000..f81d0be920 --- /dev/null +++ b/core-java-modules/core-java-perf/src/main/resources/jmxshell/jmxterm.sh @@ -0,0 +1,46 @@ +#!/bin/sh + +jar='/tmp/jmxterm-1.0.4-uber.jar' +address='localhost:11234' + +mbean='com.baeldung.jxmshell:name=calculator,type=basic' +operation='sum' +command="info -b $mbean" + +while test $# -gt 0 +do + case "$1" in + --jar|-j) + shift; jar="$1" + ;; + --address|-l) + shift; address="$1" + ;; + --mbean|-b) + shift; mbean="$1" + ;; + --run|-x) + shift; operation="$1" + + command="run -b ${mbean} ${operation}" + ;; + --set) + shift; operation="$1" + shift; attribute_value="$1" + + command="set -b ${mbean} ${operation} ${attribute_value}" + ;; + --get) + shift; operation="$1" + + command="get -b ${mbean} ${operation}" + ;; + -*) + echo "bad option '$1'" + exit 1 + ;; + esac + shift +done + +echo "$command" | java -jar "$jar" -l "$address" -n -v silent diff --git a/core-java-modules/core-java-perf/src/test/java/com/baeldung/jmxshell/custom/JmxInvokerLiveTest.java b/core-java-modules/core-java-perf/src/test/java/com/baeldung/jmxshell/custom/JmxInvokerLiveTest.java new file mode 100644 index 0000000000..2177e0a5ea --- /dev/null +++ b/core-java-modules/core-java-perf/src/test/java/com/baeldung/jmxshell/custom/JmxInvokerLiveTest.java @@ -0,0 +1,47 @@ +package com.baeldung.jmxshell.custom; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +@TestMethodOrder(OrderAnnotation.class) +class JmxInvokerLiveTest { + + private static final String JMX_URL = "service:jmx:rmi:///jndi/rmi://localhost:11234/jmxrmi"; + private static final String JMX_MBEAN_NAME = "com.baeldung.jxmshell:name=calculator,type=basic"; + private static final String ATTRIBUTE_A = "A"; + private static final String ATTRIBUTE_B = "B"; + private static final String SUM_OPERATION = "sum"; + private static final Integer ATTRIBUTE_VALUE = 1; + + @Test + @Order(1) + void givenAttributeValue_whenSetAttributeA_thenResultMatches() { + String attributeValue = ATTRIBUTE_VALUE.toString(); + + String result = JmxInvoker.execute(JMX_URL, JMX_MBEAN_NAME, ATTRIBUTE_A, attributeValue); + + assertEquals(ATTRIBUTE_A + "=" + attributeValue, result); + } + + @Test + @Order(2) + void givenAttributeValue_whenSetAttributeB_thenResultMatches() { + String attributeValue = ATTRIBUTE_VALUE.toString(); + + String result = JmxInvoker.execute(JMX_URL, JMX_MBEAN_NAME, ATTRIBUTE_B, attributeValue); + + assertEquals(ATTRIBUTE_B + "=" + attributeValue, result); + } + + @Test + @Order(3) + void whenSumOperation_thenSumIsCorrect() { + String result = JmxInvoker.execute(JMX_URL, JMX_MBEAN_NAME, SUM_OPERATION, null); + + assertEquals(SUM_OPERATION + "(): " + (ATTRIBUTE_VALUE + ATTRIBUTE_VALUE), result); + } +} From 6bb55989049b10f0614687ff412c8b6c2b42fead Mon Sep 17 00:00:00 2001 From: pedrolopes Date: Mon, 19 Dec 2022 18:02:08 -0300 Subject: [PATCH 155/592] BAEL-5946: Reading and Writing With a ConcurrentHashMap (#13163) * consistent read unit test * unit test to show consistency in writing to the same key of map * testing writes at different map key --- .../ConcurrentHashMapUnitTest.java | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrenthashmap/ConcurrentHashMapUnitTest.java diff --git a/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrenthashmap/ConcurrentHashMapUnitTest.java b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrenthashmap/ConcurrentHashMapUnitTest.java new file mode 100644 index 0000000000..6a6aab868e --- /dev/null +++ b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrenthashmap/ConcurrentHashMapUnitTest.java @@ -0,0 +1,114 @@ +package com.baeldung.concurrenthashmap; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicLong; + +import static java.util.Arrays.asList; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ConcurrentHashMapUnitTest { + + private Map frequencyMap; + + @BeforeEach + public void setup() { + frequencyMap = new ConcurrentHashMap<>(); + frequencyMap.put(0, 0); + frequencyMap.put(1, 0); + frequencyMap.put(2, 0); + } + + @AfterEach + public void teardown() { + frequencyMap.clear(); + } + + @Test + public void givenOneThreadIsWriting_whenAnotherThreadReads_thenGetCorrectValue() throws Exception { + ExecutorService threadExecutor = Executors.newFixedThreadPool(3); + + Runnable writeAfter1Sec = () -> frequencyMap.computeIfPresent(1, (k, v) -> { + sleep(1); + return frequencyMap.get(k) + 1; + }); + + Callable readNow = () -> frequencyMap.get(1); + Callable readAfter1001Ms = () -> { + TimeUnit.MILLISECONDS.sleep(1001); + return frequencyMap.get(1); + }; + + threadExecutor.submit(writeAfter1Sec); + List> results = threadExecutor.invokeAll(asList(readNow, readAfter1001Ms)); + + assertEquals(0, results.get(0).get()); + assertEquals(1, results.get(1).get()); + + if (threadExecutor.awaitTermination(2, TimeUnit.SECONDS)) { + threadExecutor.shutdown(); + } + } + + @Test + public void givenOneThreadIsWriting_whenAnotherThreadWritesAtSameKey_thenWaitAndGetCorrectValue() throws Exception { + ExecutorService threadExecutor = Executors.newFixedThreadPool(2); + + Callable writeAfter5Sec = () -> frequencyMap.computeIfPresent(1, (k, v) -> { + sleep(5); + return frequencyMap.get(k) + 1; + }); + + Callable writeAfter1Sec = () -> frequencyMap.computeIfPresent(1, (k, v) -> { + sleep(1); + return frequencyMap.get(k) + 1; + }); + + List> results = threadExecutor.invokeAll(asList(writeAfter5Sec, writeAfter1Sec)); + + assertEquals(1, results.get(0).get()); + assertEquals(2, results.get(1).get()); + + if (threadExecutor.awaitTermination(2, TimeUnit.SECONDS)) { + threadExecutor.shutdown(); + } + } + + @Test + public void givenOneThreadIsWriting_whenAnotherThreadWritesAtDifferentKey_thenNotWaitAndGetCorrectValue() throws Exception { + ExecutorService threadExecutor = Executors.newFixedThreadPool(2); + + Callable writeAfter5Sec = () -> frequencyMap.computeIfPresent(1, (k, v) -> { + sleep(5); + return frequencyMap.get(k) + 1; + }); + + AtomicLong time = new AtomicLong(System.currentTimeMillis()); + Callable writeAfter1Sec = () -> frequencyMap.computeIfPresent(2, (k, v) -> { + sleep(1); + time.set((System.currentTimeMillis() - time.get()) / 1000); + return frequencyMap.get(k) + 1; + }); + + threadExecutor.invokeAll(asList(writeAfter5Sec, writeAfter1Sec)); + + assertEquals(1, time.get()); + + if (threadExecutor.awaitTermination(2, TimeUnit.SECONDS)) { + threadExecutor.shutdown(); + } + } + + private static void sleep(int timeout) { + try { + TimeUnit.SECONDS.sleep(timeout); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file From 343bc168219fe59e1a5ebbd6d7d88f86d4a62a57 Mon Sep 17 00:00:00 2001 From: Avin Buricha Date: Tue, 20 Dec 2022 07:57:11 +0530 Subject: [PATCH 156/592] BAEL-6002 | Article code (#13172) --- .../com/baeldung/jwt/auth0/JWTDecode.java | 90 +++++++++++++++++++ .../baeldung/jwt/auth0/JWTDecodeUnitTest.java | 71 +++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 security-modules/jwt/src/main/java/com/baeldung/jwt/auth0/JWTDecode.java create mode 100644 security-modules/jwt/src/test/java/com/baeldung/jwt/auth0/JWTDecodeUnitTest.java diff --git a/security-modules/jwt/src/main/java/com/baeldung/jwt/auth0/JWTDecode.java b/security-modules/jwt/src/main/java/com/baeldung/jwt/auth0/JWTDecode.java new file mode 100644 index 0000000000..61c40ec9c5 --- /dev/null +++ b/security-modules/jwt/src/main/java/com/baeldung/jwt/auth0/JWTDecode.java @@ -0,0 +1,90 @@ +package com.baeldung.jwt.auth0; + +import java.util.Date; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.exceptions.JWTDecodeException; +import com.auth0.jwt.exceptions.JWTVerificationException; +import com.auth0.jwt.interfaces.DecodedJWT; + +public class JWTDecode { + + private static final String SECRET = "baeldung"; + private static final String ISSUER = "Baeldung"; + private static final String SUBJECT = "Baeldung Details"; + private static final long TOKEN_VALIDITY_IN_MILLIS = 500L; + + private static Algorithm algorithm; + private static JWTVerifier verifier; + + public static void initialize() { + algorithm = Algorithm.HMAC256(SECRET); + + verifier = JWT.require(algorithm) + .withIssuer(ISSUER) + .build(); + } + + private static String createJWT() { + String jwtToken = JWT.create() + .withIssuer(ISSUER) + .withSubject(SUBJECT) + .withIssuedAt(new Date()) + .withExpiresAt(new Date(System.currentTimeMillis() + TOKEN_VALIDITY_IN_MILLIS)) + .sign(algorithm); + + return jwtToken; + } + + private static DecodedJWT verifyJWT(String jwtToken) { + try { + DecodedJWT decodedJWT = verifier.verify(jwtToken); + return decodedJWT; + } catch (JWTVerificationException e) { + System.out.println(e.getMessage()); + } + return null; + } + + private static DecodedJWT decodedJWT(String jwtToken) { + try { + DecodedJWT decodedJWT = JWT.decode(jwtToken); + return decodedJWT; + } catch (JWTDecodeException e) { + System.out.println(e.getMessage()); + } + return null; + } + + private static boolean isJWTExpired(DecodedJWT decodedJWT) { + Date expiresAt = decodedJWT.getExpiresAt(); + return expiresAt.before(new Date()); + } + + public static void main(String args[]) throws InterruptedException { + + initialize(); + + String jwtToken = createJWT(); + System.out.println("Created JWT : " + jwtToken); + + Thread.sleep(1000L); + + DecodedJWT decodedJWT = verifyJWT(jwtToken); + if (decodedJWT == null) { + System.out.println("JWT Verification Failed"); + } + + decodedJWT = decodedJWT(jwtToken); + if (decodedJWT != null) { + System.out.println("Token Issued At : " + decodedJWT.getIssuedAt()); + System.out.println("Token Expires At : " + decodedJWT.getExpiresAt()); + + Boolean isExpired = isJWTExpired(decodedJWT); + System.out.println("Is Expired : " + isExpired); + } + } + +} diff --git a/security-modules/jwt/src/test/java/com/baeldung/jwt/auth0/JWTDecodeUnitTest.java b/security-modules/jwt/src/test/java/com/baeldung/jwt/auth0/JWTDecodeUnitTest.java new file mode 100644 index 0000000000..8e51de63dc --- /dev/null +++ b/security-modules/jwt/src/test/java/com/baeldung/jwt/auth0/JWTDecodeUnitTest.java @@ -0,0 +1,71 @@ +package com.baeldung.jwt.auth0; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Date; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.interfaces.DecodedJWT; + +public class JWTDecodeUnitTest { + + private static final String SECRET = "baeldung"; + private static final String ISSUER = "Baeldung"; + private static final long TOKEN_VALIDITY_IN_MILLIS = 1000L; + + private static Algorithm algorithm; + private static JWTVerifier verifier; + private static String jwtToken; + + @BeforeAll + public static void setUp() { + algorithm = Algorithm.HMAC256(SECRET); + + verifier = JWT.require(algorithm) + .withIssuer(ISSUER) + .build(); + } + + private static boolean isJWTExpired(DecodedJWT decodedJWT) { + Date expiresAt = decodedJWT.getExpiresAt(); + return expiresAt.before(new Date()); + } + + private static DecodedJWT decodedJWT(String jwtToken) { + return JWT.decode(jwtToken); + } + + @Test + public void givenNotExpiredJWT_whenDecoded_thenCheckingIfNotExpired() { + + jwtToken = JWT.create() + .withIssuer(ISSUER) + .withExpiresAt(new Date(System.currentTimeMillis() + TOKEN_VALIDITY_IN_MILLIS)) + .sign(algorithm); + + DecodedJWT decodedJWT = decodedJWT(jwtToken); + assertNotNull(decodedJWT); + assertFalse(isJWTExpired(decodedJWT)); + } + + @Test + public void givenExpiredJWT_whenDecoded_thenCheckingIfExpired() { + + jwtToken = JWT.create() + .withIssuer(ISSUER) + .withExpiresAt(new Date(System.currentTimeMillis() - TOKEN_VALIDITY_IN_MILLIS)) + .sign(algorithm); + + DecodedJWT decodedJWT = decodedJWT(jwtToken); + assertNotNull(decodedJWT); + assertTrue(isJWTExpired(decodedJWT)); + } + +} From 015b146df02bfc6dfa93acd0527635faf3e1ee0f Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Tue, 20 Dec 2022 16:57:35 +0000 Subject: [PATCH 157/592] [JAVA-16560] Update .gitignore with generated derby.log file (#13162) --- security-modules/sql-injection-samples/.gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/security-modules/sql-injection-samples/.gitignore b/security-modules/sql-injection-samples/.gitignore index 82eca336e3..c167b56208 100644 --- a/security-modules/sql-injection-samples/.gitignore +++ b/security-modules/sql-injection-samples/.gitignore @@ -22,4 +22,7 @@ /nbbuild/ /dist/ /nbdist/ -/.nb-gradle/ \ No newline at end of file +/.nb-gradle/ + +derby.log + From 456652e02b1fe7d122965fce63e9f86cd9439ac3 Mon Sep 17 00:00:00 2001 From: freelansam <79205526+freelansam@users.noreply.github.com> Date: Tue, 20 Dec 2022 22:37:54 +0530 Subject: [PATCH 158/592] JAVA-16563: Fix formatting of POMs (#13175) --- .../core-java-collections-4/pom.xml | 2 +- .../core-java-collections-maps-2/pom.xml | 2 +- .../core-java-collections-maps-5/pom.xml | 25 ++--- core-java-modules/core-java-jvm-3/pom.xml | 1 - .../core-java-string-apis-2/pom.xml | 7 +- di-modules/cdi/pom.xml | 2 +- di-modules/dagger/pom.xml | 2 +- di-modules/flyway-cdi-extension/pom.xml | 2 +- di-modules/guice/pom.xml | 2 +- di-modules/pom.xml | 3 +- docker-modules/docker-caching/pom.xml | 3 +- docker-modules/pom.xml | 2 +- httpclient-simple/pom.xml | 7 +- javaxval-2/pom.xml | 4 +- jenkins-modules/pom.xml | 3 +- kubernetes-modules/kubernetes-spring/pom.xml | 96 ++++++++++--------- .../maven-download-artifacts/pom.xml | 27 +++--- messaging-modules/jgroups/pom.xml | 2 +- messaging-modules/pom.xml | 3 +- messaging-modules/spring-apache-camel/pom.xml | 4 +- messaging-modules/spring-jms/pom.xml | 2 +- .../design-patterns-architectural/pom.xml | 2 +- .../design-patterns-cloud/pom.xml | 39 ++++---- .../design-patterns-creational-2/pom.xml | 8 +- pdf-2/pom.xml | 2 +- persistence-modules/blaze-persistence/pom.xml | 27 +++--- persistence-modules/pom.xml | 5 +- .../spring-data-jpa-repo-2/pom.xml | 1 - saas-modules/jira-rest-integration/pom.xml | 4 +- saas-modules/pom.xml | 2 +- saas-modules/stripe/pom.xml | 2 +- saas-modules/twilio/pom.xml | 2 +- saas-modules/twitter4j/pom.xml | 2 +- security-modules/pom.xml | 2 +- server-modules/apache-tomcat/pom.xml | 3 +- server-modules/apache-tomcat/sso/pom.xml | 3 +- server-modules/netty/pom.xml | 2 +- server-modules/pom.xml | 3 +- server-modules/undertow/pom.xml | 2 +- .../spring-boot-3-native/pom.xml | 9 +- spring-boot-modules/spring-boot-3/pom.xml | 2 +- .../spring-boot-graphql/pom.xml | 82 ++++++++-------- spring-boot-modules/spring-boot-mvc-5/pom.xml | 28 +++--- .../spring-boot-process-automation/pom.xml | 4 +- .../spring-cloud-bus-client/pom.xml | 1 - .../spring-cloud-config/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- spring-native/pom.xml | 2 +- spring-reactive-modules/pom.xml | 2 +- .../spring-security-web-boot-1/pom.xml | 3 +- spring-web-modules/pom.xml | 2 +- tablesaw/pom.xml | 10 +- testing-modules/junit-5-advanced/pom.xml | 26 ++--- testing-modules/mockito-2/pom.xml | 24 ++--- testing-modules/spring-mockito/pom.xml | 1 + web-modules/google-web-toolkit/pom.xml | 13 +-- 57 files changed, 268 insertions(+), 259 deletions(-) diff --git a/core-java-modules/core-java-collections-4/pom.xml b/core-java-modules/core-java-collections-4/pom.xml index 51e2d6e0ee..9f1439b850 100644 --- a/core-java-modules/core-java-collections-4/pom.xml +++ b/core-java-modules/core-java-collections-4/pom.xml @@ -32,4 +32,4 @@ 3.12.0 - + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-2/pom.xml b/core-java-modules/core-java-collections-maps-2/pom.xml index da51adac53..1e526ef892 100644 --- a/core-java-modules/core-java-collections-maps-2/pom.xml +++ b/core-java-modules/core-java-collections-maps-2/pom.xml @@ -61,4 +61,4 @@ 8.1.0 - + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-5/pom.xml b/core-java-modules/core-java-collections-maps-5/pom.xml index 516a0de4be..f12e044b23 100644 --- a/core-java-modules/core-java-collections-maps-5/pom.xml +++ b/core-java-modules/core-java-collections-maps-5/pom.xml @@ -5,18 +5,6 @@ 4.0.0 core-java-collections-maps-5 0.1.0-SNAPSHOT - - - - org.apache.maven.plugins - maven-compiler-plugin - - 9 - 9 - - - - core-java-collections-maps-5 jar @@ -46,6 +34,19 @@ + + + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + + + + 5.2.5.RELEASE diff --git a/core-java-modules/core-java-jvm-3/pom.xml b/core-java-modules/core-java-jvm-3/pom.xml index 86c3799c09..cb2d8b0b85 100644 --- a/core-java-modules/core-java-jvm-3/pom.xml +++ b/core-java-modules/core-java-jvm-3/pom.xml @@ -15,7 +15,6 @@ - \ No newline at end of file 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 79e13e3ba5..ba983d7593 100644 --- a/core-java-modules/core-java-string-apis-2/pom.xml +++ b/core-java-modules/core-java-string-apis-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-string-apis-2 0.0.1-SNAPSHOT @@ -41,4 +41,5 @@ 3.12.0 31.1-jre - + + \ No newline at end of file diff --git a/di-modules/cdi/pom.xml b/di-modules/cdi/pom.xml index 647192bed2..bdba3429db 100644 --- a/di-modules/cdi/pom.xml +++ b/di-modules/cdi/pom.xml @@ -48,4 +48,4 @@ 1.9.2 - + \ No newline at end of file diff --git a/di-modules/dagger/pom.xml b/di-modules/dagger/pom.xml index 06a87b0475..59811c7c86 100644 --- a/di-modules/dagger/pom.xml +++ b/di-modules/dagger/pom.xml @@ -45,4 +45,4 @@ 2.16 - + \ No newline at end of file diff --git a/di-modules/flyway-cdi-extension/pom.xml b/di-modules/flyway-cdi-extension/pom.xml index 7e9b73a127..0865ae0834 100644 --- a/di-modules/flyway-cdi-extension/pom.xml +++ b/di-modules/flyway-cdi-extension/pom.xml @@ -55,4 +55,4 @@ 1.3.2 - + \ No newline at end of file diff --git a/di-modules/guice/pom.xml b/di-modules/guice/pom.xml index 39b1f20b76..cbadf2119d 100644 --- a/di-modules/guice/pom.xml +++ b/di-modules/guice/pom.xml @@ -26,4 +26,4 @@ 4.1.0 - + \ No newline at end of file diff --git a/di-modules/pom.xml b/di-modules/pom.xml index 675d6117a6..e6c86d48e6 100644 --- a/di-modules/pom.xml +++ b/di-modules/pom.xml @@ -19,4 +19,5 @@ flyway-cdi-extension guice - + + \ No newline at end of file diff --git a/docker-modules/docker-caching/pom.xml b/docker-modules/docker-caching/pom.xml index 6ee7bfc442..25572dfe4f 100644 --- a/docker-modules/docker-caching/pom.xml +++ b/docker-modules/docker-caching/pom.xml @@ -17,4 +17,5 @@ single-module-caching multi-module-caching - + + \ No newline at end of file diff --git a/docker-modules/pom.xml b/docker-modules/pom.xml index 89dbf80408..e71307b7e0 100644 --- a/docker-modules/pom.xml +++ b/docker-modules/pom.xml @@ -29,4 +29,4 @@ 11 - + \ No newline at end of file diff --git a/httpclient-simple/pom.xml b/httpclient-simple/pom.xml index edd2838f3a..45da1e7a39 100644 --- a/httpclient-simple/pom.xml +++ b/httpclient-simple/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 httpclient-simple 0.1-SNAPSHOT @@ -101,7 +101,6 @@ - org.apache.httpcomponents.core5 httpcore5 @@ -306,7 +305,7 @@ 2.5.1 4.4.11 4.5.8 - + 5.2 5.2 diff --git a/javaxval-2/pom.xml b/javaxval-2/pom.xml index fd4aa70023..a63d21969b 100644 --- a/javaxval-2/pom.xml +++ b/javaxval-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 javaxval-2 0.1-SNAPSHOT diff --git a/jenkins-modules/pom.xml b/jenkins-modules/pom.xml index 35777a08d8..5cbc47d1f4 100644 --- a/jenkins-modules/pom.xml +++ b/jenkins-modules/pom.xml @@ -16,4 +16,5 @@ plugins - + + \ No newline at end of file diff --git a/kubernetes-modules/kubernetes-spring/pom.xml b/kubernetes-modules/kubernetes-spring/pom.xml index d91e841bad..466808a6ce 100644 --- a/kubernetes-modules/kubernetes-spring/pom.xml +++ b/kubernetes-modules/kubernetes-spring/pom.xml @@ -1,50 +1,54 @@ - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.7.5 - - - com.example - demo - 0.0.1-SNAPSHOT - demo - Demo project for Spring Boot - - 11 - - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-webflux - + + 4.0.0 + com.example + demo + 0.0.1-SNAPSHOT + demo + Demo project for Spring Boot - - org.springframework.boot - spring-boot-starter-test - test - - - io.projectreactor - reactor-test - test - - + + org.springframework.boot + spring-boot-starter-parent + 2.7.5 + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-webflux + - + + org.springframework.boot + spring-boot-starter-test + test + + + io.projectreactor + reactor-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + 11 + + + \ No newline at end of file diff --git a/maven-modules/maven-repositories/maven-download-artifacts/pom.xml b/maven-modules/maven-repositories/maven-download-artifacts/pom.xml index 15173f8d60..53db99e59a 100644 --- a/maven-modules/maven-repositories/maven-download-artifacts/pom.xml +++ b/maven-modules/maven-repositories/maven-download-artifacts/pom.xml @@ -13,6 +13,19 @@ 1.0.0-SNAPSHOT + + + com.baeldung + maven-release-repository + 1.0.0 + + + com.baeldung + maven-snapshot-repository + 1.0.0-SNAPSHOT + + + nexus-snapshot @@ -35,18 +48,4 @@ - - - com.baeldung - maven-release-repository - 1.0.0 - - - - com.baeldung - maven-snapshot-repository - 1.0.0-SNAPSHOT - - - \ No newline at end of file diff --git a/messaging-modules/jgroups/pom.xml b/messaging-modules/jgroups/pom.xml index ec094ac53a..12939c86b1 100644 --- a/messaging-modules/jgroups/pom.xml +++ b/messaging-modules/jgroups/pom.xml @@ -31,4 +31,4 @@ 4.0.10.Final - + \ No newline at end of file diff --git a/messaging-modules/pom.xml b/messaging-modules/pom.xml index 0fa5d81c40..f843b0fe11 100644 --- a/messaging-modules/pom.xml +++ b/messaging-modules/pom.xml @@ -21,4 +21,5 @@ spring-apache-camel spring-jms - + + \ No newline at end of file diff --git a/messaging-modules/spring-apache-camel/pom.xml b/messaging-modules/spring-apache-camel/pom.xml index 8ba1697d3d..9f2e74dc36 100644 --- a/messaging-modules/spring-apache-camel/pom.xml +++ b/messaging-modules/spring-apache-camel/pom.xml @@ -14,7 +14,7 @@ messaging-modules 0.0.1-SNAPSHOT - + org.apache.camel @@ -65,4 +65,4 @@ 4.3.4.RELEASE - + \ No newline at end of file diff --git a/messaging-modules/spring-jms/pom.xml b/messaging-modules/spring-jms/pom.xml index 398a2ec54c..b94a31c0c5 100644 --- a/messaging-modules/spring-jms/pom.xml +++ b/messaging-modules/spring-jms/pom.xml @@ -85,4 +85,4 @@ 1.5.10.RELEASE - + \ No newline at end of file diff --git a/patterns-modules/design-patterns-architectural/pom.xml b/patterns-modules/design-patterns-architectural/pom.xml index 80c9b65b41..2d6117a406 100644 --- a/patterns-modules/design-patterns-architectural/pom.xml +++ b/patterns-modules/design-patterns-architectural/pom.xml @@ -74,4 +74,4 @@ 3.14.0 - + \ No newline at end of file diff --git a/patterns-modules/design-patterns-cloud/pom.xml b/patterns-modules/design-patterns-cloud/pom.xml index f166a02fba..acd3e64ed5 100644 --- a/patterns-modules/design-patterns-cloud/pom.xml +++ b/patterns-modules/design-patterns-cloud/pom.xml @@ -1,23 +1,24 @@ - 4.0.0 - design-patterns-cloud - design-patterns-cloud - jar + 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-cloud + design-patterns-cloud + jar - - com.baeldung - patterns-modules - 1.0.0-SNAPSHOT - + + com.baeldung + patterns-modules + 1.0.0-SNAPSHOT + - - - io.github.resilience4j - resilience4j-retry - 1.7.1 - - - + + + io.github.resilience4j + resilience4j-retry + 1.7.1 + + + + \ No newline at end of file diff --git a/patterns-modules/design-patterns-creational-2/pom.xml b/patterns-modules/design-patterns-creational-2/pom.xml index 2a29a9cd6d..fe79052a99 100644 --- a/patterns-modules/design-patterns-creational-2/pom.xml +++ b/patterns-modules/design-patterns-creational-2/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 design-patterns-creational-2 design-patterns-creational-2 @@ -10,4 +11,5 @@ com.baeldung 1.0.0-SNAPSHOT - + + \ No newline at end of file diff --git a/pdf-2/pom.xml b/pdf-2/pom.xml index 1c752a9e9c..653b55a206 100644 --- a/pdf-2/pom.xml +++ b/pdf-2/pom.xml @@ -38,7 +38,7 @@ - pdf + pdf-2 src/main/resources diff --git a/persistence-modules/blaze-persistence/pom.xml b/persistence-modules/blaze-persistence/pom.xml index cc57785fe9..dfe4a69eab 100644 --- a/persistence-modules/blaze-persistence/pom.xml +++ b/persistence-modules/blaze-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 blaze-persistence 1.0-SNAPSHOT @@ -11,16 +11,9 @@ org.springframework.boot spring-boot-starter-parent 2.4.0 - + - - UTF-8 - 1.8 - 1.8 - 1.6.8 - - @@ -38,7 +31,6 @@ org.springframework.boot spring-boot-starter-data-jpa - com.blazebit @@ -52,7 +44,6 @@ com.blazebit blaze-persistence-integration-hibernate-5.4 - com.blazebit @@ -66,7 +57,6 @@ com.blazebit blaze-persistence-entity-view-processor - com.blazebit @@ -76,7 +66,6 @@ com.blazebit blaze-persistence-integration-spring-data-2.4 - org.springframework @@ -86,12 +75,10 @@ org.springframework spring-orm - com.h2database h2 - org.springframework @@ -118,4 +105,12 @@ + + + UTF-8 + 1.8 + 1.8 + 1.6.8 + + \ No newline at end of file diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index c17e793dbc..7d45074d52 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -75,7 +75,8 @@ spring-data-dynamodb spring-data-eclipselink spring-data-elasticsearch - + + spring-data-geode spring-data-jpa-annotations spring-data-jpa-crud @@ -117,4 +118,4 @@ 1.16.3 - + \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-2/pom.xml b/persistence-modules/spring-data-jpa-repo-2/pom.xml index 748623c91a..9240a00ee2 100644 --- a/persistence-modules/spring-data-jpa-repo-2/pom.xml +++ b/persistence-modules/spring-data-jpa-repo-2/pom.xml @@ -34,7 +34,6 @@ com.h2database h2 - com.google.guava guava diff --git a/saas-modules/jira-rest-integration/pom.xml b/saas-modules/jira-rest-integration/pom.xml index 9441691d49..ebf36646e4 100644 --- a/saas-modules/jira-rest-integration/pom.xml +++ b/saas-modules/jira-rest-integration/pom.xml @@ -27,7 +27,7 @@ - saas + jira-rest-integration src/main/resources @@ -65,4 +65,4 @@ 2.6.1 - + \ No newline at end of file diff --git a/saas-modules/pom.xml b/saas-modules/pom.xml index db319442c3..7a626e7663 100644 --- a/saas-modules/pom.xml +++ b/saas-modules/pom.xml @@ -33,4 +33,4 @@ - + \ No newline at end of file diff --git a/saas-modules/stripe/pom.xml b/saas-modules/stripe/pom.xml index 468c62ac85..44bc5be4a8 100644 --- a/saas-modules/stripe/pom.xml +++ b/saas-modules/stripe/pom.xml @@ -39,4 +39,4 @@ 4.2.0 - + \ No newline at end of file diff --git a/saas-modules/twilio/pom.xml b/saas-modules/twilio/pom.xml index 8e3271f482..9c1b1cde9d 100644 --- a/saas-modules/twilio/pom.xml +++ b/saas-modules/twilio/pom.xml @@ -24,4 +24,4 @@ 7.20.0 - + \ No newline at end of file diff --git a/saas-modules/twitter4j/pom.xml b/saas-modules/twitter4j/pom.xml index 2acee4583f..ca46365c49 100644 --- a/saas-modules/twitter4j/pom.xml +++ b/saas-modules/twitter4j/pom.xml @@ -25,4 +25,4 @@ 4.0.6 - + \ No newline at end of file diff --git a/security-modules/pom.xml b/security-modules/pom.xml index 1ed081a273..70f29cecd7 100644 --- a/security-modules/pom.xml +++ b/security-modules/pom.xml @@ -22,7 +22,7 @@ jjwt jwt oauth2-framework-impl - sql-injection-samples + sql-injection-samples \ No newline at end of file diff --git a/server-modules/apache-tomcat/pom.xml b/server-modules/apache-tomcat/pom.xml index f9a0dfaf4a..6d93a4a636 100644 --- a/server-modules/apache-tomcat/pom.xml +++ b/server-modules/apache-tomcat/pom.xml @@ -28,4 +28,5 @@ - + + \ No newline at end of file diff --git a/server-modules/apache-tomcat/sso/pom.xml b/server-modules/apache-tomcat/sso/pom.xml index d46fe45f66..e11c22efc9 100644 --- a/server-modules/apache-tomcat/sso/pom.xml +++ b/server-modules/apache-tomcat/sso/pom.xml @@ -3,7 +3,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.apache_tomcat sso 1.0.0-SNAPSHOT @@ -15,4 +14,4 @@ 1.0.0-SNAPSHOT - + \ No newline at end of file diff --git a/server-modules/netty/pom.xml b/server-modules/netty/pom.xml index 698b693a7d..401bd2cb61 100644 --- a/server-modules/netty/pom.xml +++ b/server-modules/netty/pom.xml @@ -30,4 +30,4 @@ 2.4.0 - + \ No newline at end of file diff --git a/server-modules/pom.xml b/server-modules/pom.xml index 5e66256e3a..fa69c9637a 100644 --- a/server-modules/pom.xml +++ b/server-modules/pom.xml @@ -19,4 +19,5 @@ undertow wildfly - + + \ No newline at end of file diff --git a/server-modules/undertow/pom.xml b/server-modules/undertow/pom.xml index b40789f37d..7d446c29d2 100644 --- a/server-modules/undertow/pom.xml +++ b/server-modules/undertow/pom.xml @@ -50,4 +50,4 @@ 3.0.2 - + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-native/pom.xml b/spring-boot-modules/spring-boot-3-native/pom.xml index 411e9d652b..a70cc08755 100644 --- a/spring-boot-modules/spring-boot-3-native/pom.xml +++ b/spring-boot-modules/spring-boot-3-native/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-native 0.0.1-SNAPSHOT @@ -53,7 +53,8 @@ - + + native @@ -82,4 +83,4 @@ 0.9.17 - + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/pom.xml b/spring-boot-modules/spring-boot-3/pom.xml index 2fcb8cd8e1..cc8e7e1426 100644 --- a/spring-boot-modules/spring-boot-3/pom.xml +++ b/spring-boot-modules/spring-boot-3/pom.xml @@ -126,4 +126,4 @@ 3.0.0-M7 - + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-graphql/pom.xml b/spring-boot-modules/spring-boot-graphql/pom.xml index 628babbd3f..b4b449166f 100644 --- a/spring-boot-modules/spring-boot-graphql/pom.xml +++ b/spring-boot-modules/spring-boot-graphql/pom.xml @@ -13,47 +13,6 @@ 1.0.0-SNAPSHOT - - - - kr.motd.maven - os-maven-plugin - 1.7.0 - - - - - org.xolstice.maven.plugins - protobuf-maven-plugin - ${protobuf-plugin.version} - - com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier} - grpc-java - io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier} - - - - - compile - compile-custom - - - - - - - - - 3.19.2 - 0.6.1 - 1.43.2 - 2.13.1.RELEASE - 1.5.1 - 1.3.5 - 1.6.2 - 3.3.2 - - org.springframework.boot @@ -119,4 +78,45 @@ + + + + kr.motd.maven + os-maven-plugin + 1.7.0 + + + + + org.xolstice.maven.plugins + protobuf-maven-plugin + ${protobuf-plugin.version} + + com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier} + grpc-java + io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier} + + + + + compile + compile-custom + + + + + + + + + 3.19.2 + 0.6.1 + 1.43.2 + 2.13.1.RELEASE + 1.5.1 + 1.3.5 + 1.6.2 + 3.3.2 + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-5/pom.xml b/spring-boot-modules/spring-boot-mvc-5/pom.xml index 61b27ea8f1..5a4f8a6cce 100644 --- a/spring-boot-modules/spring-boot-mvc-5/pom.xml +++ b/spring-boot-modules/spring-boot-mvc-5/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-mvc-5 spring-boot-mvc-5 @@ -14,6 +14,18 @@ 1.0.0-SNAPSHOT + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + org.springframework.boot @@ -39,18 +51,6 @@ - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - - diff --git a/spring-boot-modules/spring-boot-process-automation/pom.xml b/spring-boot-modules/spring-boot-process-automation/pom.xml index 8ceb6c9a5c..a68fc95ea5 100644 --- a/spring-boot-modules/spring-boot-process-automation/pom.xml +++ b/spring-boot-modules/spring-boot-process-automation/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-process-automation diff --git a/spring-cloud-modules/spring-cloud-bus/spring-cloud-bus-client/pom.xml b/spring-cloud-modules/spring-cloud-bus/spring-cloud-bus-client/pom.xml index 0c6212c877..c6dfa3189d 100644 --- a/spring-cloud-modules/spring-cloud-bus/spring-cloud-bus-client/pom.xml +++ b/spring-cloud-modules/spring-cloud-bus/spring-cloud-bus-client/pom.xml @@ -14,7 +14,6 @@ 1.0.0-SNAPSHOT - org.springframework.cloud diff --git a/spring-cloud-modules/spring-cloud-config/pom.xml b/spring-cloud-modules/spring-cloud-config/pom.xml index efbf30d0b2..c256e82d1b 100644 --- a/spring-cloud-modules/spring-cloud-config/pom.xml +++ b/spring-cloud-modules/spring-cloud-config/pom.xml @@ -38,4 +38,4 @@ 2021.0.3 - + \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-config/spring-cloud-config-overriding-properties-client/pom.xml b/spring-cloud-modules/spring-cloud-config/spring-cloud-config-overriding-properties-client/pom.xml index d297e5b44d..06c6385928 100644 --- a/spring-cloud-modules/spring-cloud-config/spring-cloud-config-overriding-properties-client/pom.xml +++ b/spring-cloud-modules/spring-cloud-config/spring-cloud-config-overriding-properties-client/pom.xml @@ -37,4 +37,4 @@ - + \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-config/spring-cloud-config-overriding-properties-server/pom.xml b/spring-cloud-modules/spring-cloud-config/spring-cloud-config-overriding-properties-server/pom.xml index bcaa64e0d1..7eef867eeb 100644 --- a/spring-cloud-modules/spring-cloud-config/spring-cloud-config-overriding-properties-server/pom.xml +++ b/spring-cloud-modules/spring-cloud-config/spring-cloud-config-overriding-properties-server/pom.xml @@ -28,4 +28,4 @@ - + \ No newline at end of file diff --git a/spring-native/pom.xml b/spring-native/pom.xml index 0cd502fbc1..6940ee462b 100644 --- a/spring-native/pom.xml +++ b/spring-native/pom.xml @@ -78,4 +78,4 @@ 2.17.1 - + \ No newline at end of file diff --git a/spring-reactive-modules/pom.xml b/spring-reactive-modules/pom.xml index 3352a00113..0d9ea6bf5d 100644 --- a/spring-reactive-modules/pom.xml +++ b/spring-reactive-modules/pom.xml @@ -64,4 +64,4 @@ - + \ No newline at end of file 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 d9f797cb6c..fa0fd567fe 100644 --- a/spring-security-modules/spring-security-web-boot-1/pom.xml +++ b/spring-security-modules/spring-security-web-boot-1/pom.xml @@ -217,8 +217,7 @@ com.baeldung.roles.custom.Application - + 1.1.2 diff --git a/spring-web-modules/pom.xml b/spring-web-modules/pom.xml index 0f8465ce98..047dbaaad0 100644 --- a/spring-web-modules/pom.xml +++ b/spring-web-modules/pom.xml @@ -52,4 +52,4 @@ spring-web-url - + \ No newline at end of file diff --git a/tablesaw/pom.xml b/tablesaw/pom.xml index b54c9aa13e..f38e4cb8b4 100644 --- a/tablesaw/pom.xml +++ b/tablesaw/pom.xml @@ -20,10 +20,6 @@ - - 0.43.1 - - @@ -38,4 +34,8 @@ - + + 0.43.1 + + + \ No newline at end of file diff --git a/testing-modules/junit-5-advanced/pom.xml b/testing-modules/junit-5-advanced/pom.xml index ae6fd1559e..f3e8d3f9a3 100644 --- a/testing-modules/junit-5-advanced/pom.xml +++ b/testing-modules/junit-5-advanced/pom.xml @@ -30,20 +30,22 @@ - - - org.apache.maven.plugins - maven-surefire-plugin - - - -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar - - true - - - + + + org.apache.maven.plugins + maven-surefire-plugin + + + -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar + + true + + + + 1.49 + \ No newline at end of file diff --git a/testing-modules/mockito-2/pom.xml b/testing-modules/mockito-2/pom.xml index 6ce6e8fca0..25e9fd51a2 100644 --- a/testing-modules/mockito-2/pom.xml +++ b/testing-modules/mockito-2/pom.xml @@ -1,22 +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 + mockito-2 + testing-modules com.baeldung 1.0.0-SNAPSHOT - 4.0.0 - - mockito-2 - - - 8 - 8 - UTF-8 - 4.8.1 - @@ -27,4 +20,11 @@ + + 8 + 8 + UTF-8 + 4.8.1 + + \ No newline at end of file diff --git a/testing-modules/spring-mockito/pom.xml b/testing-modules/spring-mockito/pom.xml index 36504ab306..6283ea2d1f 100644 --- a/testing-modules/spring-mockito/pom.xml +++ b/testing-modules/spring-mockito/pom.xml @@ -31,4 +31,5 @@ lombok + \ No newline at end of file diff --git a/web-modules/google-web-toolkit/pom.xml b/web-modules/google-web-toolkit/pom.xml index 2d5a1fa324..1fdb38f0a1 100644 --- a/web-modules/google-web-toolkit/pom.xml +++ b/web-modules/google-web-toolkit/pom.xml @@ -47,8 +47,8 @@ - + + ${project.build.directory}/${project.build.finalName}/WEB-INF/classes @@ -68,8 +68,8 @@ com.baeldung.Google_web_toolkit Google_web_toolkit true - + + ${maven.compiler.source} @@ -97,8 +97,9 @@ - + + + 1.8 1.8 2.8.2 From 0e5e21f2aebbacd5d8597b2fac040163f70a15fb Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 20 Dec 2022 23:17:29 +0530 Subject: [PATCH 159/592] Java 15439 PR to check failing test for modules fixed till date (#13150) * JAVA-15439 Upgrade h2 database version - libraries-testing and deltaspike modules * JAVA-15439 Fix for hibernate-queries, hibernate-5, java-jpa-2, java-jpa-3 modules * JAVA-15439 Fix for java-jpa, spring-jpa, spring-jpa-2 modules * JAVA-15439 Revert changes for java-jpa-2 module * JAVA-15439 Fix for core-java-persistence-2 and hibernate-exceptions modules * JAVA-15439 Modules hibernate-mapping-2, read-only-transactions, log4j2, spring-data-eclipselink --- libraries-testing/pom.xml | 2 +- .../baeldung/dbunit/ConnectionSettings.java | 2 +- logging-modules/log4j2/pom.xml | 2 +- .../log4j2/tests/jdbc/ConnectionFactory.java | 2 +- .../core-java-persistence-2/pom.xml | 2 +- .../ResultSet2JSONUnitTest.java | 4 ++-- persistence-modules/deltaspike/pom.xml | 2 +- .../test/resources/META-INF/persistence.xml | 2 +- .../hibernate-exceptions/pom.xml | 2 +- .../main/resources/META-INF/persistence.xml | 2 +- .../hibernate-mapping-2/pom.xml | 2 +- .../main/resources/persistence-h2.properties | 2 +- .../src/test/resources/manytomany.cfg.xml | 2 +- persistence-modules/hibernate-queries/pom.xml | 2 +- .../scalarmethod/HibernateScalarExample.java | 4 ++-- .../HibernateScalarExampleUnitTest.java | 2 +- .../src/test/resources/criteria.cfg.xml | 2 +- .../resources/hibernate-namedquery.properties | 2 +- .../src/test/resources/hibernate.properties | 2 +- persistence-modules/hibernate5/pom.xml | 4 ++-- .../resources/hibernate-lifecycle.properties | 2 +- .../hibernate-namingstrategy.properties | 2 +- persistence-modules/java-jpa-3/pom.xml | 2 +- .../ignorable/fields/HibernateConfig.java | 2 +- .../test/resources/META-INF/persistence.xml | 6 ++--- persistence-modules/java-jpa/pom.xml | 2 +- .../main/resources/META-INF/persistence.xml | 6 ++--- .../read-only-transactions/pom.xml | 2 +- .../readonlytransactions/h2/Config.java | 2 +- .../spring-data-eclipselink/pom.xml | 2 +- .../src/main/resources/application.properties | 2 +- persistence-modules/spring-jpa-2/pom.xml | 2 +- .../src/test/resources/manytomany/db.sql | 22 +++++++++---------- persistence-modules/spring-jpa/pom.xml | 2 +- .../resources/persistence-student.properties | 2 +- 35 files changed, 52 insertions(+), 52 deletions(-) diff --git a/libraries-testing/pom.xml b/libraries-testing/pom.xml index 15b454d5c6..2aaad59e09 100644 --- a/libraries-testing/pom.xml +++ b/libraries-testing/pom.xml @@ -189,7 +189,7 @@ 2.7.0 0.14.1 1.0.0 - 1.4.200 + 2.1.214 \ No newline at end of file diff --git a/libraries-testing/src/test/java/com/baeldung/dbunit/ConnectionSettings.java b/libraries-testing/src/test/java/com/baeldung/dbunit/ConnectionSettings.java index cc29d9c58a..0ac5dff496 100644 --- a/libraries-testing/src/test/java/com/baeldung/dbunit/ConnectionSettings.java +++ b/libraries-testing/src/test/java/com/baeldung/dbunit/ConnectionSettings.java @@ -2,7 +2,7 @@ package com.baeldung.dbunit; public class ConnectionSettings { public static final String JDBC_DRIVER = org.h2.Driver.class.getName(); - public static final String JDBC_URL = "jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:dbunit/schema.sql'"; + public static final String JDBC_URL = "jdbc:h2:mem:default;MODE=LEGACY;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:dbunit/schema.sql'"; public static final String USER = "sa"; public static final String PASSWORD = ""; } diff --git a/logging-modules/log4j2/pom.xml b/logging-modules/log4j2/pom.xml index 02530055e1..7478bf5cdc 100644 --- a/logging-modules/log4j2/pom.xml +++ b/logging-modules/log4j2/pom.xml @@ -113,7 +113,7 @@ 2.1.1 2.17.1 yyyyMMddHHmmss - 1.4.200 + 2.1.214 \ No newline at end of file diff --git a/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java b/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java index 73b323f335..c084fc44b9 100644 --- a/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java +++ b/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java @@ -16,7 +16,7 @@ public class ConnectionFactory { private ConnectionFactory() { dataSource = new BasicDataSource(); dataSource.setDriver(new Driver()); - dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1"); + dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1;NON_KEYWORDS=WHEN"); } public static Connection getConnection() throws SQLException { diff --git a/persistence-modules/core-java-persistence-2/pom.xml b/persistence-modules/core-java-persistence-2/pom.xml index 472484d166..0bec7a808f 100644 --- a/persistence-modules/core-java-persistence-2/pom.xml +++ b/persistence-modules/core-java-persistence-2/pom.xml @@ -79,7 +79,7 @@ 3.11.11 20220320 07.00.00-MS-GA - 1.4.200 + 2.1.214 \ No newline at end of file diff --git a/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/resultset2json/ResultSet2JSONUnitTest.java b/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/resultset2json/ResultSet2JSONUnitTest.java index f3dd8350fa..4ca3ca23ef 100644 --- a/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/resultset2json/ResultSet2JSONUnitTest.java +++ b/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/resultset2json/ResultSet2JSONUnitTest.java @@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; public class ResultSet2JSONUnitTest { JSONObject object = new JSONObject( - "{\"records\":[[\"doe1\",\"7173\",\"John\",\"Doe\"],[\"smith3\",\"3722\",\"Dana\",\"Smith\"],[\"john22\",\"5490\",\"John\",\"Wang\"]],\"fields\":[{\"schema\":\"PUBLIC\",\"name\":\"USERNAME\",\"type\":\"VARCHAR\",\"table\":\"WORDS\"},{\"schema\":\"PUBLIC\",\"name\":\"ID\",\"type\":\"VARCHAR\",\"table\":\"WORDS\"},{\"schema\":\"PUBLIC\",\"name\":\"First name\",\"type\":\"VARCHAR\",\"table\":\"WORDS\"},{\"schema\":\"PUBLIC\",\"name\":\"Last name\",\"type\":\"VARCHAR\",\"table\":\"WORDS\"}]}"); + "{\"records\":[[\"doe1\",\"7173\",\"John\",\"Doe\"],[\"smith3\",\"3722\",\"Dana\",\"Smith\"],[\"john22\",\"5490\",\"John\",\"Wang\"]],\"fields\":[{\"schema\":\"PUBLIC\",\"name\":\"USERNAME\",\"type\":\"OTHER\",\"table\":\"WORDS\"},{\"schema\":\"PUBLIC\",\"name\":\"ID\",\"type\":\"OTHER\",\"table\":\"WORDS\"},{\"schema\":\"PUBLIC\",\"name\":\"First name\",\"type\":\"OTHER\",\"table\":\"WORDS\"},{\"schema\":\"PUBLIC\",\"name\":\"Last name\",\"type\":\"OTHER\",\"table\":\"WORDS\"}]}"); JSONArray array = new JSONArray( "[{\"USERNAME\":\"doe1\",\"First name\":\"John\",\"ID\":\"7173\",\"Last name\":\"Doe\"},{\"USERNAME\":\"smith3\",\"First name\":\"Dana\",\"ID\":\"3722\",\"Last name\":\"Smith\"},{\"USERNAME\":\"john22\",\"First name\":\"John\",\"ID\":\"5490\",\"Last name\":\"Wang\"}]"); @@ -43,7 +43,7 @@ public class ResultSet2JSONUnitTest { @Test void whenResultSetConvertedUsingJOOQDefaultApproach_shouldMatchJSON() throws SQLException, ClassNotFoundException { Class.forName("org.h2.Driver"); - Connection dbConnection = DriverManager.getConnection("jdbc:h2:mem:rs2jdbc2", "user", "password"); + Connection dbConnection = DriverManager.getConnection("jdbc:h2:mem:rs2jdbc2;MODE=LEGACY", "user", "password"); // Create a table Statement stmt = dbConnection.createStatement(); stmt.execute("CREATE TABLE words AS SELECT * FROM CSVREAD('./example.csv')"); diff --git a/persistence-modules/deltaspike/pom.xml b/persistence-modules/deltaspike/pom.xml index 5c905b996c..974a61d618 100644 --- a/persistence-modules/deltaspike/pom.xml +++ b/persistence-modules/deltaspike/pom.xml @@ -293,7 +293,7 @@ 2.6 1.1.3 1.2.4.Final - 1.4.200 + 2.1.214 \ No newline at end of file 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 ee69855138..ffcf20878c 100644 --- a/persistence-modules/deltaspike/src/test/resources/META-INF/persistence.xml +++ b/persistence-modules/deltaspike/src/test/resources/META-INF/persistence.xml @@ -28,7 +28,7 @@ - + diff --git a/persistence-modules/hibernate-exceptions/pom.xml b/persistence-modules/hibernate-exceptions/pom.xml index efa18e1b72..4bef688715 100644 --- a/persistence-modules/hibernate-exceptions/pom.xml +++ b/persistence-modules/hibernate-exceptions/pom.xml @@ -39,7 +39,7 @@ 2.4.0 2.3.0 - 1.4.200 + 2.1.214 \ No newline at end of file diff --git a/persistence-modules/hibernate-exceptions/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate-exceptions/src/main/resources/META-INF/persistence.xml index 4e83a57f48..a154b41eb5 100644 --- a/persistence-modules/hibernate-exceptions/src/main/resources/META-INF/persistence.xml +++ b/persistence-modules/hibernate-exceptions/src/main/resources/META-INF/persistence.xml @@ -15,7 +15,7 @@ - + diff --git a/persistence-modules/hibernate-mapping-2/pom.xml b/persistence-modules/hibernate-mapping-2/pom.xml index 5ecb9e8b73..2a787a0e46 100644 --- a/persistence-modules/hibernate-mapping-2/pom.xml +++ b/persistence-modules/hibernate-mapping-2/pom.xml @@ -81,7 +81,7 @@ 9.0.0.M26 2.3.0.1 2.3.1 - 1.4.200 + 2.1.214 \ No newline at end of file diff --git a/persistence-modules/hibernate-mapping-2/src/main/resources/persistence-h2.properties b/persistence-modules/hibernate-mapping-2/src/main/resources/persistence-h2.properties index 9c8cf6e02b..33badc9b62 100644 --- a/persistence-modules/hibernate-mapping-2/src/main/resources/persistence-h2.properties +++ b/persistence-modules/hibernate-mapping-2/src/main/resources/persistence-h2.properties @@ -1,6 +1,6 @@ # jdbc.X jdbc.driverClassName=org.h2.Driver -jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 +jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1;MODE=LEGACY jdbc.eventGeneratedId=sa jdbc.user=sa jdbc.pass= diff --git a/persistence-modules/hibernate-mapping-2/src/test/resources/manytomany.cfg.xml b/persistence-modules/hibernate-mapping-2/src/test/resources/manytomany.cfg.xml index 3ddff9a993..db7bc6ab8e 100644 --- a/persistence-modules/hibernate-mapping-2/src/test/resources/manytomany.cfg.xml +++ b/persistence-modules/hibernate-mapping-2/src/test/resources/manytomany.cfg.xml @@ -6,7 +6,7 @@ org.h2.Driver - jdbc:h2:mem:spring_hibernate_many_to_many + jdbc:h2:mem:spring_hibernate_many_to_many;MODE=LEGACY sa org.hibernate.dialect.H2Dialect thread diff --git a/persistence-modules/hibernate-queries/pom.xml b/persistence-modules/hibernate-queries/pom.xml index a2949e1513..e530ea2555 100644 --- a/persistence-modules/hibernate-queries/pom.xml +++ b/persistence-modules/hibernate-queries/pom.xml @@ -87,7 +87,7 @@ 9.0.0.M26 6.0.6 2.2.3 - 1.4.200 + 2.1.214 \ No newline at end of file diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/scalarmethod/HibernateScalarExample.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/scalarmethod/HibernateScalarExample.java index 69aaaae19d..4cbb6f40de 100644 --- a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/scalarmethod/HibernateScalarExample.java +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/scalarmethod/HibernateScalarExample.java @@ -39,8 +39,8 @@ public class HibernateScalarExample { .list(); } - public Integer fetchAvgAgeWithScalar() { - return (Integer) session.createNativeQuery("SELECT AVG(age) as avgAge FROM Student student") + public Double fetchAvgAgeWithScalar() { + return (Double) session.createNativeQuery("SELECT AVG(age) as avgAge FROM Student student") .addScalar("avgAge") .uniqueResult(); } diff --git a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/scalarmethod/HibernateScalarExampleUnitTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/scalarmethod/HibernateScalarExampleUnitTest.java index ca01c5cb84..1752c11712 100644 --- a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/scalarmethod/HibernateScalarExampleUnitTest.java +++ b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/scalarmethod/HibernateScalarExampleUnitTest.java @@ -73,7 +73,7 @@ public class HibernateScalarExampleUnitTest { @Test public void whenScalarUsedForAvgAge_ThenSingleValueReturned() { - Integer avgAge = scalarExample.fetchAvgAgeWithScalar(); + Double avgAge = scalarExample.fetchAvgAgeWithScalar(); assertEquals(true, (avgAge >= 5 && avgAge <= 24)); } diff --git a/persistence-modules/hibernate-queries/src/test/resources/criteria.cfg.xml b/persistence-modules/hibernate-queries/src/test/resources/criteria.cfg.xml index 30d8168c5c..d46213ebc6 100644 --- a/persistence-modules/hibernate-queries/src/test/resources/criteria.cfg.xml +++ b/persistence-modules/hibernate-queries/src/test/resources/criteria.cfg.xml @@ -6,7 +6,7 @@ org.h2.Driver - jdbc:h2:mem:testdb + jdbc:h2:mem:testdb;MODE=LEGACY sa org.hibernate.dialect.H2Dialect diff --git a/persistence-modules/hibernate-queries/src/test/resources/hibernate-namedquery.properties b/persistence-modules/hibernate-queries/src/test/resources/hibernate-namedquery.properties index 120212070a..4fc32325da 100644 --- a/persistence-modules/hibernate-queries/src/test/resources/hibernate-namedquery.properties +++ b/persistence-modules/hibernate-queries/src/test/resources/hibernate-namedquery.properties @@ -1,5 +1,5 @@ hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM 'src/main/resources/init_database.sql' +hibernate.connection.url=jdbc:h2:mem:mydb1;MODE=LEGACY;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM 'src/main/resources/init_database.sql' hibernate.connection.username=sa hibernate.connection.autocommit=true jdbc.password= diff --git a/persistence-modules/hibernate-queries/src/test/resources/hibernate.properties b/persistence-modules/hibernate-queries/src/test/resources/hibernate.properties index c202f59f82..2d1b8dcb5d 100644 --- a/persistence-modules/hibernate-queries/src/test/resources/hibernate.properties +++ b/persistence-modules/hibernate-queries/src/test/resources/hibernate.properties @@ -1,5 +1,5 @@ hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 +hibernate.connection.url=jdbc:h2:mem:mydb1;MODE=LEGACY;DB_CLOSE_DELAY=-1 hibernate.connection.username=sa hibernate.connection.autocommit=true jdbc.password= diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml index 8f5ab01f77..1a2c65c6ba 100644 --- a/persistence-modules/hibernate5/pom.xml +++ b/persistence-modules/hibernate5/pom.xml @@ -57,10 +57,10 @@ - 5.4.12.Final + 5.4.24.Final 6.0.6 2.2.3 - 1.4.200 + 2.1.214 \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/test/resources/hibernate-lifecycle.properties b/persistence-modules/hibernate5/src/test/resources/hibernate-lifecycle.properties index 1a5e6482bf..a1014d77ef 100644 --- a/persistence-modules/hibernate5/src/test/resources/hibernate-lifecycle.properties +++ b/persistence-modules/hibernate5/src/test/resources/hibernate-lifecycle.properties @@ -1,5 +1,5 @@ hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:mem:lifecycledb;DB_CLOSE_DELAY=-1; +hibernate.connection.url=jdbc:h2:mem:lifecycledb;MODE=LEGACY;DB_CLOSE_DELAY=-1; hibernate.connection.username=sa hibernate.connection.password= hibernate.connection.autocommit=true diff --git a/persistence-modules/hibernate5/src/test/resources/hibernate-namingstrategy.properties b/persistence-modules/hibernate5/src/test/resources/hibernate-namingstrategy.properties index d0e068d13f..07922ae050 100644 --- a/persistence-modules/hibernate5/src/test/resources/hibernate-namingstrategy.properties +++ b/persistence-modules/hibernate5/src/test/resources/hibernate-namingstrategy.properties @@ -1,5 +1,5 @@ hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 +hibernate.connection.url=jdbc:h2:mem:mydb1;MODE=LEGACY;DB_CLOSE_DELAY=-1 hibernate.connection.username=sa hibernate.dialect=org.hibernate.dialect.H2Dialect diff --git a/persistence-modules/java-jpa-3/pom.xml b/persistence-modules/java-jpa-3/pom.xml index b9516281de..20143af9f0 100644 --- a/persistence-modules/java-jpa-3/pom.xml +++ b/persistence-modules/java-jpa-3/pom.xml @@ -91,7 +91,7 @@ 3.5.1 3.3.3 3.0.0 - 1.4.200 + 2.1.214 \ No newline at end of file diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java index d121c81c6b..79a5982140 100644 --- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java +++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java @@ -18,7 +18,7 @@ public class HibernateConfig { Properties settings = new Properties(); settings.put(Environment.DRIVER, "org.h2.Driver"); - settings.put(Environment.URL, "jdbc:h2:mem:test"); + settings.put(Environment.URL, "jdbc:h2:mem:test;MODE=LEGACY"); settings.put(Environment.USER, "sa"); settings.put(Environment.PASS, ""); settings.put(Environment.DIALECT, "org.hibernate.dialect.H2Dialect"); diff --git a/persistence-modules/java-jpa-3/src/test/resources/META-INF/persistence.xml b/persistence-modules/java-jpa-3/src/test/resources/META-INF/persistence.xml index 9a33f912bf..bc52256d68 100644 --- a/persistence-modules/java-jpa-3/src/test/resources/META-INF/persistence.xml +++ b/persistence-modules/java-jpa-3/src/test/resources/META-INF/persistence.xml @@ -67,7 +67,7 @@ true - + @@ -104,7 +104,7 @@ true - + @@ -138,7 +138,7 @@ true - + diff --git a/persistence-modules/java-jpa/pom.xml b/persistence-modules/java-jpa/pom.xml index acdd648e45..0c8cec2116 100644 --- a/persistence-modules/java-jpa/pom.xml +++ b/persistence-modules/java-jpa/pom.xml @@ -107,7 +107,7 @@ 2.2 3.3.3 3.0.0 - 1.4.200 + 2.1.214 \ No newline at end of file diff --git a/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml index b780a6f569..50188391af 100644 --- a/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml +++ b/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml @@ -15,7 +15,7 @@ + value="jdbc:h2:mem:test;MODE=LEGACY;INIT=RUNSCRIPT FROM 'classpath:database.sql'" /> + value="jdbc:h2:mem:test;MODE=LEGACY" /> + value="jdbc:h2:mem:entitygraphdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;NON_KEYWORDS=USER" /> 2.6.1 5.3.13 5.8.2 - 1.4.200 + 2.1.214 \ No newline at end of file diff --git a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/Config.java b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/Config.java index 241dad417b..2e661a9651 100644 --- a/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/Config.java +++ b/persistence-modules/read-only-transactions/src/main/java/com/baeldung/readonlytransactions/h2/Config.java @@ -20,7 +20,7 @@ public class Config { @Bean("h2DataSource") public DataSource dataSource() { HikariConfig config = new HikariConfig(); - config.setJdbcUrl("jdbc:h2:mem:mydb"); + config.setJdbcUrl("jdbc:h2:mem:mydb;MODE=LEGACY"); config.setUsername("sa"); config.setPassword(""); config.setDriverClassName("org.h2.Driver"); diff --git a/persistence-modules/spring-data-eclipselink/pom.xml b/persistence-modules/spring-data-eclipselink/pom.xml index 561d144fe3..c3c530d2d7 100644 --- a/persistence-modules/spring-data-eclipselink/pom.xml +++ b/persistence-modules/spring-data-eclipselink/pom.xml @@ -66,7 +66,7 @@ 1.5.9.RELEASE 2.7.0 - 1.4.197 + 2.1.214 \ No newline at end of file diff --git a/persistence-modules/spring-data-eclipselink/src/main/resources/application.properties b/persistence-modules/spring-data-eclipselink/src/main/resources/application.properties index 5874482e7a..c3ad7011aa 100644 --- a/persistence-modules/spring-data-eclipselink/src/main/resources/application.properties +++ b/persistence-modules/spring-data-eclipselink/src/main/resources/application.properties @@ -1,2 +1,2 @@ -spring.datasource.url=jdbc:h2:mem:test;MVCC=FALSE;LOCK_TIMEOUT=100; +spring.datasource.url=jdbc:h2:mem:test;LOCK_TIMEOUT=100; spring.jpa.show-sql=true \ No newline at end of file diff --git a/persistence-modules/spring-jpa-2/pom.xml b/persistence-modules/spring-jpa-2/pom.xml index d0152288d4..19bc9cba14 100644 --- a/persistence-modules/spring-jpa-2/pom.xml +++ b/persistence-modules/spring-jpa-2/pom.xml @@ -105,7 +105,7 @@ 2.2.6.RELEASE 9.0.0.M26 - 1.4.200 + 2.1.214 \ No newline at end of file diff --git a/persistence-modules/spring-jpa-2/src/test/resources/manytomany/db.sql b/persistence-modules/spring-jpa-2/src/test/resources/manytomany/db.sql index 02905e41ee..fb544b93c6 100644 --- a/persistence-modules/spring-jpa-2/src/test/resources/manytomany/db.sql +++ b/persistence-modules/spring-jpa-2/src/test/resources/manytomany/db.sql @@ -1,18 +1,18 @@ CREATE TABLE course ( - id bigint(20) NOT NULL, + id bigint auto_increment NOT NULL, PRIMARY KEY (id) ); CREATE TABLE student ( - id bigint(20) NOT NULL, + id bigint auto_increment NOT NULL, PRIMARY KEY (id) ); CREATE TABLE course_like ( - student_id bigint(20) NOT NULL, - course_id bigint(20) NOT NULL, + student_id bigint auto_increment NOT NULL, + course_id bigint auto_increment NOT NULL, PRIMARY KEY (student_id, course_id), CONSTRAINT fk_course_like__student FOREIGN KEY (student_id) REFERENCES student (id), CONSTRAINT fk_course_like__course FOREIGN KEY (course_id) REFERENCES course (id) @@ -21,9 +21,9 @@ CREATE TABLE course_like ( CREATE TABLE course_rating ( - course_id bigint(20) NOT NULL, - student_id bigint(20) NOT NULL, - rating int(11) NOT NULL, + course_id bigint auto_increment NOT NULL, + student_id bigint auto_increment NOT NULL, + rating int auto_increment NOT NULL, PRIMARY KEY (course_id, student_id), CONSTRAINT fk_course_rating__student FOREIGN KEY (student_id) REFERENCES student (id), CONSTRAINT fk_course_rating__course FOREIGN KEY (course_id) REFERENCES course (id) @@ -32,11 +32,11 @@ CREATE TABLE course_rating ( CREATE TABLE course_registration ( - id bigint(20) NOT NULL, - grade int(11), + id bigint auto_increment NOT NULL, + grade int auto_increment, registered_at datetime NOT NULL, - course_id bigint(20) NOT NULL, - student_id bigint(20) NOT NULL, + course_id bigint auto_increment NOT NULL, + student_id bigint auto_increment NOT NULL, PRIMARY KEY (id), CONSTRAINT fk_course_registration__student FOREIGN KEY (student_id) REFERENCES student (id), CONSTRAINT fk_course_registration__course FOREIGN KEY (course_id) REFERENCES course (id) diff --git a/persistence-modules/spring-jpa/pom.xml b/persistence-modules/spring-jpa/pom.xml index a08e3f92c8..77074e835a 100644 --- a/persistence-modules/spring-jpa/pom.xml +++ b/persistence-modules/spring-jpa/pom.xml @@ -125,7 +125,7 @@ 6.0.15.Final 1.4.01 2.2.5 - 1.4.200 + 2.1.214 \ No newline at end of file diff --git a/persistence-modules/spring-jpa/src/test/resources/persistence-student.properties b/persistence-modules/spring-jpa/src/test/resources/persistence-student.properties index 9ca389d6ab..24e625d418 100644 --- a/persistence-modules/spring-jpa/src/test/resources/persistence-student.properties +++ b/persistence-modules/spring-jpa/src/test/resources/persistence-student.properties @@ -1,5 +1,5 @@ jdbc.driverClassName=org.h2.Driver -jdbc.url=jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1 +jdbc.url=jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1;NON_KEYWORDS=KEY,VALUE hibernate.dialect=org.hibernate.dialect.H2Dialect hibernate.show_sql=false From c71ade5790314e363f69254fc59ed408e06663ee Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Wed, 21 Dec 2022 17:18:46 +0100 Subject: [PATCH 160/592] BAEL-6023: Throwing an Exception If an Optional Is Present (#13116) --- .../optionaluses/UserFoundException.java | 11 ++++ .../UserRepositoryWithOptional.java | 9 ++++ .../optionaluses/UsesForOptionalUnitTest.java | 51 +++++++++++++------ 3 files changed, 55 insertions(+), 16 deletions(-) create mode 100644 core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/UserFoundException.java diff --git a/core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/UserFoundException.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/UserFoundException.java new file mode 100644 index 0000000000..d9dab9f05f --- /dev/null +++ b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/UserFoundException.java @@ -0,0 +1,11 @@ +package com.baeldung.optionaluses; + +public class UserFoundException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public UserFoundException(String message) { + super(message); + } + +} diff --git a/core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/UserRepositoryWithOptional.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/UserRepositoryWithOptional.java index f31e35d85f..ee43addec7 100644 --- a/core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/UserRepositoryWithOptional.java +++ b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optionaluses/UserRepositoryWithOptional.java @@ -18,4 +18,13 @@ public class UserRepositoryWithOptional { return Optional.empty(); } + + public void throwExceptionWhenUserIsPresent(String id) { + + this.findById(id) + .ifPresent(user -> { + throw new UserFoundException("User with ID : " + user.getId() + " is found"); + }); + + } } diff --git a/core-java-modules/core-java-optional/src/test/java/com/baeldung/optionaluses/UsesForOptionalUnitTest.java b/core-java-modules/core-java-optional/src/test/java/com/baeldung/optionaluses/UsesForOptionalUnitTest.java index d0f92be097..5c63987193 100644 --- a/core-java-modules/core-java-optional/src/test/java/com/baeldung/optionaluses/UsesForOptionalUnitTest.java +++ b/core-java-modules/core-java-optional/src/test/java/com/baeldung/optionaluses/UsesForOptionalUnitTest.java @@ -1,39 +1,37 @@ package com.baeldung.optionaluses; -import org.junit.jupiter.api.Test; - +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -public class UsesForOptionalUnitTest { +import org.junit.jupiter.api.Test; + +class UsesForOptionalUnitTest { @Test - public void givenNonExistentUserId_whenSearchForUser_andNoNullCheck_thenThrowException() { + void givenNonExistentUserId_whenSearchForUser_andNoNullCheck_thenThrowException() { UserRepositoryWithNull userRepositoryWithNull = new UserRepositoryWithNull(); String nonExistentUserId = "4"; - assertThrows(NullPointerException.class, () -> { - System.out.println("User name: " + userRepositoryWithNull.findById(nonExistentUserId) - .getName()); - }); + assertThrows(NullPointerException.class, () -> System.out.println("User name: " + userRepositoryWithNull.findById(nonExistentUserId).getName())); } @Test - public void givenNonExistentUserId_whenSearchForUser_thenOptionalShouldBeTreatedProperly() { + void givenNonExistentUserId_whenSearchForUser_thenOptionalShouldBeTreatedProperly() { UserRepositoryWithOptional userRepositoryWithOptional = new UserRepositoryWithOptional(); String nonExistentUserId = "4"; String userName = userRepositoryWithOptional.findById(nonExistentUserId) - .orElse(new User("0", "admin")) - .getName(); + .orElse(new User("0", "admin")) + .getName(); assertEquals("admin", userName); } @Test - public void givenExistentUserId_whenFoundUserWithNameStartingWithMInRepositoryUsingNull_thenNameShouldBeUpperCased() { + void givenExistentUserId_whenFoundUserWithNameStartingWithMInRepositoryUsingNull_thenNameShouldBeUpperCased() { UserRepositoryWithNull userRepositoryWithNull = new UserRepositoryWithNull(); @@ -50,15 +48,36 @@ public class UsesForOptionalUnitTest { } @Test - public void givenExistentUserId_whenFoundUserWithNameStartingWithMInRepositoryUsingOptional_thenNameShouldBeUpperCased() { + void givenExistentUserId_whenFoundUserWithNameStartingWithMInRepositoryUsingOptional_thenNameShouldBeUpperCased() { UserRepositoryWithOptional userRepositoryWithOptional = new UserRepositoryWithOptional(); String upperCasedName = userRepositoryWithOptional.findById("2") - .filter(u -> u.getName().startsWith("M")) - .map(u -> u.getName().toUpperCase()) - .orElse(""); + .filter(u -> u.getName().startsWith("M")) + .map(u -> u.getName().toUpperCase()) + .orElse(""); assertEquals("MARIA", upperCasedName); } + + @Test + void givenExistentUserId_whenSearchForUser_thenThrowException() { + + final UserRepositoryWithOptional userRepositoryWithOptional = new UserRepositoryWithOptional(); + String existentUserId = "2"; + + assertThrows(UserFoundException.class, () -> userRepositoryWithOptional.throwExceptionWhenUserIsPresent(existentUserId)); + + } + + @Test + void givenNonExistentUserId_whenSearchForUser_thenDoNotThrowException() { + + final UserRepositoryWithOptional userRepositoryWithOptional = new UserRepositoryWithOptional(); + String nonExistentUserId = "8"; + + assertDoesNotThrow(() -> userRepositoryWithOptional.throwExceptionWhenUserIsPresent(nonExistentUserId)); + + } + } From 3f0c4c27a2d74a53dbe305f239c215fc9956015d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 22 Dec 2022 21:57:36 +0800 Subject: [PATCH 161/592] Update README.md [skip ci] --- core-java-modules/core-java-lang-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-5/README.md b/core-java-modules/core-java-lang-5/README.md index dbd3878458..6d610f40b9 100644 --- a/core-java-modules/core-java-lang-5/README.md +++ b/core-java-modules/core-java-lang-5/README.md @@ -11,3 +11,4 @@ This module contains articles about core features in the Java language - [Variable Instantiation on Declaration vs. on Constructor in Java](https://www.baeldung.com/java-variable-instantiation-declaration-vs-constructor) - [Infinity in Java](https://www.baeldung.com/java-infinity) - [Type Parameter vs Wildcard in Java Generics](https://www.baeldung.com/java-generics-type-parameter-vs-wildcard) +- [Convert Between int and char in Java](https://www.baeldung.com/java-convert-int-char) From 6dbfd8bcf8361a637f9af65f8383d20916eb06aa Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 22 Dec 2022 22:02:36 +0800 Subject: [PATCH 162/592] Update README.md [skip ci] --- spring-reactive-modules/spring-5-reactive-client-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-reactive-modules/spring-5-reactive-client-2/README.md b/spring-reactive-modules/spring-5-reactive-client-2/README.md index 067a87a9d5..04fe3c8f42 100644 --- a/spring-reactive-modules/spring-5-reactive-client-2/README.md +++ b/spring-reactive-modules/spring-5-reactive-client-2/README.md @@ -7,4 +7,5 @@ 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) From 769406aa327f2f4d89d0ecc9719fbeaf92d3a73a Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 22 Dec 2022 22:06:38 +0800 Subject: [PATCH 163/592] Update README.md [skip ci] --- testing-modules/assertion-libraries/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/assertion-libraries/README.md b/testing-modules/assertion-libraries/README.md index 5be5c7e004..4363ba2ed7 100644 --- a/testing-modules/assertion-libraries/README.md +++ b/testing-modules/assertion-libraries/README.md @@ -10,3 +10,4 @@ - [Custom Assertions with AssertJ](http://www.baeldung.com/assertj-custom-assertion) - [Using Conditions with AssertJ Assertions](http://www.baeldung.com/assertj-conditions) - [AssertJ Exception Assertions](http://www.baeldung.com/assertj-exception-assertion) +- [Extract Values using AssertJ in Java](https://www.baeldung.com/java-extract-values-assertj) From 65cc5b6d0504e5df2d1166a267e1adffe8262503 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 22 Dec 2022 22:13:12 +0800 Subject: [PATCH 164/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-4/README.md b/core-java-modules/core-java-collections-4/README.md index 8cd52addfd..f3a7d87403 100644 --- a/core-java-modules/core-java-collections-4/README.md +++ b/core-java-modules/core-java-collections-4/README.md @@ -15,3 +15,4 @@ - [Guide to Java PriorityQueue](https://www.baeldung.com/java-priorityqueue) - [Java Generics PECS – Producer Extends Consumer Super](https://www.baeldung.com/java-generics-pecs) - [Reversing a Stack in Java](https://www.baeldung.com/java-reversing-a-stack) +- [Sorting a HashSet in Java](https://www.baeldung.com/java-sort-hashset) From 5a3d675ff71a019c4cabbda9c6ee04613e404233 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 22 Dec 2022 22:17:45 +0800 Subject: [PATCH 165/592] Update README.md [skip ci] --- spring-boot-modules/spring-boot-artifacts-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-artifacts-2/README.md b/spring-boot-modules/spring-boot-artifacts-2/README.md index 5d0a6ebcd1..a6601adc0f 100644 --- a/spring-boot-modules/spring-boot-artifacts-2/README.md +++ b/spring-boot-modules/spring-boot-artifacts-2/README.md @@ -6,4 +6,5 @@ This module contains articles about configuring the Spring Boot build process 2. - [Difference Between spring-boot:repackage and Maven package](https://www.baeldung.com/spring-boot-repackage-vs-mvn-package) - [Intro to Spring Boot Starters](https://www.baeldung.com/spring-boot-starters) +- [Fixing the No Main Manifest Attribute in Spring Boot](https://www.baeldung.com/spring-boot-fix-the-no-main-manifest-attribute) - More articles: [[<-- prev]](/spring-boot-modules/spring-boot-artifacts) From aa58d16e8ff71f32b5247bcc1c3f26dc2fb69178 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 22 Dec 2022 22:25:58 +0800 Subject: [PATCH 166/592] Update README.md [skip ci] --- core-java-modules/core-java-string-operations-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-operations-5/README.md b/core-java-modules/core-java-string-operations-5/README.md index f35c946107..94fb7e855e 100644 --- a/core-java-modules/core-java-string-operations-5/README.md +++ b/core-java-modules/core-java-string-operations-5/README.md @@ -7,3 +7,4 @@ - [Convert String to char in Java](https://www.baeldung.com/java-convert-string-to-char) - [Convert String to String Array](https://www.baeldung.com/java-convert-string-to-string-array) - [String Interpolation in Java](https://www.baeldung.com/java-string-interpolation) +- [Guide to Splitting a String by Whitespace in Java](https://www.baeldung.com/java-splitting-a-string-by-whitespace) From f699da12c63f082b7c2937951e735de6e646559c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 22 Dec 2022 22:29:03 +0800 Subject: [PATCH 167/592] Update README.md [skip ci] --- core-java-modules/core-java-lambdas/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lambdas/README.md b/core-java-modules/core-java-lambdas/README.md index a17d3434c5..cad2097673 100644 --- a/core-java-modules/core-java-lambdas/README.md +++ b/core-java-modules/core-java-lambdas/README.md @@ -9,3 +9,4 @@ - [The Double Colon Operator in Java 8](https://www.baeldung.com/java-8-double-colon-operator) - [Serialize a Lambda in Java](https://www.baeldung.com/java-serialize-lambda) - [Convert Anonymous Class into Lambda in Java](https://www.baeldung.com/java-from-anonymous-class-to-lambda) +- [When to Use Callable and Supplier in Java](https://www.baeldung.com/java-callable-vs-supplier) From fb17e689426659ea9020d46b450d3f7adcd4533a Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 22 Dec 2022 22:33:40 +0800 Subject: [PATCH 168/592] Update README.md [skip ci] --- core-java-modules/core-java-concurrency-collections-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-concurrency-collections-2/README.md b/core-java-modules/core-java-concurrency-collections-2/README.md index 692c218395..c812ed4284 100644 --- a/core-java-modules/core-java-concurrency-collections-2/README.md +++ b/core-java-modules/core-java-concurrency-collections-2/README.md @@ -3,4 +3,5 @@ - [Introduction to Lock Striping](https://www.baeldung.com/java-lock-stripping) - [Guide to the Java TransferQueue](http://www.baeldung.com/java-transfer-queue) - [Java Concurrent HashSet Equivalent to ConcurrentHashMap](https://www.baeldung.com/java-concurrent-hashset-concurrenthashmap) +- [Reading and Writing With a ConcurrentHashMap](https://www.baeldung.com/concurrenthashmap-reading-and-writing) - [[<-- Prev]](/core-java-modules/core-java-concurrency-collections) From 7c3fc3b10f4525abf001cf84dc0b62123d6c7956 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 22 Dec 2022 22:38:21 +0800 Subject: [PATCH 169/592] Update README.md [skip ci] --- json-modules/json-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/json-modules/json-2/README.md b/json-modules/json-2/README.md index 8087927ad3..750bb064c8 100644 --- a/json-modules/json-2/README.md +++ b/json-modules/json-2/README.md @@ -10,6 +10,7 @@ This module contains articles about JSON. - [Generate a Java Class From JSON](https://www.baeldung.com/java-generate-class-from-json) - [A Guide to FastJson](https://www.baeldung.com/fastjson) - [Check Whether a String is Valid JSON in Java](https://www.baeldung.com/java-validate-json-string) +- [Getting a Value in JSONObject](https://www.baeldung.com/java-jsonobject-get-value) - More Articles: [[<-- prev]](/json-modules/json) From 0c05461ab7fc4d6316b1dc95ae8d65f224ac0d95 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 22 Dec 2022 22:40:03 +0800 Subject: [PATCH 170/592] Update README.md [skip ci] --- security-modules/jwt/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/security-modules/jwt/README.md b/security-modules/jwt/README.md index 7b83f1c02e..42f761bb36 100644 --- a/security-modules/jwt/README.md +++ b/security-modules/jwt/README.md @@ -1,3 +1,4 @@ ## Relevant Articles - [Managing JWT With Auth0 java-jwt](https://www.baeldung.com/java-auth0-jwt) +- [Check JWT Expiry Without Throwing Exceptions](https://www.baeldung.com/java-jwt-check-expiry-no-exception) From f5131d9ad0482776b234c5edf3cf4fdb680a6151 Mon Sep 17 00:00:00 2001 From: freelansam <79205526+freelansam@users.noreply.github.com> Date: Fri, 23 Dec 2022 00:33:54 +0530 Subject: [PATCH 171/592] JAVA-15822: Which sub-modules aren't being built (#13153) * JAVA-15822: Which sub-modules aren't being built * JAVA-15822: build error * JAVA-15822: build error * modified comment for gcp-firebase --- core-java-modules/pom.xml | 1 + kubernetes-modules/pom.xml | 1 + patterns-modules/pom.xml | 1 + persistence-modules/pom.xml | 1 + pom.xml | 17 +++++++++++++++-- spring-boot-modules/pom.xml | 1 + 6 files changed, 20 insertions(+), 2 deletions(-) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index ed98e9d322..f1c5bfe874 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -53,6 +53,7 @@ core-java-concurrency-collections-2 core-java-console core-java-8-datetime-2 + core-java-datetime-string-2 core-java-date-operations-2 core-java-date-operations-3 core-java-8-datetime diff --git a/kubernetes-modules/pom.xml b/kubernetes-modules/pom.xml index fe8ffab82a..5b6510e58b 100644 --- a/kubernetes-modules/pom.xml +++ b/kubernetes-modules/pom.xml @@ -15,6 +15,7 @@ k8s-intro k8s-admission-controller + kubernetes-spring \ No newline at end of file diff --git a/patterns-modules/pom.xml b/patterns-modules/pom.xml index 00625a9df3..0bd2b0453b 100644 --- a/patterns-modules/pom.xml +++ b/patterns-modules/pom.xml @@ -21,6 +21,7 @@ design-patterns-creational design-patterns-creational-2 design-patterns-functional + design-patterns-singleton design-patterns-structural dip cqrs-es diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 7d45074d52..8c191b0abd 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -60,6 +60,7 @@ solr spring-boot-persistence-2 + spring-boot-persistence-3 spring-boot-mysql spring-boot-persistence spring-boot-persistence-h2 diff --git a/pom.xml b/pom.xml index fb257a033e..b57d3bf3fb 100644 --- a/pom.xml +++ b/pom.xml @@ -384,7 +384,7 @@ feign - + geotools google-cloud @@ -411,6 +411,7 @@ javax-sound javaxval javaxval-2 + javaxval2 javax-validation-advanced jaxb jersey @@ -564,6 +565,7 @@ spring-core-3 spring-core-4 spring-core-5 + spring-credhub spring-cucumber spring-di @@ -768,7 +770,7 @@ feign - + geotools google-cloud @@ -795,6 +797,7 @@ javax-sound javaxval javaxval-2 + javaxval2 javax-validation-advanced jaxb jersey @@ -813,6 +816,7 @@ language-interop libraries-2 libraries-3 + libraries-7 libraries-apache-commons libraries-apache-commons-collections @@ -853,6 +857,7 @@ patterns-modules pdf + pdf-2 performance-tests persistence-modules protobuffer @@ -939,6 +944,7 @@ spring-core-3 spring-core-4 spring-core-5 + spring-credhub spring-cucumber spring-di @@ -1141,6 +1147,7 @@ core-java-modules/core-java-string-algorithms-3 core-java-modules/core-java-string-operations-3 core-java-modules/core-java-string-operations-4 + core-java-modules/core-java-string-operations-5 core-java-modules/core-java-time-measurements core-java-modules/core-java-networking-3 core-java-modules/core-java-strings @@ -1149,6 +1156,7 @@ ddd-contexts docker-modules apache-httpclient-2 + kubernetes-modules/kubernetes-spring libraries-concurrency maven-modules/compiler-plugin-java-9 maven-modules/maven-generate-war @@ -1211,6 +1219,7 @@ core-java-modules/core-java-collections-set core-java-modules/core-java-collections-list-4 core-java-modules/core-java-collections-maps-4 + core-java-modules/core-java-collections-maps-5 core-java-modules/core-java-concurrency-simple core-java-modules/core-java-date-operations-1 core-java-modules/core-java-datetime-conversion @@ -1218,15 +1227,19 @@ core-java-modules/core-java-io-conversions-2 core-java-modules/core-java-jpms core-java-modules/core-java-os + core-java-modules/core-java-streams-4 core-java-modules/core-java-string-algorithms-3 core-java-modules/core-java-string-operations-3 core-java-modules/core-java-string-operations-4 + core-java-modules/core-java-string-operations-5 core-java-modules/core-java-time-measurements core-java-modules/core-java-networking-3 core-java-modules/core-java-strings + core-java-modules/core-java-httpclient ddd-contexts docker-modules apache-httpclient-2 + kubernetes-modules/kubernetes-spring libraries-concurrency maven-modules/compiler-plugin-java-9 maven-modules/maven-generate-war diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 7fb14ed633..e9da6eeca4 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -67,6 +67,7 @@ spring-boot-properties-3 spring-boot-properties-migrator-demo spring-boot-property-exp + spring-boot-request-params spring-boot-runtime spring-boot-runtime-2 spring-boot-security From 51965c1ecc66c699ad72eb5e03ec370089246090 Mon Sep 17 00:00:00 2001 From: TomVerkon Date: Thu, 22 Dec 2022 15:28:28 -0500 Subject: [PATCH 172/592] Update Logback Article Added logbak-core-1.3.5 to pom Updated logback.version to 1.3.5 Added slf4j - 2.0.4 to pom Updated javax.mail from 1.4.7 to javax.mail-api 1.6.2 Updated javax.activation to javax.activation-api 1.2.0 Ran both mvn clean verify and mvn exec:java -Dexec.mainClass="com.baeldung.logback.Example" without errors --- logging-modules/logback/pom.xml | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/logging-modules/logback/pom.xml b/logging-modules/logback/pom.xml index ab778e954e..76aeea447d 100644 --- a/logging-modules/logback/pom.xml +++ b/logging-modules/logback/pom.xml @@ -24,6 +24,11 @@ logback-classic ${logback.version} + + ch.qos.logback + logback-core + ${logback.version} + ch.qos.logback.contrib logback-json-classic @@ -34,6 +39,11 @@ logback-jackson ${logback.contrib.version} + + org.slf4j + slf4j-api + ${slf4j.version} + com.fasterxml.jackson.core jackson-databind @@ -56,15 +66,16 @@ javax.mail - mail - ${javax.mail.version} + javax.mail-api + ${javax.mail.version} javax.activation - activation + javax.activation-api ${javax.activation.version} runtime + @@ -106,8 +117,10 @@ 20180130 0.1.5 3.3.5 - 1.4.7 - 1.1.1 + 1.6.2 + 1.2.0 + 1.3.5 + 2.0.4 \ No newline at end of file From efad3fe07fc7a9cac2a06f0ba241fb1fe35e3124 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Thu, 22 Dec 2022 22:23:29 +0100 Subject: [PATCH 173/592] [BAEL-6051_intListToStrList] convert List to List (#13169) --- .../IntListToStringListUnitTest.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 core-java-modules/core-java-collections-conversions-2/src/test/java/com/baeldung/intlisttostrlist/IntListToStringListUnitTest.java diff --git a/core-java-modules/core-java-collections-conversions-2/src/test/java/com/baeldung/intlisttostrlist/IntListToStringListUnitTest.java b/core-java-modules/core-java-collections-conversions-2/src/test/java/com/baeldung/intlisttostrlist/IntListToStringListUnitTest.java new file mode 100644 index 0000000000..0990ef2b74 --- /dev/null +++ b/core-java-modules/core-java-collections-conversions-2/src/test/java/com/baeldung/intlisttostrlist/IntListToStringListUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.intlisttostrlist; + + +import com.google.common.base.Functions; +import com.google.common.collect.Lists; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class IntListToStringListUnitTest { + private final static List INTEGER_LIST = Arrays.asList(1, 2, 3, 4, 5, 6, 7); + private final static List EXPECTED_LIST = Arrays.asList("1", "2", "3", "4", "5", "6", "7"); + + + @Test + void givenAnIntegerList_whenUsingStreamMap_shouldGetExpectedStringList() { + List result = INTEGER_LIST.stream().map(i -> i.toString()).collect(Collectors.toList()); + assertEquals(EXPECTED_LIST, result); + } + + @Test + void givenAnIntegerList_whenUsingGuava_shouldGetExpectedStringList() { + List result = Lists.transform(INTEGER_LIST, Functions.toStringFunction()); + assertEquals(EXPECTED_LIST, result); + } + + @Test + void givenAnIntegerList_whenUsingLoop_shouldGetExpectedStringList() { + List result = new ArrayList<>(); + for (Integer i : INTEGER_LIST) { + result.add(i.toString()); + } + assertEquals(EXPECTED_LIST, result); + } +} From 2f5696c8632803976bddb417ceb87e5152074598 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Thu, 22 Dec 2022 23:13:57 +0100 Subject: [PATCH 174/592] need to handle trailing tokens see https://github.com/FasterXML/jackson/discussions/143#discussioncomment-4479800 --- .../java/com/baeldung/jsonvalidation/JacksonValidator.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/json-modules/json-2/src/main/java/com/baeldung/jsonvalidation/JacksonValidator.java b/json-modules/json-2/src/main/java/com/baeldung/jsonvalidation/JacksonValidator.java index 8c339f46c8..4385b39bb3 100644 --- a/json-modules/json-2/src/main/java/com/baeldung/jsonvalidation/JacksonValidator.java +++ b/json-modules/json-2/src/main/java/com/baeldung/jsonvalidation/JacksonValidator.java @@ -1,11 +1,15 @@ package com.baeldung.jsonvalidation; import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; public class JacksonValidator { - final ObjectMapper mapper = new ObjectMapper(); + final ObjectMapper mapper = JsonMapper.builder() + .enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS) + .build(); public boolean isValid(String json) { try { From 0a5a54f6d09f85dbc35298647bc3eaaed5d177a2 Mon Sep 17 00:00:00 2001 From: pedrolopes Date: Thu, 22 Dec 2022 19:18:05 -0300 Subject: [PATCH 175/592] BAEL-5946: Fix unit tests (#13187) * consistent read unit test * unit test to show consistency in writing to the same key of map * testing writes at different map key * fix to bugs on test 1 and 2 * removing repeated tests --- .../ConcurrentHashMapUnitTest.java | 41 ++++++++----------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrenthashmap/ConcurrentHashMapUnitTest.java b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrenthashmap/ConcurrentHashMapUnitTest.java index 6a6aab868e..876c2f9c01 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrenthashmap/ConcurrentHashMapUnitTest.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrenthashmap/ConcurrentHashMapUnitTest.java @@ -14,11 +14,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class ConcurrentHashMapUnitTest { - private Map frequencyMap; + private Map frequencyMap = new ConcurrentHashMap<>(); @BeforeEach public void setup() { - frequencyMap = new ConcurrentHashMap<>(); frequencyMap.put(0, 0); frequencyMap.put(1, 0); frequencyMap.put(2, 0); @@ -35,24 +34,22 @@ public class ConcurrentHashMapUnitTest { Runnable writeAfter1Sec = () -> frequencyMap.computeIfPresent(1, (k, v) -> { sleep(1); - return frequencyMap.get(k) + 1; + return v + 1; }); Callable readNow = () -> frequencyMap.get(1); - Callable readAfter1001Ms = () -> { - TimeUnit.MILLISECONDS.sleep(1001); + Callable readAfter2sec = () -> { + sleep(2); return frequencyMap.get(1); }; threadExecutor.submit(writeAfter1Sec); - List> results = threadExecutor.invokeAll(asList(readNow, readAfter1001Ms)); + List> results = threadExecutor.invokeAll(asList(readNow, readAfter2sec)); assertEquals(0, results.get(0).get()); assertEquals(1, results.get(1).get()); - if (threadExecutor.awaitTermination(2, TimeUnit.SECONDS)) { - threadExecutor.shutdown(); - } + threadExecutor.shutdown(); } @Test @@ -61,47 +58,45 @@ public class ConcurrentHashMapUnitTest { Callable writeAfter5Sec = () -> frequencyMap.computeIfPresent(1, (k, v) -> { sleep(5); - return frequencyMap.get(k) + 1; + return v + 1; }); Callable writeAfter1Sec = () -> frequencyMap.computeIfPresent(1, (k, v) -> { sleep(1); - return frequencyMap.get(k) + 1; + return v + 1; }); - List> results = threadExecutor.invokeAll(asList(writeAfter5Sec, writeAfter1Sec)); + Future result1 = threadExecutor.submit(writeAfter5Sec); + sleep(1); + Future result2 = threadExecutor.submit(writeAfter1Sec); - assertEquals(1, results.get(0).get()); - assertEquals(2, results.get(1).get()); + assertEquals(1, result1.get()); + assertEquals(2, result2.get()); - if (threadExecutor.awaitTermination(2, TimeUnit.SECONDS)) { - threadExecutor.shutdown(); - } + threadExecutor.shutdown(); } @Test - public void givenOneThreadIsWriting_whenAnotherThreadWritesAtDifferentKey_thenNotWaitAndGetCorrectValue() throws Exception { + public void givenOneThreadIsWriting_whenAnotherThreadWritesAtDifferentKey_thenNotWait() throws InterruptedException { ExecutorService threadExecutor = Executors.newFixedThreadPool(2); Callable writeAfter5Sec = () -> frequencyMap.computeIfPresent(1, (k, v) -> { sleep(5); - return frequencyMap.get(k) + 1; + return v + 1; }); AtomicLong time = new AtomicLong(System.currentTimeMillis()); Callable writeAfter1Sec = () -> frequencyMap.computeIfPresent(2, (k, v) -> { sleep(1); time.set((System.currentTimeMillis() - time.get()) / 1000); - return frequencyMap.get(k) + 1; + return v + 1; }); threadExecutor.invokeAll(asList(writeAfter5Sec, writeAfter1Sec)); assertEquals(1, time.get()); - if (threadExecutor.awaitTermination(2, TimeUnit.SECONDS)) { - threadExecutor.shutdown(); - } + threadExecutor.shutdown(); } private static void sleep(int timeout) { From 20e0ff4aa38a9283aa7914d57811dfa89e53ae24 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Thu, 22 Dec 2022 23:18:30 +0100 Subject: [PATCH 176/592] Fix givenOneThreadIsWriting_whenAnotherThreadWritesAtSameKey_thenWaitAndGetCorrectValue (#13186) --- .../baeldung/concurrenthashmap/ConcurrentHashMapUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrenthashmap/ConcurrentHashMapUnitTest.java b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrenthashmap/ConcurrentHashMapUnitTest.java index 876c2f9c01..2ae510b365 100644 --- a/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrenthashmap/ConcurrentHashMapUnitTest.java +++ b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrenthashmap/ConcurrentHashMapUnitTest.java @@ -106,4 +106,4 @@ public class ConcurrentHashMapUnitTest { throw new RuntimeException(e); } } -} \ No newline at end of file +} From 966b349fbaa64884be8d865691205498953442b2 Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Fri, 23 Dec 2022 21:05:04 +0100 Subject: [PATCH 177/592] BAEL-5943 Using Watermarks with iText in Java (#13178) * BAEL-5943 Using Watermarks with iText in Java * BAEL-5943 Update * BAEL-5943 Update * BAEL-5943 Update --- libraries-files/output/aliceandpaul.pdf | Bin 0 -> 2601 bytes .../output/alicepaulwithoutwatermark.pdf | 43 ++++++ libraries-files/output/aliceupdated.pdf | Bin 0 -> 2693 bytes libraries-files/pom.xml | 12 ++ .../java/com/baeldung/iTextPDF/StoryTime.java | 126 ++++++++++++++++++ .../AddWaterMarkToExistingPdfUnitTest.java | 39 ++++++ .../GenerateNewPdfWithWatermarkUnitTest.java | 37 +++++ 7 files changed, 257 insertions(+) create mode 100644 libraries-files/output/aliceandpaul.pdf create mode 100644 libraries-files/output/alicepaulwithoutwatermark.pdf create mode 100644 libraries-files/output/aliceupdated.pdf create mode 100644 libraries-files/src/main/java/com/baeldung/iTextPDF/StoryTime.java create mode 100644 libraries-files/src/test/java/com/baeldung/iTextPDFTest/AddWaterMarkToExistingPdfUnitTest.java create mode 100644 libraries-files/src/test/java/com/baeldung/iTextPDFTest/GenerateNewPdfWithWatermarkUnitTest.java diff --git a/libraries-files/output/aliceandpaul.pdf b/libraries-files/output/aliceandpaul.pdf new file mode 100644 index 0000000000000000000000000000000000000000..de71693db564b6e4de817e54e93329902d211bd2 GIT binary patch literal 2601 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 literal 0 HcmV?d00001 diff --git a/libraries-files/output/alicepaulwithoutwatermark.pdf b/libraries-files/output/alicepaulwithoutwatermark.pdf new file mode 100644 index 0000000000..f291340bc1 --- /dev/null +++ b/libraries-files/output/alicepaulwithoutwatermark.pdf @@ -0,0 +1,43 @@ +%PDF-1.7 +% +5 0 obj +<>stream +x[o7+) l-ND@Y-+. 40[&g9sfx<.՚bsO:бY{0fzUk.379rQ#,=2^N:Vtx}IZNvq;Ovj} +]t:c+uƽJ̒:gǖd]̰8I4/l :7yTU "$|v4Dg=/_ֲDh٘TנB@.;QW#mvv|E+j*D]+yLme:v>)(hWuD=pI*qy,U>*4^{)h6:\9kIjIE@W@"+XZ>Zg(m!>qmsbZzZ @9[wյ<{iⱣxUe#jΡ1\W\èϿhCq~wUtyߎ0\x$8bI\pN|RE>>>/TrimBox[0 0 595 842]/Type/Page>> +endobj +1 0 obj +<> +endobj +3 0 obj +<> +endobj +6 0 obj +<> +endobj +7 0 obj +<> +endobj +2 0 obj +<> +endobj +xref +0 8 +0000000000 65535 f +0000001238 00000 n +0000001611 00000 n +0000001283 00000 n +0000001096 00000 n +0000000015 00000 n +0000001433 00000 n +0000001523 00000 n +trailer +<<216b46f23ae9d6b57462e9f47fac0cc5>]/Info 3 0 R/Root 1 0 R/Size 8>> +%iText-Core-7.2.4 +startxref +1662 +%%EOF diff --git a/libraries-files/output/aliceupdated.pdf b/libraries-files/output/aliceupdated.pdf new file mode 100644 index 0000000000000000000000000000000000000000..13e1cbd91f72e2e31d93f8b526883d3082093d19 GIT binary patch literal 2693 zcmb_eX;c(f7B(z$(g8F^hbS2>Vu&oEtEyM3fj+DaEd&r62%FMNH8j%Q&{Z^z;0ziT zj~p05MfL$?h?p5!WY+{D0Tqb^0a3<8MFbQi$Do*js8iJvQG0&m%uM~L^XlI3-FMgT zm8HKs&km-tDVF1R28JjI00Bx-EXC0gww?TkH4s;oZFg_b zcWANFaFe_9Uu%B|wX>zRPxkaqjy^GN&;KW*Yc*sL{&Doz2qyjItj3Z0cD3 zBFyj1(@M_w4WVaKpbqJtpndB{F77_2mqWcyFKcE$8beeCwL7+E6fPdVoq6TfC%IYE zN1f*Lt7v99<~z%LIl=g>W^pe+%vXJJDdAu94}a=$$RF@K-!s)S|GZW`6I)W-w0H2` zB1$Aa%n{$PP3-uh_p9yw`DvW!w!ZTPlF0sg`z?oChxorTz_^Ddx%HgW>^tlKQj%PA z=0UaKY*0p_$%h}Ms%P~}3K|(z-?&GYI)RnNows&fZLHm_XXqYtz3{GJw8GUnuVJ2A z=CGqFq_=;oTs@*bTC`~@wPx@S9=5SZb8OrrZJRD9>-)&7(K?R0m23TFp4CLQ{^-S+ zyR~yiLK5AbM$FkZ!v$Ud-iVzQzhXC-b?!Xro55n(~eJ4+GOJm$2CEX!#|>1EBf!7 znd--0t}H2qBOZ*mhm4I!bf2gg=Y_(E0K-$`QKQVJ%{XQ>8Kt| zh?p!oX?XrwI@%?z2wdl!ZJMXx2OC6W-2dLXU@$JewQd?lKOdmWqbko0V?Ujp1gLo( z$`s2B#Y?tRjB^{SHr2UpGYX%wXasp?qETM`uSppf`qr9zum_s<=k(P)Dh-JY-cnYi zR{0KpiK!Q&1mBIc-oC25J-4tF+j;5sGr_gh!92gs>7I38$Hp0Xf1YHQRZ-^Ab+uiy zziJ$509zdJw7rL9-#WFA&D4y<6$dyyEl7LZjNMymerhg#QaN@kXX)+YvK@ZixL~eY zV&UWc_T(C$U02e6=@i#)J5?UVpLpKg%^Mod&oyEIiWB_H^1f%9&;k-drQ@%k(8 zhgR&bL63)S@J=$Ou#nCR`}l4Aiu+?5N4ic8;Yh!8mhWgEeHQUM-BD+nH1y8i5exRW zCI>g~S%7ZHOa5Hvy*`oA9^#eK@bhQe4;$!R?J+oT`B>Oz)Yhb zS}#U*gtfSI#xHzRGXMOo-mgZby2N4s`-sE-72bGf!e-)1637yGfvX#hAN8B`o0x2f zYNBSQH5BEQ@3TI{Vg`9#&WK^@$xPGhb1YUP8S(edY_u&bwob23C@LwL-WYCG7<#{` z&?db)US_|v)SleYwwR&eEXHI?652CYHM;?;dLy>0F3&|jz`HUKmd0|ua&GEpT)F@k~1py*YBtQgAppwaTd=MnZ zql6>TD3?n{M{+lL*z!FH;4SuSW=&BGpOsM=-N=c#^Rawads0Kd;xG7aAz^2lu3?RbF#nayhP@^i0 zupMCy)Y2dbvLmenS~TFPQYOX&zQGQFTq%)BWvB#5#AJ%-7wZ4gnDt7C+7vFw=qkie zGTopT8mC5anOF#VD2V%!I1UVvDO?no?B#c0q6jCmOC}E1zO|KFF-(^7x7;ZciB5n) zZ+k& zEQrYd8!|eBNY3jr2ttT4d0hr0Y#kX5V(G|Wm`zmv^}P@T6NK@)47R81?4`jBoj7PP zTgN|g^j7TQDxoY6Rgr&oe0Lz+k(f#mgC(WWg(xCniI{8#i-san23sl=Lt-(L>nNd1 z5HSKX*@y&|O4(wmh%OdM38O+bB7{VAZY0Q8NR@z=g1`W!l4xGCYr#O-9+W5rQDaN( eblQ=lY^NP%3Wf_+xVBm}8iV-jwDj=fQT`1GU;7XM literal 0 HcmV?d00001 diff --git a/libraries-files/pom.xml b/libraries-files/pom.xml index efb102712c..b36dc150a8 100644 --- a/libraries-files/pom.xml +++ b/libraries-files/pom.xml @@ -37,6 +37,18 @@ jackson-databind ${jackson.version} + + com.itextpdf + itext7-core + 7.2.4 + pom + + + org.assertj + assertj-core + 3.23.1 + test + diff --git a/libraries-files/src/main/java/com/baeldung/iTextPDF/StoryTime.java b/libraries-files/src/main/java/com/baeldung/iTextPDF/StoryTime.java new file mode 100644 index 0000000000..78977ea160 --- /dev/null +++ b/libraries-files/src/main/java/com/baeldung/iTextPDF/StoryTime.java @@ -0,0 +1,126 @@ +package com.baeldung.iTextPDF; + +import static com.itextpdf.layout.properties.TextAlignment.CENTER; +import static com.itextpdf.layout.properties.VerticalAlignment.TOP; +import static java.lang.Math.PI; + +import java.io.File; +import java.io.IOException; + +import com.itextpdf.io.font.constants.StandardFonts; +import com.itextpdf.kernel.font.PdfFont; +import com.itextpdf.kernel.font.PdfFontFactory; +import com.itextpdf.kernel.geom.PageSize; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.kernel.pdf.PdfPage; +import com.itextpdf.kernel.pdf.PdfReader; +import com.itextpdf.kernel.pdf.PdfWriter; +import com.itextpdf.kernel.pdf.canvas.PdfCanvas; +import com.itextpdf.kernel.pdf.extgstate.PdfExtGState; +import com.itextpdf.layout.Document; +import com.itextpdf.layout.element.Paragraph; +import com.itextpdf.layout.element.Text; + +public class StoryTime { + + public static final String OUTPUT_FILE = "output/aliceupdated.pdf"; + + public String alice = " Alice was a curious young girl who one day stumbled upon a strange, talking rabbit." + " The rabbit, in a hurry, invited Alice to follow him down a rabbit hole." + + "Alice, not one to turn down an adventure, eagerly followed the rabbit and found herself tumbling down a long, dark tunnel.As she fell, Alice passed through a small door and into a fantastical world filled with talking animals and peculiar characters." + + "She met the Cheshire Cat, who seemed to appear and disappear at will, and the Mad Hatter, who invited her to a tea party." + + "Alice also encountered the tyrannical Queen of Hearts, who was quick to anger and ordered the beheading of anyone who crossed her." + + "Despite the dangers, Alice remained determined to find her way home and eventually stumbled upon the key to the door that would take her back to the real world." + + " As Alice stepped through the door and back into reality, she couldn't help but wonder if it had all been a dream. But the memories of her adventures in Wonderland stayed with her forever, and she often found herself longing to return to that strange and magical place."; + + public String paul = " Paulinho is a Brazilian professional footballer who currently plays as a midfielder for Guangzhou Evergrande Taobao in the Chinese Super League." + + "He has also played for several top clubs around the world, including Barcelona, Tottenham Hotspur, and Guangzhou Evergrande. Paulinho has represented Brazil at the international level and has won several accolades throughout his career, including the Copa America and the Chinese Super League title." + + "He is known for his strong work ethic and powerful offensive play."; + + public static void main(String[] args) throws IOException { + File file = new File(OUTPUT_FILE); + file.getParentFile() + .mkdirs(); + + // new StoryTime().createPdf(); + new StoryTime().addWatermarkToExistingPdf(); + + } + + public void createPdf() throws IOException { + StoryTime storyTime = new StoryTime(); + String waterMark = "CONFIDENTIAL"; + PdfWriter writer = new PdfWriter(storyTime.OUTPUT_FILE); + PdfDocument pdf = new PdfDocument(writer); + + try (Document document = new Document(pdf)) { + + document.add(new Paragraph(storyTime.alice).setFont(PdfFontFactory.createFont(StandardFonts.TIMES_ROMAN))); + document.add(new Paragraph(storyTime.paul)); + + Paragraph paragraph = storyTime.createWatermarkParagraph(waterMark); + for (int i = 1; i <= document.getPdfDocument() + .getNumberOfPages(); i++) { + + storyTime.addWatermarkToPage(document, i, paragraph, 0f); + } + } + } + + public void addWatermarkToExistingPdf() throws IOException { + StoryTime storyTime = new StoryTime(); + String outputPdf = "output/aliceupdated.pdf"; + String watermark = "CONFIDENTIAL"; + + try (PdfDocument pdfDocument = new PdfDocument(new PdfReader("output/alicepaulwithoutwatermark.pdf"), new PdfWriter(outputPdf))) { + Document document = new Document(pdfDocument); + + Paragraph paragraph = storyTime.createWatermarkParagraph(watermark); + PdfExtGState transparentGraphicState = new PdfExtGState().setFillOpacity(0.5f); + for (int i = 1; i <= document.getPdfDocument() + .getNumberOfPages(); i++) { + storyTime.addWatermarkToExistingPage(document, i, paragraph, transparentGraphicState, 0f); + } + } + } + + public Paragraph createWatermarkParagraph(String watermark) throws IOException { + PdfFont font = PdfFontFactory.createFont(StandardFonts.HELVETICA); + Text text = new Text(watermark); + text.setFont(font); + text.setFontSize(56); + text.setOpacity(0.5f); + + return new Paragraph(text); + } + + public void addWatermarkToPage(Document document, int pageIndex, Paragraph paragraph, float verticalOffset) { + PdfPage pdfPage = document.getPdfDocument() + .getPage(pageIndex); + PageSize pageSize = (PageSize) pdfPage.getPageSizeWithRotation(); + + float x = (pageSize.getLeft() + pageSize.getRight()) / 2; + float y = (pageSize.getTop() + pageSize.getBottom()) / 2; + float xOffset = 100f / 2; + float rotationInRadians = (float) (PI / 180 * 45f); + document.showTextAligned(paragraph, x - xOffset, y + verticalOffset, pageIndex, CENTER, TOP, rotationInRadians); + } + + public void addWatermarkToExistingPage(Document document, int pageIndex, Paragraph paragraph, PdfExtGState graphicState, float verticalOffset) { + PdfDocument pdfDoc = document.getPdfDocument(); + PdfPage pdfPage = pdfDoc.getPage(pageIndex); + PageSize pageSize = (PageSize) pdfPage.getPageSizeWithRotation(); + + float x = (pageSize.getLeft() + pageSize.getRight()) / 2; + float y = (pageSize.getTop() + pageSize.getBottom()) / 2; + PdfCanvas over = new PdfCanvas(pdfDoc.getPage(pageIndex)); + over.saveState(); + over.setExtGState(graphicState); + float xOffset = 100f / 2; + float rotationInRadians = (float) (PI / 180 * 45f); + document.showTextAligned(paragraph, x - xOffset, y + verticalOffset, pageIndex, CENTER, TOP, rotationInRadians); + document.flush(); + over.restoreState(); + over.release(); + } + +} diff --git a/libraries-files/src/test/java/com/baeldung/iTextPDFTest/AddWaterMarkToExistingPdfUnitTest.java b/libraries-files/src/test/java/com/baeldung/iTextPDFTest/AddWaterMarkToExistingPdfUnitTest.java new file mode 100644 index 0000000000..4e45fe4281 --- /dev/null +++ b/libraries-files/src/test/java/com/baeldung/iTextPDFTest/AddWaterMarkToExistingPdfUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.iTextPDFTest; + +import static com.itextpdf.kernel.pdf.canvas.parser.PdfTextExtractor.getTextFromPage; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import java.io.IOException; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.baeldung.iTextPDF.StoryTime; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.kernel.pdf.PdfReader; +import com.itextpdf.kernel.pdf.PdfWriter; +import com.itextpdf.kernel.pdf.canvas.parser.listener.LocationTextExtractionStrategy; +import com.itextpdf.kernel.pdf.extgstate.PdfExtGState; +import com.itextpdf.layout.Document; +import com.itextpdf.layout.element.Paragraph; + +class AddWaterMarkToExistingPdfUnitTest { + + @Test + public void givenAnExistingPDF_whenManipulatedPDFWithIText_thenGeneratePDFwithWatermarks() throws IOException { + StoryTime storyTime = new StoryTime(); + String outputPdf = "output/aliceupdated.pdf"; + String watermark = "CONFIDENTIAL"; + + LocationTextExtractionStrategy extStrategy = new LocationTextExtractionStrategy(); + try (PdfDocument pdfDocument = new PdfDocument(new PdfReader(outputPdf))) { + for (int i = 1; i <= pdfDocument.getNumberOfPages(); i++) { + String textFromPage = getTextFromPage(pdfDocument.getPage(i), extStrategy); + assertThat(textFromPage).contains(watermark); + } + } + + } + +} diff --git a/libraries-files/src/test/java/com/baeldung/iTextPDFTest/GenerateNewPdfWithWatermarkUnitTest.java b/libraries-files/src/test/java/com/baeldung/iTextPDFTest/GenerateNewPdfWithWatermarkUnitTest.java new file mode 100644 index 0000000000..0d383d2f38 --- /dev/null +++ b/libraries-files/src/test/java/com/baeldung/iTextPDFTest/GenerateNewPdfWithWatermarkUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.iTextPDFTest; + +import static com.itextpdf.kernel.pdf.canvas.parser.PdfTextExtractor.getTextFromPage; +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; + +import org.junit.jupiter.api.Test; + +import com.baeldung.iTextPDF.StoryTime; +import com.itextpdf.io.font.constants.StandardFonts; +import com.itextpdf.kernel.font.PdfFontFactory; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.kernel.pdf.PdfReader; +import com.itextpdf.kernel.pdf.PdfWriter; +import com.itextpdf.kernel.pdf.canvas.parser.listener.LocationTextExtractionStrategy; +import com.itextpdf.layout.Document; +import com.itextpdf.layout.element.Paragraph; + +class GenerateNewPdfWithWatermarkUnitTest { + + @Test + public void givenNewTexts_whenGeneratingNewPDFWithIText_thenGeneratePDFwithWatermarks() throws IOException { + StoryTime storyTime = new StoryTime(); + String waterMark = "CONFIDENTIAL"; + + LocationTextExtractionStrategy extStrategy = new LocationTextExtractionStrategy(); + try (PdfDocument pdfDocument = new PdfDocument(new PdfReader(storyTime.OUTPUT_FILE))) { + for (int i = 1; i <= pdfDocument.getNumberOfPages(); i++) { + String textFromPage = getTextFromPage(pdfDocument.getPage(i), extStrategy); + assertThat(textFromPage).contains(waterMark); + } + } + + } + +} From 866b46690b0922672b70660d4a61f08e9cfaefba Mon Sep 17 00:00:00 2001 From: TomVerkon Date: Fri, 23 Dec 2022 15:46:05 -0500 Subject: [PATCH 178/592] Updated versions to jakarta namespace --- logging-modules/logback/pom.xml | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/logging-modules/logback/pom.xml b/logging-modules/logback/pom.xml index 76aeea447d..b3d7b7b4dc 100644 --- a/logging-modules/logback/pom.xml +++ b/logging-modules/logback/pom.xml @@ -65,17 +65,15 @@ - javax.mail - javax.mail-api - ${javax.mail.version} + com.sun.mail + jakarta.mail + ${jakarta.mail.version} - javax.activation - javax.activation-api - ${javax.activation.version} - runtime + com.sun.activation + jakarta.activation + ${jakarta.activation.version} - @@ -117,10 +115,10 @@ 20180130 0.1.5 3.3.5 - 1.6.2 - 1.2.0 - 1.3.5 - 2.0.4 + 2.0.1 + 2.0.1 + 1.4.5 + 2.0.6 \ No newline at end of file From ecc8b269c10e8b019fd3c84e5aebcbb4e2b4cdf9 Mon Sep 17 00:00:00 2001 From: TomVerkon Date: Fri, 23 Dec 2022 20:52:59 -0500 Subject: [PATCH 179/592] updated logback libraries; Added logback-core version 1.3.5 to pom Added slf4j version 2.0.4 to pom Updated javax.mail version to 1.6.2. Namespace changed to com.sun.mail Updated javax.activation to version 1.6.2 All changes had to be compatible with jdk 1.8 --- logging-modules/logback/pom.xml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/logging-modules/logback/pom.xml b/logging-modules/logback/pom.xml index b3d7b7b4dc..937a88da09 100644 --- a/logging-modules/logback/pom.xml +++ b/logging-modules/logback/pom.xml @@ -66,13 +66,14 @@ com.sun.mail - jakarta.mail - ${jakarta.mail.version} + javax.mail + ${javax.mail.version} - com.sun.activation - jakarta.activation - ${jakarta.activation.version} + javax.activation + javax.activation-api + ${javax.activation.version} + runtime @@ -115,10 +116,10 @@ 20180130 0.1.5 3.3.5 - 2.0.1 - 2.0.1 - 1.4.5 - 2.0.6 + 1.6.2 + 1.2.0 + 1.3.5 + 2.0.4 \ No newline at end of file From 74c28e8b79b11b0be4e2e73e12c04738e35d225e Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Sat, 24 Dec 2022 13:17:29 +0530 Subject: [PATCH 180/592] backlink removed --- security-modules/cas/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/security-modules/cas/README.md b/security-modules/cas/README.md index 6ceeaea0c4..a50159d2d8 100644 --- a/security-modules/cas/README.md +++ b/security-modules/cas/README.md @@ -15,4 +15,3 @@ The server starts at https://localhost:8443. `casuser`/`Mellon` are the username ### Relevant Articles: -- [CAS SSO With Spring Security](https://www.baeldung.com/spring-security-cas-sso) \ No newline at end of file From 3e429428a7fbb9ef3a111397d92833c27fb54234 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Sat, 24 Dec 2022 13:22:01 +0530 Subject: [PATCH 181/592] backlink added --- spring-boot-modules/spring-boot-3-native/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 spring-boot-modules/spring-boot-3-native/README.md diff --git a/spring-boot-modules/spring-boot-3-native/README.md b/spring-boot-modules/spring-boot-3-native/README.md new file mode 100644 index 0000000000..6f46263257 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-native/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Native Images with Spring Boot and GraalVM](https://www.baeldung.com/spring-native-intro) From c67ef1932c470be873b6ea2e14f7a29a152e4c06 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Sat, 24 Dec 2022 17:12:50 +0530 Subject: [PATCH 182/592] backlink fixed --- testing-modules/spring-testing-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing-modules/spring-testing-2/README.md b/testing-modules/spring-testing-2/README.md index 434388d683..5bd1716609 100644 --- a/testing-modules/spring-testing-2/README.md +++ b/testing-modules/spring-testing-2/README.md @@ -2,5 +2,5 @@ - [Guide to @DynamicPropertySource in Spring](https://www.baeldung.com/spring-dynamicpropertysource) - [Concurrent Test Execution in Spring 5](https://www.baeldung.com/spring-5-concurrent-tests) -- [Spring 5 Testing with @EnabledIf Annotation](https://www.baeldung.com/spring-5-enabledIf) +- [Spring 5 Testing with @EnabledIf Annotation](https://www.baeldung.com/spring-5-enabledif) - [The Spring TestExecutionListener](https://www.baeldung.com/spring-testexecutionlistener) From fd63a915f3e51772935b1beb71f8ce3c2909420e Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 25 Dec 2022 15:08:05 +0200 Subject: [PATCH 183/592] BAEL-71323 re-org modules --- javaxval2/.gitignore | 6 --- javaxval2/README.md | 5 -- javaxval2/pom.xml | 34 ------------- ...eanDeserializerModifierWithValidation.java | 20 -------- .../BeanDeserializerWithValidation.java | 40 --------------- .../afterdeserialization/Student.java | 14 ----- .../StudentDeserializerWithValidation.java | 24 --------- ...entDeserializerWithValidationUnitTest.java | 51 ------------------- .../nameTooLongStudent.json | 3 -- .../nameTooShortStudent.json | 3 -- .../afterdeserialization/validStudent.json | 3 -- patterns-modules/README.md | 1 - patterns-modules/coupling/README.md | 2 + .../{wire-tap => }/README.md | 0 patterns-modules/enterprise-patterns/pom.xml | 4 -- .../{wire-tap => }/src/data/.camel/msg1.xml | 0 .../{wire-tap => }/src/data/msg.xml | 0 .../java/com/baeldung/AmqApplication.java | 0 .../src/main/java/com/baeldung/MyBean.java | 0 .../src/main/java/com/baeldung/MyPayload.java | 0 .../com/baeldung/MyPayloadClonePrepare.java | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/log4j.properties | 0 ...HYLTPDL1209-34209-1621429668568-4-10-1-1-1 | 0 ...HYLTPDL1209-34209-1621429668568-4-11-1-1-1 | 0 ...NHYLTPDL1209-34209-1621429668568-4-2-1-1-1 | 0 ...NHYLTPDL1209-34209-1621429668568-4-3-1-1-1 | 0 ...NHYLTPDL1209-34209-1621429668568-4-4-1-1-1 | 0 ...NHYLTPDL1209-34209-1621429668568-4-5-1-1-1 | 0 ...NHYLTPDL1209-34209-1621429668568-4-6-1-1-1 | 0 ...NHYLTPDL1209-34209-1621429668568-4-7-1-1-1 | 0 ...NHYLTPDL1209-34209-1621429668568-4-8-1-1-1 | 0 ...NHYLTPDL1209-34209-1621429668568-4-9-1-1-1 | 0 ...HYLTPDL1209-46717-1621429562728-4-10-1-1-1 | 0 ...HYLTPDL1209-46717-1621429562728-4-11-1-1-1 | 0 ...NHYLTPDL1209-46717-1621429562728-4-2-1-1-1 | 0 ...NHYLTPDL1209-46717-1621429562728-4-3-1-1-1 | 0 ...NHYLTPDL1209-46717-1621429562728-4-4-1-1-1 | 0 ...NHYLTPDL1209-46717-1621429562728-4-5-1-1-1 | 0 ...NHYLTPDL1209-46717-1621429562728-4-6-1-1-1 | 0 ...NHYLTPDL1209-46717-1621429562728-4-7-1-1-1 | 0 ...NHYLTPDL1209-46717-1621429562728-4-8-1-1-1 | 0 ...NHYLTPDL1209-46717-1621429562728-4-9-1-1-1 | 0 .../enterprise-patterns/wire-tap/pom.xml | 25 --------- .../hexagonal-architecture/pom.xml | 50 ------------------ .../hexagonal/HexArchApplicationDemo.java | 13 ----- .../pattern/hexagonal/config/AppConfig.java | 15 ------ .../pattern/hexagonal/config/MongoConfig.java | 10 ---- .../controller/EmployeeController.java | 25 --------- .../hexagonal/domain/model/Employee.java | 51 ------------------- .../domain/services/EmployeeService.java | 10 ---- .../domain/services/EmployeeServiceImpl.java | 34 ------------- .../persistence/EmployeeRepository.java | 15 ------ .../persistence/MongoDBRepository.java | 24 --------- .../hexagonal/persistence/MongoRepoEx.java | 9 ---- .../src/main/resources/application.properties | 1 - .../services/EmployeeServiceImplUnitTest.java | 46 ----------------- patterns-modules/pom.xml | 1 - 58 files changed, 2 insertions(+), 537 deletions(-) delete mode 100644 javaxval2/.gitignore delete mode 100644 javaxval2/README.md delete mode 100644 javaxval2/pom.xml delete mode 100644 javaxval2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java delete mode 100644 javaxval2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java delete mode 100644 javaxval2/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java delete mode 100644 javaxval2/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java delete mode 100644 javaxval2/src/test/java/com/baeldung/javaxval/StudentDeserializerWithValidationUnitTest.java delete mode 100644 javaxval2/src/test/resources/afterdeserialization/nameTooLongStudent.json delete mode 100644 javaxval2/src/test/resources/afterdeserialization/nameTooShortStudent.json delete mode 100644 javaxval2/src/test/resources/afterdeserialization/validStudent.json create mode 100644 patterns-modules/coupling/README.md rename patterns-modules/enterprise-patterns/{wire-tap => }/README.md (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/src/data/.camel/msg1.xml (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/src/data/msg.xml (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/src/main/java/com/baeldung/AmqApplication.java (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/src/main/java/com/baeldung/MyBean.java (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/src/main/java/com/baeldung/MyPayload.java (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/src/main/java/com/baeldung/MyPayloadClonePrepare.java (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/src/main/resources/application.properties (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/src/main/resources/log4j.properties (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-10-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-11-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-2-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-3-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-4-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-5-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-6-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-7-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-8-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-9-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-10-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-11-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-2-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-3-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-4-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-5-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-6-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-7-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-8-1-1-1 (100%) rename patterns-modules/enterprise-patterns/{wire-tap => }/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-9-1-1-1 (100%) delete mode 100644 patterns-modules/enterprise-patterns/wire-tap/pom.xml delete mode 100644 patterns-modules/hexagonal-architecture/pom.xml delete mode 100644 patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/HexArchApplicationDemo.java delete mode 100644 patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/config/AppConfig.java delete mode 100644 patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/config/MongoConfig.java delete mode 100644 patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/controller/EmployeeController.java delete mode 100644 patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/model/Employee.java delete mode 100644 patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeService.java delete mode 100644 patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeServiceImpl.java delete mode 100644 patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/EmployeeRepository.java delete mode 100644 patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/MongoDBRepository.java delete mode 100644 patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/MongoRepoEx.java delete mode 100644 patterns-modules/hexagonal-architecture/src/main/resources/application.properties delete mode 100644 patterns-modules/hexagonal-architecture/src/test/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeServiceImplUnitTest.java diff --git a/javaxval2/.gitignore b/javaxval2/.gitignore deleted file mode 100644 index 8027134ae9..0000000000 --- a/javaxval2/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -.classpath -.project -.settings/ -target/ -bin/ - diff --git a/javaxval2/README.md b/javaxval2/README.md deleted file mode 100644 index 8f03107330..0000000000 --- a/javaxval2/README.md +++ /dev/null @@ -1,5 +0,0 @@ -## Java Bean Validation Examples - -This module contains articles about Bean Validation. - -### Relevant Articles: diff --git a/javaxval2/pom.xml b/javaxval2/pom.xml deleted file mode 100644 index 2e0ed0a281..0000000000 --- a/javaxval2/pom.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - 4.0.0 - javaxval2 - 0.1-SNAPSHOT - javaxval2 - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - org.springframework.boot - spring-boot-starter-validation - ${spring.boot.version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.databind.version} - - - - - 2.7.5 - 2.14.0 - - - \ No newline at end of file diff --git a/javaxval2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java b/javaxval2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java deleted file mode 100644 index 3e20ebad6b..0000000000 --- a/javaxval2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baeldung.javaxval.afterdeserialization; - -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.DeserializationConfig; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.deser.BeanDeserializer; -import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier; - -public class BeanDeserializerModifierWithValidation extends BeanDeserializerModifier { - - @Override - public JsonDeserializer modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer deserializer) { - if (deserializer instanceof BeanDeserializer) { - return new BeanDeserializerWithValidation((BeanDeserializer) deserializer); - } - - return deserializer; - } - -} diff --git a/javaxval2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java b/javaxval2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java deleted file mode 100644 index 332c83010d..0000000000 --- a/javaxval2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.baeldung.javaxval.afterdeserialization; - -import java.io.IOException; -import java.util.Set; - -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.deser.BeanDeserializer; -import com.fasterxml.jackson.databind.deser.BeanDeserializerBase; - -public class BeanDeserializerWithValidation extends BeanDeserializer { - - private static final ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - private static final Validator validator = factory.getValidator(); - - protected BeanDeserializerWithValidation(BeanDeserializerBase src) { - super(src); - } - - @Override - public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - Object instance = super.deserialize(p, ctxt); - validate(instance); - return instance; - } - - public void validate(T t) { - Set> violations = validator.validate(t); - if (!violations.isEmpty()) { - throw new ConstraintViolationException(violations); - } - } - -} diff --git a/javaxval2/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java b/javaxval2/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java deleted file mode 100644 index c1923de265..0000000000 --- a/javaxval2/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.javaxval.afterdeserialization; - -import javax.validation.constraints.Size; - -public class Student { - - @Size(min = 5, max = 10, message = "Student's name must be between 5 and 10 characters") - private String name; - - public String getName() { - return name; - } - -} diff --git a/javaxval2/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java b/javaxval2/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java deleted file mode 100644 index e652a43ccb..0000000000 --- a/javaxval2/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.javaxval.afterdeserialization; - -import java.io.IOException; -import java.io.InputStream; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; - -public class StudentDeserializerWithValidation { - - public static Student readStudent(InputStream inputStream) throws IOException { - ObjectMapper mapper = getObjectMapperWithValidation(); - return mapper.readValue(inputStream, Student.class); - } - - private static ObjectMapper getObjectMapperWithValidation() { - SimpleModule validationModule = new SimpleModule(); - validationModule.setDeserializerModifier(new BeanDeserializerModifierWithValidation()); - ObjectMapper mapper = new ObjectMapper(); - mapper.registerModule(validationModule); - return mapper; - } - -} diff --git a/javaxval2/src/test/java/com/baeldung/javaxval/StudentDeserializerWithValidationUnitTest.java b/javaxval2/src/test/java/com/baeldung/javaxval/StudentDeserializerWithValidationUnitTest.java deleted file mode 100644 index edbe85ecfe..0000000000 --- a/javaxval2/src/test/java/com/baeldung/javaxval/StudentDeserializerWithValidationUnitTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.baeldung.javaxval; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import java.io.IOException; -import java.io.InputStream; - -import javax.validation.ConstraintViolationException; - -import org.junit.jupiter.api.Test; - -import com.baeldung.javaxval.afterdeserialization.Student; -import com.baeldung.javaxval.afterdeserialization.StudentDeserializerWithValidation; - -public class StudentDeserializerWithValidationUnitTest { - - private final String EXPECTED_ERROR_MESSAGE = "name: Student's name must be between 5 and 10 characters"; - private final String EXPECTED_STUDENT_NAME = "Daniel"; - private final String NAME_TOO_LONG_STUDENT_FILE = "nameTooLongStudent.json"; - private final String NAME_TOO_SHORT_STUDENT_FILE = "nameTooShortStudent.json"; - private final String SUBDIRECTORY = "afterdeserialization/"; - private final String VALID_STUDENT_FILE = "validStudent.json"; - - @Test - void givenValidStudent_WhenReadStudent_ThenReturnStudent() throws IOException { - InputStream inputStream = getInputStream(VALID_STUDENT_FILE); - Student result = StudentDeserializerWithValidation.readStudent(inputStream); - assertEquals(EXPECTED_STUDENT_NAME, result.getName()); - } - - @Test - void givenStudentWithTooShortName_WhenReadStudent_ThenThrows() { - InputStream inputStream = getInputStream(NAME_TOO_SHORT_STUDENT_FILE); - ConstraintViolationException constraintViolationException = assertThrows(ConstraintViolationException.class, () -> StudentDeserializerWithValidation.readStudent(inputStream)); - assertEquals(EXPECTED_ERROR_MESSAGE, constraintViolationException.getMessage()); - } - - @Test - void givenStudentWithTooLongName_WhenReadStudent_ThenThrows() { - InputStream inputStream = getInputStream(NAME_TOO_LONG_STUDENT_FILE); - ConstraintViolationException constraintViolationException = assertThrows(ConstraintViolationException.class, () -> StudentDeserializerWithValidation.readStudent(inputStream)); - assertEquals(EXPECTED_ERROR_MESSAGE, constraintViolationException.getMessage()); - } - - private InputStream getInputStream(String fileName) { - return getClass().getClassLoader() - .getResourceAsStream(SUBDIRECTORY + fileName); - } - -} diff --git a/javaxval2/src/test/resources/afterdeserialization/nameTooLongStudent.json b/javaxval2/src/test/resources/afterdeserialization/nameTooLongStudent.json deleted file mode 100644 index e537ecb25d..0000000000 --- a/javaxval2/src/test/resources/afterdeserialization/nameTooLongStudent.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "Constantine" -} \ No newline at end of file diff --git a/javaxval2/src/test/resources/afterdeserialization/nameTooShortStudent.json b/javaxval2/src/test/resources/afterdeserialization/nameTooShortStudent.json deleted file mode 100644 index 79ab10cb80..0000000000 --- a/javaxval2/src/test/resources/afterdeserialization/nameTooShortStudent.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "Max" -} \ No newline at end of file diff --git a/javaxval2/src/test/resources/afterdeserialization/validStudent.json b/javaxval2/src/test/resources/afterdeserialization/validStudent.json deleted file mode 100644 index 938002ea51..0000000000 --- a/javaxval2/src/test/resources/afterdeserialization/validStudent.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "Daniel" -} \ No newline at end of file diff --git a/patterns-modules/README.md b/patterns-modules/README.md index 8cf237defd..654beb4cd7 100644 --- a/patterns-modules/README.md +++ b/patterns-modules/README.md @@ -2,4 +2,3 @@ This module contains articles about design patterns. -- [Coupling in Java](https://www.baeldung.com/java-coupling-classes-tight-loose) diff --git a/patterns-modules/coupling/README.md b/patterns-modules/coupling/README.md new file mode 100644 index 0000000000..2d39e74474 --- /dev/null +++ b/patterns-modules/coupling/README.md @@ -0,0 +1,2 @@ + +- [Coupling in Java](https://www.baeldung.com/java-coupling-classes-tight-loose) diff --git a/patterns-modules/enterprise-patterns/wire-tap/README.md b/patterns-modules/enterprise-patterns/README.md similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/README.md rename to patterns-modules/enterprise-patterns/README.md diff --git a/patterns-modules/enterprise-patterns/pom.xml b/patterns-modules/enterprise-patterns/pom.xml index aee56c04ff..2c59ae2536 100644 --- a/patterns-modules/enterprise-patterns/pom.xml +++ b/patterns-modules/enterprise-patterns/pom.xml @@ -12,10 +12,6 @@ 1.0.0-SNAPSHOT - - wire-tap - - diff --git a/patterns-modules/enterprise-patterns/wire-tap/src/data/.camel/msg1.xml b/patterns-modules/enterprise-patterns/src/data/.camel/msg1.xml similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/src/data/.camel/msg1.xml rename to patterns-modules/enterprise-patterns/src/data/.camel/msg1.xml diff --git a/patterns-modules/enterprise-patterns/wire-tap/src/data/msg.xml b/patterns-modules/enterprise-patterns/src/data/msg.xml similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/src/data/msg.xml rename to patterns-modules/enterprise-patterns/src/data/msg.xml diff --git a/patterns-modules/enterprise-patterns/wire-tap/src/main/java/com/baeldung/AmqApplication.java b/patterns-modules/enterprise-patterns/src/main/java/com/baeldung/AmqApplication.java similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/src/main/java/com/baeldung/AmqApplication.java rename to patterns-modules/enterprise-patterns/src/main/java/com/baeldung/AmqApplication.java diff --git a/patterns-modules/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyBean.java b/patterns-modules/enterprise-patterns/src/main/java/com/baeldung/MyBean.java similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyBean.java rename to patterns-modules/enterprise-patterns/src/main/java/com/baeldung/MyBean.java diff --git a/patterns-modules/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyPayload.java b/patterns-modules/enterprise-patterns/src/main/java/com/baeldung/MyPayload.java similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyPayload.java rename to patterns-modules/enterprise-patterns/src/main/java/com/baeldung/MyPayload.java diff --git a/patterns-modules/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyPayloadClonePrepare.java b/patterns-modules/enterprise-patterns/src/main/java/com/baeldung/MyPayloadClonePrepare.java similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/src/main/java/com/baeldung/MyPayloadClonePrepare.java rename to patterns-modules/enterprise-patterns/src/main/java/com/baeldung/MyPayloadClonePrepare.java diff --git a/patterns-modules/enterprise-patterns/wire-tap/src/main/resources/application.properties b/patterns-modules/enterprise-patterns/src/main/resources/application.properties similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/src/main/resources/application.properties rename to patterns-modules/enterprise-patterns/src/main/resources/application.properties diff --git a/patterns-modules/enterprise-patterns/wire-tap/src/main/resources/log4j.properties b/patterns-modules/enterprise-patterns/src/main/resources/log4j.properties similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/src/main/resources/log4j.properties rename to patterns-modules/enterprise-patterns/src/main/resources/log4j.properties diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-10-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-10-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-10-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-10-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-11-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-11-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-11-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-11-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-2-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-2-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-2-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-2-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-3-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-3-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-3-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-3-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-4-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-4-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-4-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-4-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-5-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-5-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-5-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-5-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-6-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-6-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-6-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-6-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-7-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-7-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-7-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-7-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-8-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-8-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-8-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-8-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-9-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-9-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-9-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-34209-1621429668568-4-9-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-10-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-10-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-10-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-10-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-11-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-11-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-11-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-11-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-2-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-2-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-2-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-2-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-3-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-3-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-3-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-3-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-4-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-4-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-4-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-4-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-5-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-5-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-5-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-5-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-6-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-6-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-6-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-6-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-7-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-7-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-7-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-7-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-8-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-8-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-8-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-8-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-9-1-1-1 b/patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-9-1-1-1 similarity index 100% rename from patterns-modules/enterprise-patterns/wire-tap/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-9-1-1-1 rename to patterns-modules/enterprise-patterns/test/ID-PRINHYLTPDL1209-46717-1621429562728-4-9-1-1-1 diff --git a/patterns-modules/enterprise-patterns/wire-tap/pom.xml b/patterns-modules/enterprise-patterns/wire-tap/pom.xml deleted file mode 100644 index e7959e17f0..0000000000 --- a/patterns-modules/enterprise-patterns/wire-tap/pom.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - 4.0.0 - wire-tap - 1.0 - jar - - - enterprise-patterns - com.baeldung - 1.0.0-SNAPSHOT - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - \ No newline at end of file diff --git a/patterns-modules/hexagonal-architecture/pom.xml b/patterns-modules/hexagonal-architecture/pom.xml deleted file mode 100644 index b18bd49aec..0000000000 --- a/patterns-modules/hexagonal-architecture/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - 4.0.0 - com.baeldung - hexagonal-architecture - 1.0 - hexagonal-architecture - Project for hexagonal architecture in java - - - 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-data-mongodb - - - org.springframework.boot - spring-boot-starter-test - test - - - org.junit.vintage - junit-vintage-engine - - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - \ No newline at end of file diff --git a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/HexArchApplicationDemo.java b/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/HexArchApplicationDemo.java deleted file mode 100644 index 52aaefaaf7..0000000000 --- a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/HexArchApplicationDemo.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.pattern.hexagonal; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class HexArchApplicationDemo { - - public static void main(String[] args) { - SpringApplication.run(HexArchApplicationDemo.class, args); - } - -} diff --git a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/config/AppConfig.java b/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/config/AppConfig.java deleted file mode 100644 index ee8a01d0e2..0000000000 --- a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/config/AppConfig.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.pattern.hexagonal.config; - -import com.baeldung.pattern.hexagonal.domain.services.EmployeeService; -import com.baeldung.pattern.hexagonal.domain.services.EmployeeServiceImpl; -import com.baeldung.pattern.hexagonal.persistence.EmployeeRepository; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class AppConfig { - @Bean - public EmployeeService getEmployeeService(EmployeeRepository employeeRepository) { - return new EmployeeServiceImpl(employeeRepository); - } -} diff --git a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/config/MongoConfig.java b/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/config/MongoConfig.java deleted file mode 100644 index fa6980824a..0000000000 --- a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/config/MongoConfig.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.baeldung.pattern.hexagonal.config; - -import com.baeldung.pattern.hexagonal.persistence.MongoRepoEx; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; - -@Configuration -@EnableMongoRepositories(basePackageClasses = MongoRepoEx.class) -public class MongoConfig { -} diff --git a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/controller/EmployeeController.java b/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/controller/EmployeeController.java deleted file mode 100644 index 077fc6fdea..0000000000 --- a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/controller/EmployeeController.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.pattern.hexagonal.controller; - -import com.baeldung.pattern.hexagonal.domain.model.Employee; -import com.baeldung.pattern.hexagonal.domain.services.EmployeeService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping("/employees") -public class EmployeeController { - @Autowired - EmployeeService employeeService; - - @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - @ResponseBody - public Employee addEmployee(@RequestBody Employee employee) { - return employeeService.addEmployee(employee); - } - - @GetMapping(path = "/{employeeId}") - public Employee getEmployee(@PathVariable("employeeId") String employeeId) { - return employeeService.getEmployee(employeeId); - } -} diff --git a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/model/Employee.java b/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/model/Employee.java deleted file mode 100644 index de1f15cf53..0000000000 --- a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/model/Employee.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.baeldung.pattern.hexagonal.domain.model; - -import org.springframework.data.annotation.Id; - -import java.util.Objects; - -public class Employee { - @Id - private String empId; - private String empName; - private String empJobTitle; - - public String getEmpId() { - return empId; - } - - public void setEmpId(String empId) { - this.empId = empId; - } - - public String getEmpName() { - return empName; - } - - public void setEmpName(String empName) { - this.empName = empName; - } - - public String getEmpJobTitle() { - return empJobTitle; - } - - public void setEmpJobTitle(String empJobTitle) { - this.empJobTitle = empJobTitle; - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - Employee employee = (Employee) o; - return empId.equals(employee.empId); - } - - @Override - public int hashCode() { - return Objects.hash(empId); - } -} \ No newline at end of file diff --git a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeService.java b/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeService.java deleted file mode 100644 index 902abefabb..0000000000 --- a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeService.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.baeldung.pattern.hexagonal.domain.services; - -import com.baeldung.pattern.hexagonal.domain.model.Employee; - -public interface EmployeeService { - - Employee addEmployee(Employee employee); - - Employee getEmployee(String employeeId); -} diff --git a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeServiceImpl.java b/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeServiceImpl.java deleted file mode 100644 index cd7c30ff30..0000000000 --- a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeServiceImpl.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.pattern.hexagonal.domain.services; - -import com.baeldung.pattern.hexagonal.domain.model.Employee; -import com.baeldung.pattern.hexagonal.persistence.EmployeeRepository; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.Optional; - -public class EmployeeServiceImpl implements EmployeeService { - - private EmployeeRepository employeeRepository; - - @Autowired - public EmployeeServiceImpl(EmployeeRepository employeeRepository) { - this.employeeRepository = employeeRepository; - } - - @Override - public Employee addEmployee(Employee employee) { - return employeeRepository.add(employee); - } - - @Override - public Employee getEmployee(String employeeId) { - Optional employee = employeeRepository.findById(employeeId); - - if (employee.isPresent()) { - return employee.get(); - } else { - // throw - } - return null; - } -} diff --git a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/EmployeeRepository.java b/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/EmployeeRepository.java deleted file mode 100644 index 53b4b6d276..0000000000 --- a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/EmployeeRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.pattern.hexagonal.persistence; - -import com.baeldung.pattern.hexagonal.domain.model.Employee; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -@Repository -public interface EmployeeRepository { - - Employee add(Employee employee); - - Optional findById(String id); - -} diff --git a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/MongoDBRepository.java b/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/MongoDBRepository.java deleted file mode 100644 index 08f0c96ab0..0000000000 --- a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/MongoDBRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.pattern.hexagonal.persistence; - -import com.baeldung.pattern.hexagonal.domain.model.Employee; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -@Repository -public class MongoDBRepository implements EmployeeRepository { - - @Autowired - MongoRepoEx mongoRepository; - - @Override - public Employee add(Employee employee) { - return mongoRepository.insert(employee); - } - - @Override - public Optional findById(String id) { - return mongoRepository.findById(id); - } -} diff --git a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/MongoRepoEx.java b/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/MongoRepoEx.java deleted file mode 100644 index 766444c22f..0000000000 --- a/patterns-modules/hexagonal-architecture/src/main/java/com/baeldung/pattern/hexagonal/persistence/MongoRepoEx.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.pattern.hexagonal.persistence; - -import com.baeldung.pattern.hexagonal.domain.model.Employee; -import org.springframework.data.mongodb.repository.MongoRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface MongoRepoEx extends MongoRepository { -} diff --git a/patterns-modules/hexagonal-architecture/src/main/resources/application.properties b/patterns-modules/hexagonal-architecture/src/main/resources/application.properties deleted file mode 100644 index 8b13789179..0000000000 --- a/patterns-modules/hexagonal-architecture/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/patterns-modules/hexagonal-architecture/src/test/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeServiceImplUnitTest.java b/patterns-modules/hexagonal-architecture/src/test/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeServiceImplUnitTest.java deleted file mode 100644 index 542e45d6f4..0000000000 --- a/patterns-modules/hexagonal-architecture/src/test/java/com/baeldung/pattern/hexagonal/domain/services/EmployeeServiceImplUnitTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.baeldung.pattern.hexagonal.domain.services; - -import com.baeldung.pattern.hexagonal.domain.model.Employee; -import com.baeldung.pattern.hexagonal.persistence.EmployeeRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -class EmployeeServiceImplUnitTest { - - private EmployeeRepository employeeRepository; - private EmployeeService testService; - private Employee testModel; - - @BeforeEach - void setUp() { - employeeRepository = mock(EmployeeRepository.class); - - testService = new EmployeeServiceImpl(employeeRepository); - testModel = new Employee(); - testModel.setEmpId("2000"); - testModel.setEmpName("Test user 1"); - testModel.setEmpJobTitle("Software engineer"); - } - - @Test - void addEmployee() { - when(employeeRepository.add(any(Employee.class))).thenReturn(testModel); - - Employee testResponse = testService.addEmployee(testModel); - assertEquals(testModel, testResponse); - } - - @Test - void getEmployee() { - when(employeeRepository.findById("2000")).thenReturn(Optional.of(testModel)); - - Employee testResponse = testService.getEmployee("2000"); - assertEquals(testModel, testResponse); - } -} \ No newline at end of file diff --git a/patterns-modules/pom.xml b/patterns-modules/pom.xml index 0bd2b0453b..26d9a76aee 100644 --- a/patterns-modules/pom.xml +++ b/patterns-modules/pom.xml @@ -26,7 +26,6 @@ dip cqrs-es front-controller - hexagonal-architecture intercepting-filter solid clean-architecture From e99b6866f52ff5020bbb38fb9c2733871570fe85 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 25 Dec 2022 15:13:43 +0200 Subject: [PATCH 184/592] BAEL-71323 remove old module from pom --- pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pom.xml b/pom.xml index b57d3bf3fb..a5bdd2cf4c 100644 --- a/pom.xml +++ b/pom.xml @@ -411,7 +411,6 @@ javax-sound javaxval javaxval-2 - javaxval2 javax-validation-advanced jaxb jersey @@ -797,7 +796,6 @@ javax-sound javaxval javaxval-2 - javaxval2 javax-validation-advanced jaxb jersey From 2211a204c718b82fc07ac24c80eae1cca88226a6 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 27 Dec 2022 16:50:12 +0000 Subject: [PATCH 185/592] [JAVA-16856] (#13200) * [JAVA-16856] * [JAVA-16856] Reverted change Co-authored-by: panagiotiskakos --- logging-modules/flogger/pom.xml | 1 - logging-modules/log4j/pom.xml | 1 - logging-modules/log4j2/pom.xml | 1 - lombok-modules/lombok-2/pom.xml | 4 ---- microservices-modules/open-liberty/pom.xml | 1 - 5 files changed, 8 deletions(-) diff --git a/logging-modules/flogger/pom.xml b/logging-modules/flogger/pom.xml index c814d31767..05413a3952 100644 --- a/logging-modules/flogger/pom.xml +++ b/logging-modules/flogger/pom.xml @@ -61,7 +61,6 @@ 0.4 - 1.2.17 \ No newline at end of file diff --git a/logging-modules/log4j/pom.xml b/logging-modules/log4j/pom.xml index ac7c8620cd..fda2dd7157 100644 --- a/logging-modules/log4j/pom.xml +++ b/logging-modules/log4j/pom.xml @@ -45,7 +45,6 @@ - 1.2.17 2.17.1 2.17.1 3.3.6 diff --git a/logging-modules/log4j2/pom.xml b/logging-modules/log4j2/pom.xml index 7478bf5cdc..c3a3f4e0f9 100644 --- a/logging-modules/log4j2/pom.xml +++ b/logging-modules/log4j2/pom.xml @@ -113,7 +113,6 @@ 2.1.1 2.17.1 yyyyMMddHHmmss - 2.1.214 \ No newline at end of file diff --git a/lombok-modules/lombok-2/pom.xml b/lombok-modules/lombok-2/pom.xml index 23c907b4a1..0a7ad27ad6 100644 --- a/lombok-modules/lombok-2/pom.xml +++ b/lombok-modules/lombok-2/pom.xml @@ -27,8 +27,4 @@ - - 2.14.1 - - \ No newline at end of file diff --git a/microservices-modules/open-liberty/pom.xml b/microservices-modules/open-liberty/pom.xml index b914d4bc05..c4b0fd0b82 100644 --- a/microservices-modules/open-liberty/pom.xml +++ b/microservices-modules/open-liberty/pom.xml @@ -121,7 +121,6 @@ 9080 9443 7070 - 5.8.1 \ No newline at end of file From 3ab37c4d42fe5787e6a56925608f4ea832a4a3fb Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 28 Dec 2022 00:01:41 +0530 Subject: [PATCH 186/592] JAVA-16779 Removed kubernetes-spring from the kubernetes-modules (#13210) - Removed kubernete-spring from the parent pom of kubernetes-modules since it is a JDK11 module --- kubernetes-modules/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kubernetes-modules/pom.xml b/kubernetes-modules/pom.xml index 5b6510e58b..e120f89019 100644 --- a/kubernetes-modules/pom.xml +++ b/kubernetes-modules/pom.xml @@ -15,7 +15,7 @@ k8s-intro k8s-admission-controller - kubernetes-spring + \ No newline at end of file From 2850dd5de18fd3b937028a84ed8e288038b8873d Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 28 Dec 2022 00:27:48 +0530 Subject: [PATCH 187/592] Task/java 16779 (#13211) * JAVA-16779 Removed kubernetes-spring from the kubernetes-modules - Removed kubernete-spring from the parent pom of kubernetes-modules since it is a JDK11 module * JAVA-16779 Converted KinesisApplicationIntegrationTest to ManualTest - Converted KinesisApplicationIntegrationTest to ManualTest since it needs working AWS credentials to work - Added missing properties --- .../src/main/resources/application.properties | 3 ++- ....java => KinesisApplicationManualTest.java} | 11 +++++++---- .../src/test/resources/application.properties | 18 +++++++++++++++++- 3 files changed, 26 insertions(+), 6 deletions(-) rename spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/{KinesisApplicationIntegrationTest.java => KinesisApplicationManualTest.java} (53%) diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties index cc1f321453..1943766c26 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties @@ -14,4 +14,5 @@ spring.cloud.stream.bindings.output.destination=myStream spring.cloud.stream.bindings.output.content-type=text/plain ips.partition.key=ips-partition-key -ips.stream=ips-stream \ No newline at end of file +ips.stream=ips-stream +ips.shard.id=1 \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationIntegrationTest.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationManualTest.java similarity index 53% rename from spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationIntegrationTest.java rename to spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationManualTest.java index 4e1c281cfb..a232d29be5 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationIntegrationTest.java +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationManualTest.java @@ -5,11 +5,14 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +/** + * Manual Test - this test needs correct AWS Access Key and Secret to build the Amazon Kinesis and complete successfully + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = KinesisApplication.class) -public class KinesisApplicationIntegrationTest { - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { +public class KinesisApplicationManualTest { + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } + } } \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties index 48005616ec..1943766c26 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties @@ -1,2 +1,18 @@ +aws.access.key=my-aws-access-key-goes-here +aws.secret.key=my-aws-secret-key-goes-here + +cloud.aws.credentials.access-key=my-aws-access-key +cloud.aws.credentials.secret-key=my-aws-secret-key cloud.aws.region.static=eu-central-1 -cloud.aws.stack.auto=false \ No newline at end of file +cloud.aws.stack.auto=false + +spring.cloud.stream.bindings.input.destination=live-ips +spring.cloud.stream.bindings.input.group=live-ips-group +spring.cloud.stream.bindings.input.content-type=text/plain + +spring.cloud.stream.bindings.output.destination=myStream +spring.cloud.stream.bindings.output.content-type=text/plain + +ips.partition.key=ips-partition-key +ips.stream=ips-stream +ips.shard.id=1 \ No newline at end of file From d01629a2462fe1c8fa61063304741b4bfc0c61f3 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 27 Dec 2022 18:58:30 +0000 Subject: [PATCH 188/592] Java 16960 (#13201) * [JAVA-16960] * [JAVA-16960] Co-authored-by: panagiotiskakos --- .../core-java-collections-list-3/README.md | 1 + .../list}/listandset/ListAndSetUnitTest.java | 15 ++++++++++----- .../core-java-collections-list-4/README.md | 1 - 3 files changed, 11 insertions(+), 6 deletions(-) rename core-java-modules/{core-java-collections-4/src/test/java/com/baeldung => core-java-collections-list-3/src/test/java/com/baeldung/list}/listandset/ListAndSetUnitTest.java (86%) diff --git a/core-java-modules/core-java-collections-list-3/README.md b/core-java-modules/core-java-collections-list-3/README.md index bcc8b3f3ed..40ebaf7693 100644 --- a/core-java-modules/core-java-collections-list-3/README.md +++ b/core-java-modules/core-java-collections-list-3/README.md @@ -12,4 +12,5 @@ This module contains articles about the Java List collection - [How to Count Duplicate Elements in Arraylist](https://www.baeldung.com/java-count-duplicate-elements-arraylist) - [Finding the Differences Between Two Lists in Java](https://www.baeldung.com/java-lists-difference) - [List vs. ArrayList in Java](https://www.baeldung.com/java-list-vs-arraylist) +- [Set vs List in Java](https://www.baeldung.com/java-set-vs-list) - [[<-- Prev]](/core-java-modules/core-java-collections-list-2) diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/listandset/ListAndSetUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listandset/ListAndSetUnitTest.java similarity index 86% rename from core-java-modules/core-java-collections-4/src/test/java/com/baeldung/listandset/ListAndSetUnitTest.java rename to core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listandset/ListAndSetUnitTest.java index c57c1f96b8..43154c8e17 100644 --- a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/listandset/ListAndSetUnitTest.java +++ b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/listandset/ListAndSetUnitTest.java @@ -1,10 +1,15 @@ -package com.baeldung.listandset; +package com.baeldung.list.listandset; -import org.junit.Test; -import org.junit.Assert; -import java.util.*; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +import org.junit.Assert; +import org.junit.Test; public class ListAndSetUnitTest { diff --git a/core-java-modules/core-java-collections-list-4/README.md b/core-java-modules/core-java-collections-list-4/README.md index 9079c55cf8..e5f2e8c718 100644 --- a/core-java-modules/core-java-collections-list-4/README.md +++ b/core-java-modules/core-java-collections-list-4/README.md @@ -11,7 +11,6 @@ This module contains articles about the Java List collection - [Difference Between Arrays.asList() and List.of()](https://www.baeldung.com/java-arrays-aslist-vs-list-of) - [How to Store HashMap Inside a List](https://www.baeldung.com/java-hashmap-inside-list) - [Convert a List to a Comma-Separated String](https://www.baeldung.com/java-list-comma-separated-string) -- [Set vs List in Java](https://www.baeldung.com/java-set-vs-list) - [Inserting an Object in an ArrayList at a Specific Position](https://www.baeldung.com/java-insert-object-arraylist-specific-position) - [Iterate Through Two ArrayLists Simultaneously](https://www.baeldung.com/iterate-through-two-arraylists-simultaneously) - [[<-- Prev]](/core-java-modules/core-java-collections-list-3) From ab892ba982420c3fa6f303db8f4b3cbab444635e Mon Sep 17 00:00:00 2001 From: Shaun Phillips <61982125+ShaPhi7@users.noreply.github.com> Date: Wed, 28 Dec 2022 07:52:02 +0000 Subject: [PATCH 189/592] BAEL-4487 Add Crypto Exceptions (#13183) --- .../core-java-security-2/README.md | 2 +- .../com/baeldung/crypto/CryptoDriver.java | 5 +- .../crypto/exception/BadPaddingExamples.java | 66 +++++++++++++++++++ .../exception/IllegalBlockSizeExamples.java | 32 +++++++++ .../InvalidAlgorithmParameterExamples.java | 23 +++++++ .../crypto/exception/InvalidKeyExamples.java | 56 ++++++++++++++++ .../exception/NoSuchAlgorithmExamples.java | 29 ++++++++ .../baeldung/crypto/utils/CryptoUtils.java | 45 +++++++++++-- .../exception/BadPaddingExamplesUnitTest.java | 61 +++++++++++++++++ .../IllegalBlockSizeExamplesUnitTest.java | 56 ++++++++++++++++ ...lidAlgorithmParameterExamplesUnitTest.java | 59 +++++++++++++++++ .../exception/InvalidKeyExamplesUnitTest.java | 62 +++++++++++++++++ .../NoSuchAlgorithmExamplesUnitTest.java | 38 +++++++++++ 13 files changed, 525 insertions(+), 9 deletions(-) create mode 100644 core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/BadPaddingExamples.java create mode 100644 core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/IllegalBlockSizeExamples.java create mode 100644 core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/InvalidAlgorithmParameterExamples.java create mode 100644 core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/InvalidKeyExamples.java create mode 100644 core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/NoSuchAlgorithmExamples.java create mode 100644 core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/BadPaddingExamplesUnitTest.java create mode 100644 core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/IllegalBlockSizeExamplesUnitTest.java create mode 100644 core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/InvalidAlgorithmParameterExamplesUnitTest.java create mode 100644 core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/InvalidKeyExamplesUnitTest.java create mode 100644 core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/NoSuchAlgorithmExamplesUnitTest.java diff --git a/core-java-modules/core-java-security-2/README.md b/core-java-modules/core-java-security-2/README.md index 31404d24a5..7128c39713 100644 --- a/core-java-modules/core-java-security-2/README.md +++ b/core-java-modules/core-java-security-2/README.md @@ -13,4 +13,4 @@ This module contains articles about core Java Security - [Get a List of Trusted Certificates in Java](https://www.baeldung.com/java-list-trusted-certificates) - [Security Context Basics: User, Subject and Principal](https://www.baeldung.com/security-context-basics) - [The java.security.egd JVM Option](https://www.baeldung.com/java-security-egd) -- More articles: [[<-- prev]](/core-java-modules/core-java-security) +- More articles: [[<-- prev]](/core-java-modules/core-java-security) [[next -->]](/core-java-modules/core-java-security-3) diff --git a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/CryptoDriver.java b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/CryptoDriver.java index 552bd5d474..f0d2f62109 100644 --- a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/CryptoDriver.java +++ b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/CryptoDriver.java @@ -1,12 +1,11 @@ package com.baeldung.crypto; +import java.security.GeneralSecurityException; + import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.GCMParameterSpec; import javax.crypto.spec.IvParameterSpec; -import java.security.GeneralSecurityException; - -import com.baeldung.crypto.utils.CryptoUtils; public class CryptoDriver { diff --git a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/BadPaddingExamples.java b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/BadPaddingExamples.java new file mode 100644 index 0000000000..3fff4410e3 --- /dev/null +++ b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/BadPaddingExamples.java @@ -0,0 +1,66 @@ +package com.baeldung.crypto.exception; + +import java.security.GeneralSecurityException; +import java.security.InvalidKeyException; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; + +import com.baeldung.crypto.utils.CryptoUtils; + +public class BadPaddingExamples { + + public static byte[] encryptAndDecryptUsingDifferentKeys(byte[] plainTextBytes) + throws InvalidKeyException, GeneralSecurityException { + SecretKey encryptionKey = CryptoUtils.getKeyForText("BaeldungIsASuperCoolSite"); + SecretKey differentKey = CryptoUtils.getKeyForText("ThisGivesUsAnAlternative"); + + Cipher cipher = Cipher.getInstance("AES/ECB/ISO10126Padding"); + + cipher.init(Cipher.ENCRYPT_MODE, encryptionKey); + byte[] cipherTextBytes = cipher.doFinal(plainTextBytes); + + cipher.init(Cipher.DECRYPT_MODE, differentKey); + + return cipher.doFinal(cipherTextBytes); + } + + public static byte[] encryptAndDecryptUsingDifferentAlgorithms(SecretKey key, IvParameterSpec ivParameterSpec, + byte[] plainTextBytes) throws InvalidKeyException, GeneralSecurityException { + Cipher cipher = Cipher.getInstance("AES/CBC/ISO10126Padding"); + + cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec); + byte[] cipherTextBytes = cipher.doFinal(plainTextBytes); + + cipher = Cipher.getInstance("AES/ECB/ISO10126Padding"); + + cipher.init(Cipher.DECRYPT_MODE, key); + + return cipher.doFinal(cipherTextBytes); + } + + public static byte[] encryptAndDecryptUsingDifferentPaddings(SecretKey key, byte[] plainTextBytes) + throws InvalidKeyException, GeneralSecurityException { + Cipher cipher = Cipher.getInstance("AES/ECB/ISO10126Padding"); + cipher.init(Cipher.ENCRYPT_MODE, key); + byte[] cipherTextBytes = cipher.doFinal(plainTextBytes); + + cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, key); + + return cipher.doFinal(cipherTextBytes); + } + + public static byte[] encryptAndDecryptUsingSamePaddingKeyAndAlgorithm(SecretKey key, byte[] plainTextBytes) + throws InvalidKeyException, GeneralSecurityException { + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, key); + byte[] cipherTextBytes = cipher.doFinal(plainTextBytes); + + cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, key); + + return cipher.doFinal(cipherTextBytes); + } +} diff --git a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/IllegalBlockSizeExamples.java b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/IllegalBlockSizeExamples.java new file mode 100644 index 0000000000..ef6732ebb5 --- /dev/null +++ b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/IllegalBlockSizeExamples.java @@ -0,0 +1,32 @@ +package com.baeldung.crypto.exception; + +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.SecretKey; + +import com.baeldung.crypto.utils.CryptoUtils; + +public class IllegalBlockSizeExamples { + + public static byte[] encryptWithoutPadding(SecretKey key, byte[] plainTextBytes) throws NoSuchAlgorithmException, + NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException { + Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding"); + cipher.init(Cipher.ENCRYPT_MODE, key); + + return cipher.doFinal(plainTextBytes); + } + + public static byte[] decryptTextThatIsNotEncrypted(SecretKey key) throws NoSuchAlgorithmException, + NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException { + // note that this text is not encrypted at any point in this method. + String sampleText = "https://www.baeldung.com/"; + byte[] unencryptedCipherTextBytes = sampleText.getBytes(); + + return CryptoUtils.decryptWithPadding(key, unencryptedCipherTextBytes); + } +} diff --git a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/InvalidAlgorithmParameterExamples.java b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/InvalidAlgorithmParameterExamples.java new file mode 100644 index 0000000000..9a11a0e11e --- /dev/null +++ b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/InvalidAlgorithmParameterExamples.java @@ -0,0 +1,23 @@ +package com.baeldung.crypto.exception; + +import java.security.GeneralSecurityException; +import java.security.InvalidKeyException; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; + +public class InvalidAlgorithmParameterExamples { + + public static byte[] encryptUsingIv(SecretKey key, byte[] ivBytes, String plainText) + throws InvalidKeyException, GeneralSecurityException { + IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec); + + byte[] bytes = plainText.getBytes(); + + return cipher.doFinal(bytes); + } +} diff --git a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/InvalidKeyExamples.java b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/InvalidKeyExamples.java new file mode 100644 index 0000000000..d367f5bb24 --- /dev/null +++ b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/InvalidKeyExamples.java @@ -0,0 +1,56 @@ +package com.baeldung.crypto.exception; + +import java.security.GeneralSecurityException; +import java.security.InvalidKeyException; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; + +import com.baeldung.crypto.utils.CryptoUtils; + +public class InvalidKeyExamples { + + public static byte[] decryptUsingCBCWithNoIV(SecretKey key, byte[] cipherTextBytes) + throws InvalidKeyException, GeneralSecurityException { + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, key); + + return cipher.doFinal(cipherTextBytes); + } + + public static byte[] decryptUsingCBCWithIV(SecretKey key, byte[] cipherTextBytes) + throws InvalidKeyException, GeneralSecurityException { + byte[] ivBytes = new byte[] { 'B', 'a', 'e', 'l', 'd', 'u', 'n', 'g', 'I', 's', 'G', 'r', 'e', 'a', 't', '!' }; + IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec); + + return cipher.doFinal(cipherTextBytes); + } + + public static byte[] encryptWithKeyTooShort() throws InvalidKeyException, GeneralSecurityException { + SecretKey encryptionKey = CryptoUtils.getKeyForText("ThisIsTooShort"); + + String plainText = "https://www.baeldung.com/"; + byte[] bytes = plainText.getBytes(); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + + cipher.init(Cipher.ENCRYPT_MODE, encryptionKey); + return cipher.doFinal(bytes); + } + + public static byte[] encryptWithKeyTooLong() throws InvalidKeyException, GeneralSecurityException { + SecretKey encryptionKey = CryptoUtils.getKeyForText("ThisTextIsTooLong"); + + String plainText = "https://www.baeldung.com/"; + byte[] bytes = plainText.getBytes(); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + + cipher.init(Cipher.ENCRYPT_MODE, encryptionKey); + return cipher.doFinal(bytes); + } +} diff --git a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/NoSuchAlgorithmExamples.java b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/NoSuchAlgorithmExamples.java new file mode 100644 index 0000000000..b7bbd082e8 --- /dev/null +++ b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/NoSuchAlgorithmExamples.java @@ -0,0 +1,29 @@ +package com.baeldung.crypto.exception; + +import java.security.NoSuchAlgorithmException; + +import javax.crypto.Cipher; +import javax.crypto.NoSuchPaddingException; + +public class NoSuchAlgorithmExamples { + + public static Cipher getCipherInstanceWithBadAlgorithm() + throws NoSuchAlgorithmException, NoSuchPaddingException { + return Cipher.getInstance("ABC"); + } + + public static Cipher getCipherInstanceWithBadAlgorithmMode() + throws NoSuchAlgorithmException, NoSuchPaddingException { + return Cipher.getInstance("AES/ABC"); + } + + public static Cipher getCipherInstanceWithBadPadding() + throws NoSuchAlgorithmException, NoSuchPaddingException { + return Cipher.getInstance("AES/CBC/ABC"); + } + + public static Cipher getCipherInstanceWithValidAlgorithm() + throws NoSuchAlgorithmException, NoSuchPaddingException { + return Cipher.getInstance("AES/CBC/PKCS5Padding"); + } +} diff --git a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/utils/CryptoUtils.java b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/utils/CryptoUtils.java index 2d3df231ff..b48d3eec70 100644 --- a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/utils/CryptoUtils.java +++ b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/utils/CryptoUtils.java @@ -1,16 +1,21 @@ package com.baeldung.crypto.utils; +import java.nio.charset.StandardCharsets; import java.security.AlgorithmParameters; import java.security.GeneralSecurityException; +import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.spec.InvalidParameterSpecException; +import javax.crypto.BadPaddingException; import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; public class CryptoUtils { @@ -20,6 +25,21 @@ public class CryptoUtils { return keyGenerator.generateKey(); } + public static SecretKey getKeyForText(String secretText) throws GeneralSecurityException { + byte[] keyBytes = secretText.getBytes(StandardCharsets.UTF_8); + return new SecretKeySpec(keyBytes, "AES"); + } + + /* + * Allows us to generate a deterministic key, for the purposes of producing + * reliable and consistent demo code & tests! For a random key, consider using + * the generateKey method above. + */ + public static SecretKey getFixedKey() throws GeneralSecurityException { + String secretText = "BaeldungIsASuperCoolSite"; + return getKeyForText(secretText); + } + public static IvParameterSpec getIV() { SecureRandom secureRandom = new SecureRandom(); byte[] iv = new byte[128 / 8]; @@ -29,18 +49,17 @@ public class CryptoUtils { return new IvParameterSpec(nonce); } - public static IvParameterSpec getIVSecureRandom(String algorithm) throws NoSuchAlgorithmException, NoSuchPaddingException { + public static IvParameterSpec getIVSecureRandom(String algorithm) + throws NoSuchAlgorithmException, NoSuchPaddingException { SecureRandom random = SecureRandom.getInstanceStrong(); - byte[] iv = new byte[Cipher.getInstance(algorithm) - .getBlockSize()]; + byte[] iv = new byte[Cipher.getInstance(algorithm).getBlockSize()]; random.nextBytes(iv); return new IvParameterSpec(iv); } public static IvParameterSpec getIVInternal(Cipher cipher) throws InvalidParameterSpecException { AlgorithmParameters params = cipher.getParameters(); - byte[] iv = params.getParameterSpec(IvParameterSpec.class) - .getIV(); + byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV(); return new IvParameterSpec(iv); } @@ -50,4 +69,20 @@ public class CryptoUtils { return nonce; } + public static byte[] encryptWithPadding(SecretKey key, byte[] bytes) throws NoSuchAlgorithmException, + NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, key); + + byte[] cipherTextBytes = cipher.doFinal(bytes); + return cipherTextBytes; + } + + public static byte[] decryptWithPadding(SecretKey key, byte[] cipherTextBytes) throws NoSuchAlgorithmException, + NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, key); + + return cipher.doFinal(cipherTextBytes); + } } \ No newline at end of file diff --git a/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/BadPaddingExamplesUnitTest.java b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/BadPaddingExamplesUnitTest.java new file mode 100644 index 0000000000..f3f5c87b3a --- /dev/null +++ b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/BadPaddingExamplesUnitTest.java @@ -0,0 +1,61 @@ +package com.baeldung.crypto.exception; + +import java.security.GeneralSecurityException; + +import javax.crypto.BadPaddingException; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.crypto.utils.CryptoUtils; + +public class BadPaddingExamplesUnitTest { + + private SecretKey key; + private IvParameterSpec ivParameterSpec; + private String plainText; + private byte[] plainTextBytes; + + @Before + public void before() throws GeneralSecurityException { + key = CryptoUtils.getFixedKey(); + + byte[] ivBytes = new byte[] { 'B', 'a', 'e', 'l', 'd', 'u', 'n', 'g', 'I', 's', 'G', 'r', 'e', 'a', 't', '!' }; + ivParameterSpec = new IvParameterSpec(ivBytes); + + plainText = "https://www.baeldung.com/"; + plainTextBytes = plainText.getBytes(); + } + + @Test + public void givenTwoDifferentAlgorithmPaddings_whenDecrypting_thenBadPaddingExceptionIsThrown() + throws GeneralSecurityException { + Assert.assertThrows(BadPaddingException.class, + () -> BadPaddingExamples.encryptAndDecryptUsingDifferentPaddings(key, plainTextBytes)); + } + + @Test + public void givenTwoDifferentKeys_whenDecrypting_thenBadPaddingExceptionIsThrown() throws GeneralSecurityException { + Assert.assertThrows(BadPaddingException.class, + () -> BadPaddingExamples.encryptAndDecryptUsingDifferentKeys(plainTextBytes)); + } + + @Test + public void givenTwoDifferentAlgorithms_whenDecrypting_thenBadPaddingExceptionIsThrown() + throws GeneralSecurityException { + Assert.assertThrows(BadPaddingException.class, () -> BadPaddingExamples + .encryptAndDecryptUsingDifferentAlgorithms(key, ivParameterSpec, plainTextBytes)); + } + + @Test + public void givenSameVariablesUsedForEncryptingAndDecrypting_whenDecrypting_thenNoExceptionIsThrown() + throws GeneralSecurityException { + byte[] decryptedBytes = BadPaddingExamples.encryptAndDecryptUsingSamePaddingKeyAndAlgorithm(key, + plainTextBytes); + + Assert.assertEquals(plainText, new String(decryptedBytes)); + } +} diff --git a/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/IllegalBlockSizeExamplesUnitTest.java b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/IllegalBlockSizeExamplesUnitTest.java new file mode 100644 index 0000000000..6337b4da26 --- /dev/null +++ b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/IllegalBlockSizeExamplesUnitTest.java @@ -0,0 +1,56 @@ +package com.baeldung.crypto.exception; + +import java.security.GeneralSecurityException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.BadPaddingException; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.SecretKey; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.crypto.utils.CryptoUtils; + +public class IllegalBlockSizeExamplesUnitTest { + + private SecretKey key; + private byte[] plainTextBytes; + private String plainText; + + @Before + public void before() throws GeneralSecurityException { + key = CryptoUtils.getFixedKey(); + + plainText = "https://www.baeldung.com/"; + plainTextBytes = plainText.getBytes(); + } + + @Test + public void whenEncryptingPlainTextWithoutPadding_thenIllegalBlockSizeExceptionIsThrown() + throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, + BadPaddingException { + Assert.assertThrows(IllegalBlockSizeException.class, + () -> IllegalBlockSizeExamples.encryptWithoutPadding(key, plainTextBytes)); + } + + @Test + public void whenDecryptingCipherTextThatWasNotEncrypted_thenIllegalBlockSizeExceptionIsThrown() + throws GeneralSecurityException { + Assert.assertThrows(IllegalBlockSizeException.class, + () -> IllegalBlockSizeExamples.decryptTextThatIsNotEncrypted(key)); + } + + @Test + public void whenEncryptingAndDecryptingWithPadding_thenNoExceptionThrown() throws NoSuchAlgorithmException, + NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { + byte[] cipherTextBytes = CryptoUtils.encryptWithPadding(key, plainTextBytes); + + byte[] decryptedBytes = CryptoUtils.decryptWithPadding(key, cipherTextBytes); + + Assert.assertEquals(plainText, new String(decryptedBytes)); + } +} diff --git a/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/InvalidAlgorithmParameterExamplesUnitTest.java b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/InvalidAlgorithmParameterExamplesUnitTest.java new file mode 100644 index 0000000000..688f53e70b --- /dev/null +++ b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/InvalidAlgorithmParameterExamplesUnitTest.java @@ -0,0 +1,59 @@ +package com.baeldung.crypto.exception; + +import java.security.GeneralSecurityException; +import java.security.InvalidAlgorithmParameterException; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.crypto.utils.CryptoUtils; + +public class InvalidAlgorithmParameterExamplesUnitTest { + + private SecretKey key; + private String plainText; + + @Before + public void before() throws GeneralSecurityException { + key = CryptoUtils.getFixedKey(); + + plainText = "https://www.baeldung.com/"; + } + + @Test + public void givenIvIsTooShort_whenEncryptingUsingCBC_thenInvalidAlgorithmParameterExceptionIsThrown() + throws GeneralSecurityException { + byte[] ivBytes = new byte[] { 'B', 'a', 'e', 'l', 'd', 'u', 'n', 'g', 'I', 's', 'G', 'r', 'e', 'a', 't' }; + Assert.assertThrows(InvalidAlgorithmParameterException.class, + () -> InvalidAlgorithmParameterExamples.encryptUsingIv(key, ivBytes, plainText)); + } + + @Test + public void givenIvIsTooLong_whenEncryptingUsingCBC_thenInvalidAlgorithmParameterExceptionIsThrown() + throws GeneralSecurityException { + byte[] ivBytes = new byte[] { 'B', 'a', 'e', 'l', 'd', 'u', 'n', 'g', 'I', 's', 'G', 'r', 'e', 'a', 't', '!', + '?' }; + Assert.assertThrows(InvalidAlgorithmParameterException.class, + () -> InvalidAlgorithmParameterExamples.encryptUsingIv(key, ivBytes, plainText)); + } + + @Test + public void givenIvIsCorrectSize_whenEncryptingUsingCBC_thenNoExceptionIsThrown() throws GeneralSecurityException { + byte[] ivBytes = new byte[] { 'B', 'a', 'e', 'l', 'd', 'u', 'n', 'g', 'I', 's', 'G', 'r', 'e', 'a', 't', '!' }; + byte[] cipherTextBytes = InvalidAlgorithmParameterExamples.encryptUsingIv(key, ivBytes, plainText); + + IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec); + + byte[] decryptedBytes = cipher.doFinal(cipherTextBytes); + + Assert.assertEquals(plainText, new String(decryptedBytes)); + } +} diff --git a/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/InvalidKeyExamplesUnitTest.java b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/InvalidKeyExamplesUnitTest.java new file mode 100644 index 0000000000..bee7f70632 --- /dev/null +++ b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/InvalidKeyExamplesUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.crypto.exception; + +import java.security.GeneralSecurityException; +import java.security.InvalidKeyException; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.crypto.utils.CryptoUtils; + +public class InvalidKeyExamplesUnitTest { + + private SecretKey key; + private String plainText; + private byte[] cipherTextBytes; + + @Before + public void before() throws GeneralSecurityException { + key = CryptoUtils.getFixedKey(); + + byte[] ivBytes = new byte[] { 'B', 'a', 'e', 'l', 'd', 'u', 'n', 'g', 'I', 's', 'G', 'r', 'e', 'a', 't', '!' }; + IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec); + + plainText = "https://www.baeldung.com/"; + byte[] plainTextBytes = plainText.getBytes(); + + cipherTextBytes = cipher.doFinal(plainTextBytes); + } + + @Test + public void givenTextEncryptedWithCBC_whenDecryptingWithNoIv_thenInvalidKeyExceptionIsThrown() { + Assert.assertThrows(InvalidKeyException.class, + () -> InvalidKeyExamples.decryptUsingCBCWithNoIV(key, cipherTextBytes)); + } + + @Test + public void givenTextEncryptedWithCBC_whenDecryptingWithIv_thenTextIsDecrypted() + throws InvalidKeyException, GeneralSecurityException { + byte[] decryptedBytes = InvalidKeyExamples.decryptUsingCBCWithIV(key, cipherTextBytes); + + Assert.assertEquals(plainText, new String(decryptedBytes)); + } + + @Test + public void whenKeyIsTooShort_thenInvalidKeyExceptionIsThrown() { + Assert.assertThrows(InvalidKeyException.class, () -> InvalidKeyExamples.encryptWithKeyTooShort()); + } + + @Test + public void whenKeyIsTooLong_thenInvalidKeyExceptionIsThrown() { + Assert.assertThrows(InvalidKeyException.class, () -> InvalidKeyExamples.encryptWithKeyTooLong()); + } + +} diff --git a/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/NoSuchAlgorithmExamplesUnitTest.java b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/NoSuchAlgorithmExamplesUnitTest.java new file mode 100644 index 0000000000..b9622f6144 --- /dev/null +++ b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/exception/NoSuchAlgorithmExamplesUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.crypto.exception; + +import java.security.GeneralSecurityException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.Cipher; + +import org.junit.Assert; +import org.junit.Test; + +public class NoSuchAlgorithmExamplesUnitTest { + + @Test + public void whenInitingCipherWithUnknownAlgorithm_thenNoSuchAlgorithmExceptionIsThrown() + throws GeneralSecurityException { + Assert.assertThrows(NoSuchAlgorithmException.class, + () -> NoSuchAlgorithmExamples.getCipherInstanceWithBadAlgorithm()); + } + + @Test + public void whenInitingCipherWithUnknownAlgorithmMode_thenNoSuchAlgorithmExceptionIsThrown() + throws GeneralSecurityException { + Assert.assertThrows(NoSuchAlgorithmException.class, + () -> NoSuchAlgorithmExamples.getCipherInstanceWithBadAlgorithmMode()); + } + + @Test + public void whenInitingCipherWithUnknownPadding_thenNoSuchAlgorithmExceptionIsThrown() + throws GeneralSecurityException { + Assert.assertThrows(NoSuchAlgorithmException.class, + () -> NoSuchAlgorithmExamples.getCipherInstanceWithBadPadding()); + } + + @Test + public void whenInitingCipherWithValidAlgorithm_thenCipherInstanceIsReturned() throws GeneralSecurityException { + Assert.assertTrue(NoSuchAlgorithmExamples.getCipherInstanceWithValidAlgorithm() instanceof Cipher); + } +} From d170342033db73cb6ee453715f8af332fd3ab27b Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 28 Dec 2022 15:57:21 +0800 Subject: [PATCH 190/592] Update README.md [skip ci] --- jenkins-modules/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/jenkins-modules/README.md b/jenkins-modules/README.md index ba3e13cc95..5c0971321d 100644 --- a/jenkins-modules/README.md +++ b/jenkins-modules/README.md @@ -1,3 +1,6 @@ ## Jenkins This is an aggregator modules for Jenkins-related modules. + +## Relevant Articles +- [Trigger Another Job from a Jenkins Pipeline](https://www.baeldung.com/ops/jenkins-pipeline-trigger-new-job) From e9421687da8c4f48e7b8f188fb9acfdf50c5efd0 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 28 Dec 2022 17:39:20 +0800 Subject: [PATCH 191/592] Create README.md [skip ci] --- jenkins-modules/jenkins-jobs/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 jenkins-modules/jenkins-jobs/README.md diff --git a/jenkins-modules/jenkins-jobs/README.md b/jenkins-modules/jenkins-jobs/README.md new file mode 100644 index 0000000000..510aa60963 --- /dev/null +++ b/jenkins-modules/jenkins-jobs/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Trigger Another Job from a Jenkins Pipeline](https://www.baeldung.com/ops/jenkins-pipeline-trigger-new-job) From 16deccb5ba95de56e0b1557820e93420ffd04e3c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 28 Dec 2022 17:45:03 +0800 Subject: [PATCH 192/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-conversions-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-conversions-2/README.md b/core-java-modules/core-java-collections-conversions-2/README.md index 075f2b8736..742b52aad5 100644 --- a/core-java-modules/core-java-collections-conversions-2/README.md +++ b/core-java-modules/core-java-collections-conversions-2/README.md @@ -9,4 +9,5 @@ This module contains articles about conversions among Collection types and array - [Converting List to Map With a Custom Supplier](https://www.baeldung.com/list-to-map-supplier) - [Arrays.asList vs new ArrayList(Arrays.asList())](https://www.baeldung.com/java-arrays-aslist-vs-new-arraylist) - [Iterate Over a Set in Java](https://www.baeldung.com/java-iterate-set) +- [Convert a List of Integers to a List of Strings](https://www.baeldung.com/java-convert-list-integers-to-list-strings) - More articles: [[<-- prev]](../core-java-collections-conversions) From 40249f907cdcf0362b1a280155a53930fcb7f021 Mon Sep 17 00:00:00 2001 From: Ralf Ueberfuhr <40685729+ueberfuhr@users.noreply.github.com> Date: Wed, 28 Dec 2022 21:47:49 +0100 Subject: [PATCH 193/592] BAEL-5867: Micrometer Observability API with Spring Boot 3 (#13180) * BAEL-5867: Create project and create first usage main method * BAEL-5867: Use Observation API in Boot * BAEL-5867: Refactoring and testing * BAEL-5867: Add tracing * BAEL-5867: Remove notes and add project as a module to the aggregator * BAEL-5867: Fix pmd rules violation --- pom.xml | 2 + .../spring-boot-3-observation/pom.xml | 66 +++++++++++++++++++ .../baeldung/samples/GreetingApplication.java | 13 ++++ .../samples/SimpleObservationApplication.java | 66 +++++++++++++++++++ .../samples/boundary/GreetingController.java | 26 ++++++++ .../ObservationFilterConfiguration.java | 22 +++++++ .../config/ObservationHandlerLogger.java | 28 ++++++++ ...ObservationTextPublisherConfiguration.java | 21 ++++++ .../config/ObservedAspectConfiguration.java | 20 ++++++ .../samples/config/SimpleLoggingHandler.java | 59 +++++++++++++++++ .../samples/domain/GreetingService.java | 14 ++++ .../src/main/resources/application.yml | 6 ++ .../config/SimpleLoggingHandlerUnitTest.java | 17 +++++ .../samples/domain/EnableTestObservation.java | 44 +++++++++++++ ...tingServiceObservationIntegrationTest.java | 35 ++++++++++ ...GreetingServiceTracingIntegrationTest.java | 42 ++++++++++++ 16 files changed, 481 insertions(+) create mode 100644 spring-boot-modules/spring-boot-3-observation/pom.xml create mode 100644 spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/GreetingApplication.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/SimpleObservationApplication.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/boundary/GreetingController.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/boundary/ObservationFilterConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/config/ObservationHandlerLogger.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/config/ObservationTextPublisherConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/config/ObservedAspectConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/config/SimpleLoggingHandler.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/domain/GreetingService.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/main/resources/application.yml create mode 100644 spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/samples/config/SimpleLoggingHandlerUnitTest.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/samples/domain/EnableTestObservation.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/samples/domain/GreetingServiceObservationIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/samples/domain/GreetingServiceTracingIntegrationTest.java diff --git a/pom.xml b/pom.xml index a5bdd2cf4c..3d2863e1f2 100644 --- a/pom.xml +++ b/pom.xml @@ -1168,6 +1168,7 @@ spring-boot-modules/spring-boot-camel spring-boot-modules/spring-boot-3 spring-boot-modules/spring-boot-3-native + spring-boot-modules/spring-boot-3-observation spring-swagger-codegen/custom-validations-opeanpi-codegen testing-modules/testing-assertions persistence-modules/fauna @@ -1251,6 +1252,7 @@ spring-boot-modules/spring-boot-camel spring-boot-modules/spring-boot-3 spring-boot-modules/spring-boot-3-native + spring-boot-modules/spring-boot-3-observation spring-swagger-codegen/custom-validations-opeanpi-codegen testing-modules/testing-assertions persistence-modules/fauna diff --git a/spring-boot-modules/spring-boot-3-observation/pom.xml b/spring-boot-modules/spring-boot-3-observation/pom.xml new file mode 100644 index 0000000000..ed613ee98e --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/pom.xml @@ -0,0 +1,66 @@ + + + 4.0.0 + spring-boot-3-observation + 0.0.1-SNAPSHOT + spring-boot-3-observation + Demo project for Spring Boot 3 Observation + + + 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 + + + io.micrometer + micrometer-tracing + + + io.micrometer + micrometer-tracing-bridge-brave + + + + io.micrometer + micrometer-observation-test + test + + + io.micrometer + micrometer-tracing-test + test + + + + org.springframework.boot + spring-boot-starter-actuator + + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + + + diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/GreetingApplication.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/GreetingApplication.java new file mode 100644 index 0000000000..f5014a8abd --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/GreetingApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.samples; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class GreetingApplication { + + public static void main(String[] args) { + SpringApplication.run(GreetingApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/SimpleObservationApplication.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/SimpleObservationApplication.java new file mode 100644 index 0000000000..4434535939 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/SimpleObservationApplication.java @@ -0,0 +1,66 @@ +package com.baeldung.samples; + +import io.micrometer.core.instrument.Measurement; +import io.micrometer.core.instrument.Statistic; +import io.micrometer.core.instrument.observation.DefaultMeterObservationHandler; +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import io.micrometer.observation.Observation; +import io.micrometer.observation.ObservationRegistry; +import io.micrometer.observation.ObservationTextPublisher; + +import java.util.Optional; +import java.util.stream.StreamSupport; + +public class SimpleObservationApplication { + + // we can run this as a simple command line application + public static void main(String[] args) { + // create registry + final var observationRegistry = ObservationRegistry.create(); + // create meter registry and observation handler + final var meterRegistry = new SimpleMeterRegistry(); + final var meterObservationHandler = new DefaultMeterObservationHandler(meterRegistry); + // create simple logging observation handler + final var loggingObservationHandler = new ObservationTextPublisher(System.out::println); + // register observation handlers + observationRegistry + .observationConfig() + .observationHandler(meterObservationHandler) + .observationHandler(loggingObservationHandler); + // make an observation + Observation.Context context = new Observation.Context(); + String observationName = "obs1"; + Observation observation = Observation + .createNotStarted(observationName, () -> context, observationRegistry) + .lowCardinalityKeyValue("gender", "male") + .highCardinalityKeyValue("age", "41"); + + for (int i = 0; i < 10; i++) { + observation.observe(SimpleObservationApplication::doSomeAction); + } + + meterRegistry.getMeters().forEach(m -> { + System.out.println(m.getId() + "\n============"); + m.measure().forEach(ms -> System.out.println(ms.getValue() + " [" + ms.getStatistic() + "]")); + System.out.println("----------------------------"); + }); + Optional maximumDuration = meterRegistry.getMeters().stream() + .filter(m -> "obs1".equals(m.getId().getName())) + .flatMap(m -> StreamSupport.stream(m.measure().spliterator(), false)) + .filter(ms -> ms.getStatistic() == Statistic.MAX) + .findFirst() + .map(Measurement::getValue); + + System.out.println(maximumDuration); + } + + private static void doSomeAction() { + try { + Thread.sleep(Math.round(Math.random() * 1000)); + System.out.println("Hello World!"); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/boundary/GreetingController.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/boundary/GreetingController.java new file mode 100644 index 0000000000..bc179540f8 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/boundary/GreetingController.java @@ -0,0 +1,26 @@ +package com.baeldung.samples.boundary; + +import com.baeldung.samples.domain.GreetingService; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +@RequestMapping("/greet") +public class GreetingController { + + private final GreetingService service; + + public GreetingController(GreetingService service) { + this.service = service; + } + + @GetMapping(produces = MediaType.TEXT_PLAIN_VALUE) + @ResponseBody + public String sayHello() { + return this.service.sayHello(); + } + +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/boundary/ObservationFilterConfiguration.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/boundary/ObservationFilterConfiguration.java new file mode 100644 index 0000000000..c39af961a1 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/boundary/ObservationFilterConfiguration.java @@ -0,0 +1,22 @@ +package com.baeldung.samples.boundary; + +import io.micrometer.observation.ObservationRegistry; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.filter.ServerHttpObservationFilter; + +@Configuration +public class ObservationFilterConfiguration { + + // if an ObservationRegistry is already configured + @ConditionalOnBean(ObservationRegistry.class) + // if we do not use Actuator + @ConditionalOnMissingBean(ServerHttpObservationFilter.class) + @Bean + public ServerHttpObservationFilter observationFilter(ObservationRegistry registry) { + return new ServerHttpObservationFilter(registry); + } + +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/config/ObservationHandlerLogger.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/config/ObservationHandlerLogger.java new file mode 100644 index 0000000000..0a1f52f9c1 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/config/ObservationHandlerLogger.java @@ -0,0 +1,28 @@ +package com.baeldung.samples.config; + +import io.micrometer.observation.ObservationHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +@Component +public class ObservationHandlerLogger { + + private static final Logger log = LoggerFactory.getLogger(ObservationHandlerLogger.class); + + private static String toString(ObservationHandler handler) { + return handler.getClass().getName() + " [ " + handler + "]"; + } + + @EventListener(ContextRefreshedEvent.class) + public void logObservationHandlers(ContextRefreshedEvent evt) { + evt.getApplicationContext().getBeansOfType(ObservationHandler.class) + .values() + .stream() + .map(ObservationHandlerLogger::toString) + .forEach(log::info); + } + +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/config/ObservationTextPublisherConfiguration.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/config/ObservationTextPublisherConfiguration.java new file mode 100644 index 0000000000..29637166c9 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/config/ObservationTextPublisherConfiguration.java @@ -0,0 +1,21 @@ +package com.baeldung.samples.config; + +import io.micrometer.observation.Observation; +import io.micrometer.observation.ObservationHandler; +import io.micrometer.observation.ObservationTextPublisher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ObservationTextPublisherConfiguration { + + private static final Logger log = LoggerFactory.getLogger(ObservationTextPublisherConfiguration.class); + + @Bean + public ObservationHandler observationTextPublisher() { + return new ObservationTextPublisher(log::info); + } + +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/config/ObservedAspectConfiguration.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/config/ObservedAspectConfiguration.java new file mode 100644 index 0000000000..cd475113c7 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/config/ObservedAspectConfiguration.java @@ -0,0 +1,20 @@ +package com.baeldung.samples.config; + +import io.micrometer.observation.ObservationRegistry; +import io.micrometer.observation.aop.ObservedAspect; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; + +@AutoConfiguration +@ConditionalOnClass(ObservedAspect.class) +public class ObservedAspectConfiguration { + + @Bean + @ConditionalOnMissingBean + public ObservedAspect observedAspect(ObservationRegistry observationRegistry) { + return new ObservedAspect(observationRegistry); + } + +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/config/SimpleLoggingHandler.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/config/SimpleLoggingHandler.java new file mode 100644 index 0000000000..c87aa68085 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/config/SimpleLoggingHandler.java @@ -0,0 +1,59 @@ +package com.baeldung.samples.config; + +import io.micrometer.observation.Observation; +import io.micrometer.observation.ObservationHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class SimpleLoggingHandler implements ObservationHandler { + + private static final Logger log = LoggerFactory.getLogger(SimpleLoggingHandler.class); + + private static String toString(Observation.Context context) { + return null == context ? "(no context)" : context.getName() + + " (" + context.getClass().getName() + "@" + System.identityHashCode(context) + ")"; + } + + private static String toString(Observation.Event event) { + return null == event ? "(no event)" : event.getName(); + } + + @Override + public boolean supportsContext(Observation.Context context) { + return true; + } + + @Override + public void onStart(Observation.Context context) { + log.info("Starting context " + toString(context)); + } + + @Override + public void onError(Observation.Context context) { + log.info("Error for context " + toString(context)); + } + + @Override + public void onEvent(Observation.Event event, Observation.Context context) { + log.info("Event for context " + toString(context) + " [" + toString(event) + "]"); + } + + @Override + public void onScopeOpened(Observation.Context context) { + log.info("Scope opened for context " + toString(context)); + + } + + @Override + public void onScopeClosed(Observation.Context context) { + log.info("Scope closed for context " + toString(context)); + } + + @Override + public void onStop(Observation.Context context) { + log.info("Stopping context " + toString(context)); + } + +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/domain/GreetingService.java b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/domain/GreetingService.java new file mode 100644 index 0000000000..ec362dd3cc --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/java/com/baeldung/samples/domain/GreetingService.java @@ -0,0 +1,14 @@ +package com.baeldung.samples.domain; + +import io.micrometer.observation.annotation.Observed; +import org.springframework.stereotype.Service; + +@Observed(name = "greetingService") +@Service +public class GreetingService { + + public String sayHello() { + return "Hello World!"; + } + +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/main/resources/application.yml b/spring-boot-modules/spring-boot-3-observation/src/main/resources/application.yml new file mode 100644 index 0000000000..9f91e8a03a --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/main/resources/application.yml @@ -0,0 +1,6 @@ +management: + endpoints: + web: + exposure: + include: '*' + #health,info,beans,metrics,startup diff --git a/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/samples/config/SimpleLoggingHandlerUnitTest.java b/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/samples/config/SimpleLoggingHandlerUnitTest.java new file mode 100644 index 0000000000..5a6d1bd23f --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/samples/config/SimpleLoggingHandlerUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.samples.config; + +import io.micrometer.observation.Observation; +import io.micrometer.observation.ObservationHandler; +import io.micrometer.observation.tck.AnyContextObservationHandlerCompatibilityKit; + +class SimpleLoggingHandlerUnitTest + extends AnyContextObservationHandlerCompatibilityKit { + + SimpleLoggingHandler handler = new SimpleLoggingHandler(); + + @Override + public ObservationHandler handler() { + return handler; + } + +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/samples/domain/EnableTestObservation.java b/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/samples/domain/EnableTestObservation.java new file mode 100644 index 0000000000..8e4e2a1da0 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/samples/domain/EnableTestObservation.java @@ -0,0 +1,44 @@ +package com.baeldung.samples.domain; + +import com.baeldung.samples.config.ObservedAspectConfiguration; +import io.micrometer.observation.tck.TestObservationRegistry; +import io.micrometer.tracing.test.simple.SimpleTracer; +import org.springframework.boot.test.autoconfigure.actuate.observability.AutoConfigureObservability; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Documented +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@AutoConfigureObservability +@Import({ + ObservedAspectConfiguration.class, + EnableTestObservation.ObservationTestConfiguration.class +}) +public @interface EnableTestObservation { + + @TestConfiguration + class ObservationTestConfiguration { + + @Bean + TestObservationRegistry observationRegistry() { + return TestObservationRegistry.create(); + } + + @Bean + SimpleTracer simpleTracer() { + return new SimpleTracer(); + } + + } + +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/samples/domain/GreetingServiceObservationIntegrationTest.java b/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/samples/domain/GreetingServiceObservationIntegrationTest.java new file mode 100644 index 0000000000..98fa175660 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/samples/domain/GreetingServiceObservationIntegrationTest.java @@ -0,0 +1,35 @@ +package com.baeldung.samples.domain; + +import io.micrometer.observation.tck.TestObservationRegistry; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static io.micrometer.observation.tck.TestObservationRegistryAssert.assertThat; + +@ExtendWith(SpringExtension.class) +@ComponentScan(basePackageClasses = GreetingService.class) +@EnableAutoConfiguration +@EnableTestObservation +class GreetingServiceObservationIntegrationTest { + + @Autowired + GreetingService service; + @Autowired + TestObservationRegistry registry; + + @Test + void testObservation() { + // invoke service + service.sayHello(); + assertThat(registry) + .hasObservationWithNameEqualTo("greetingService") + .that() + .hasBeenStarted() + .hasBeenStopped(); + } + +} diff --git a/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/samples/domain/GreetingServiceTracingIntegrationTest.java b/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/samples/domain/GreetingServiceTracingIntegrationTest.java new file mode 100644 index 0000000000..0199c0e7ef --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/src/test/java/com/baeldung/samples/domain/GreetingServiceTracingIntegrationTest.java @@ -0,0 +1,42 @@ +package com.baeldung.samples.domain; + +import io.micrometer.tracing.test.simple.SimpleTracer; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static io.micrometer.tracing.test.simple.TracerAssert.assertThat; + +@ExtendWith(SpringExtension.class) +@ComponentScan(basePackageClasses = GreetingService.class) +@EnableAutoConfiguration +@EnableTestObservation +class GreetingServiceTracingIntegrationTest { + + @Autowired + GreetingService service; + @Value("${management.tracing.enabled:true}") + boolean tracingEnabled; + @Autowired + SimpleTracer tracer; + + @Test + void testEnabledTracing() { + Assertions.assertThat(tracingEnabled).isTrue(); + } + + @Test + void testTracingForGreeting() { + service.sayHello(); + assertThat(tracer) + .onlySpan() + .hasNameEqualTo("greeting-service#say-hello") + .isEnded(); + } + +} From 987e733edd5b326eb0f1db1fcbfb2f876c9d00fb Mon Sep 17 00:00:00 2001 From: Brandon Ward Date: Wed, 28 Dec 2022 20:21:53 -0700 Subject: [PATCH 194/592] Move rate limiting examples --- spring-cloud-modules/pom.xml | 1 + .../spring-cloud-gateway-2/README.md | 7 + .../spring-cloud-gateway-2/pom.xml | 124 ++++++++++++++++++ .../springcloudgateway/GatewayApplication | 14 ++ .../ipaddress/IpAddressApplication.java | 0 .../ProxiedClientAddressResolver.java | 0 .../SimpleClientAddressResolver.java | 0 .../ipaddress-application.properties | 0 .../spring-cloud-gateway/README.md | 1 - 9 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 spring-cloud-modules/spring-cloud-gateway-2/README.md create mode 100644 spring-cloud-modules/spring-cloud-gateway-2/pom.xml create mode 100644 spring-cloud-modules/spring-cloud-gateway-2/src/main/java/com/baeldung/springcloudgateway/GatewayApplication rename spring-cloud-modules/{spring-cloud-gateway => spring-cloud-gateway-2}/src/main/java/com/baeldung/springcloudgateway/ipaddress/IpAddressApplication.java (100%) rename spring-cloud-modules/{spring-cloud-gateway => spring-cloud-gateway-2}/src/main/java/com/baeldung/springcloudgateway/ipaddress/ProxiedClientAddressResolver.java (100%) rename spring-cloud-modules/{spring-cloud-gateway => spring-cloud-gateway-2}/src/main/java/com/baeldung/springcloudgateway/ipaddress/SimpleClientAddressResolver.java (100%) rename spring-cloud-modules/{spring-cloud-gateway => spring-cloud-gateway-2}/src/main/resources/ipaddress-application.properties (100%) diff --git a/spring-cloud-modules/pom.xml b/spring-cloud-modules/pom.xml index 7a4eec679e..68aa4cd2e5 100644 --- a/spring-cloud-modules/pom.xml +++ b/spring-cloud-modules/pom.xml @@ -25,6 +25,7 @@ spring-cloud-ribbon-client spring-cloud-zookeeper spring-cloud-gateway + spring-cloud-gateway-2 spring-cloud-stream spring-cloud-stream-starters spring-cloud-connectors-heroku diff --git a/spring-cloud-modules/spring-cloud-gateway-2/README.md b/spring-cloud-modules/spring-cloud-gateway-2/README.md new file mode 100644 index 0000000000..578bfc623e --- /dev/null +++ b/spring-cloud-modules/spring-cloud-gateway-2/README.md @@ -0,0 +1,7 @@ +## Spring Cloud Gateway 2 + +This module contains additional articles about Spring Cloud Gateway. + +### Relevant Articles: + +- [Rate Limiting With Client IP in Spring Cloud Gateway](https://www.baeldung.com/spring-cloud-gateway-rate-limit-by-client-ip) diff --git a/spring-cloud-modules/spring-cloud-gateway-2/pom.xml b/spring-cloud-modules/spring-cloud-gateway-2/pom.xml new file mode 100644 index 0000000000..22182e8c78 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-gateway-2/pom.xml @@ -0,0 +1,124 @@ + + + 4.0.0 + spring-cloud-gateway-2 + spring-cloud-gateway-2 + jar + + + com.baeldung.spring.cloud + spring-cloud-modules + 1.0.0-SNAPSHOT + + + + + + org.junit + junit-bom + ${junit-jupiter.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud-dependencies.version} + pom + import + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + + + org.springframework.cloud + spring-cloud-starter-gateway + + + + org.springframework.boot + spring-boot-starter-data-redis-reactive + + + + it.ozimov + embedded-redis + ${redis.version} + test + + + org.hibernate + hibernate-validator-cdi + ${hibernate-validator.version} + + + javax.validation + validation-api + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-devtools + + + + org.springframework.boot + spring-boot-starter-oauth2-resource-server + + + org.springframework.boot + spring-boot-starter-oauth2-client + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + + 6.0.2.Final + 0.7.2 + 9.19 + + + \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-gateway-2/src/main/java/com/baeldung/springcloudgateway/GatewayApplication b/spring-cloud-modules/spring-cloud-gateway-2/src/main/java/com/baeldung/springcloudgateway/GatewayApplication new file mode 100644 index 0000000000..53b2629dd0 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-gateway-2/src/main/java/com/baeldung/springcloudgateway/GatewayApplication @@ -0,0 +1,14 @@ +package com.baeldung.springcloudgateway; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.PropertySource; + +@SpringBootApplication +public class GatewayApplication { + + public static void main(String[] args) { + SpringApplication.run(GatewayApplication.class, args); + } + +} \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/IpAddressApplication.java b/spring-cloud-modules/spring-cloud-gateway-2/src/main/java/com/baeldung/springcloudgateway/ipaddress/IpAddressApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/IpAddressApplication.java rename to spring-cloud-modules/spring-cloud-gateway-2/src/main/java/com/baeldung/springcloudgateway/ipaddress/IpAddressApplication.java diff --git a/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/ProxiedClientAddressResolver.java b/spring-cloud-modules/spring-cloud-gateway-2/src/main/java/com/baeldung/springcloudgateway/ipaddress/ProxiedClientAddressResolver.java similarity index 100% rename from spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/ProxiedClientAddressResolver.java rename to spring-cloud-modules/spring-cloud-gateway-2/src/main/java/com/baeldung/springcloudgateway/ipaddress/ProxiedClientAddressResolver.java diff --git a/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/SimpleClientAddressResolver.java b/spring-cloud-modules/spring-cloud-gateway-2/src/main/java/com/baeldung/springcloudgateway/ipaddress/SimpleClientAddressResolver.java similarity index 100% rename from spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/ipaddress/SimpleClientAddressResolver.java rename to spring-cloud-modules/spring-cloud-gateway-2/src/main/java/com/baeldung/springcloudgateway/ipaddress/SimpleClientAddressResolver.java diff --git a/spring-cloud-modules/spring-cloud-gateway/src/main/resources/ipaddress-application.properties b/spring-cloud-modules/spring-cloud-gateway-2/src/main/resources/ipaddress-application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-gateway/src/main/resources/ipaddress-application.properties rename to spring-cloud-modules/spring-cloud-gateway-2/src/main/resources/ipaddress-application.properties diff --git a/spring-cloud-modules/spring-cloud-gateway/README.md b/spring-cloud-modules/spring-cloud-gateway/README.md index 3d6d70f8a2..80315040c9 100644 --- a/spring-cloud-modules/spring-cloud-gateway/README.md +++ b/spring-cloud-modules/spring-cloud-gateway/README.md @@ -11,4 +11,3 @@ This module contains articles about Spring Cloud Gateway - [Using Spring Cloud Gateway with OAuth 2.0 Patterns](https://www.baeldung.com/spring-cloud-gateway-oauth2) - [URL Rewriting With Spring Cloud Gateway](https://www.baeldung.com/spring-cloud-gateway-url-rewriting) - [Processing the Response Body in Spring Cloud Gateway](https://www.baeldung.com/spring-cloud-gateway-response-body) -- [Rate Limiting With Client IP in Spring Cloud Gateway](https://www.baeldung.com/spring-cloud-gateway-rate-limit-by-client-ip) From 6579553e8db31bde6befbef75d6672ef6379013c Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Fri, 30 Dec 2022 11:13:44 +0000 Subject: [PATCH 195/592] BAEL-6036: Enable caching on the TasksService for Lightrun Article (#13221) --- lightrun/tasks-service/pom.xml | 4 ++++ .../tasksservice/SimpleCacheCustomizer.java | 16 ++++++++++++++++ .../tasksservice/TasksServiceApplication.java | 2 ++ .../tasksservice/service/TasksService.java | 2 ++ 4 files changed, 24 insertions(+) create mode 100644 lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/SimpleCacheCustomizer.java diff --git a/lightrun/tasks-service/pom.xml b/lightrun/tasks-service/pom.xml index 2b3b37e51b..c3542b0089 100644 --- a/lightrun/tasks-service/pom.xml +++ b/lightrun/tasks-service/pom.xml @@ -24,6 +24,10 @@ org.springframework.boot spring-boot-starter-artemis + + org.springframework.boot + spring-boot-starter-cache + org.springframework.boot spring-boot-starter-data-jpa diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/SimpleCacheCustomizer.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/SimpleCacheCustomizer.java new file mode 100644 index 0000000000..bf8bb6ad6e --- /dev/null +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/SimpleCacheCustomizer.java @@ -0,0 +1,16 @@ +package com.baeldung.tasksservice; + +import java.util.List; + +import org.springframework.boot.autoconfigure.cache.CacheManagerCustomizer; +import org.springframework.cache.concurrent.ConcurrentMapCacheManager; +import org.springframework.stereotype.Component; + +@Component +public class SimpleCacheCustomizer implements CacheManagerCustomizer { + + @Override + public void customize(ConcurrentMapCacheManager cacheManager) { + cacheManager.setCacheNames(List.of("tasks")); + } +} \ No newline at end of file diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java index dfd9859674..84a8ed7967 100644 --- a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java @@ -2,8 +2,10 @@ package com.baeldung.tasksservice; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; @SpringBootApplication +@EnableCaching public class TasksServiceApplication { public static void main(String[] args) { diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/TasksService.java b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/TasksService.java index 3539dbbc3c..107bf56bb9 100644 --- a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/TasksService.java +++ b/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/TasksService.java @@ -19,6 +19,7 @@ import java.util.UUID; import javax.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import com.baeldung.tasksservice.adapters.repository.TaskRecord; @@ -29,6 +30,7 @@ public class TasksService { @Autowired private TasksRepository tasksRepository; + @Cacheable("tasks") public TaskRecord getTaskById(String id) { return tasksRepository.findById(id) .orElseThrow(() -> new UnknownTaskException(id)); From a26acf8a0c48297bd9891712cb64c9c4ec18430c Mon Sep 17 00:00:00 2001 From: Kilian Schneider <48420258+Basler182@users.noreply.github.com> Date: Fri, 30 Dec 2022 19:03:21 +0100 Subject: [PATCH 196/592] BAEL-6055 NonUniqueResultException in Spring Data JPA (#13173) * BAEL-6055 NonUniqueResultException in Spring Data JPA * update using AssertJ Exception * Update persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/nonuniqueresultexception/NonUniqueResultExceptionIntegrationTest.java Co-authored-by: KevinGilmore * Update persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/nonuniqueresultexception/NonUniqueResultExceptionIntegrationTest.java Co-authored-by: KevinGilmore Co-authored-by: KevinGilmore --- .../jpa/query/datetime/ArticleRepository.java | 3 ++ ...nUniqueResultExceptionIntegrationTest.java | 35 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/nonuniqueresultexception/NonUniqueResultExceptionIntegrationTest.java diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/datetime/ArticleRepository.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/datetime/ArticleRepository.java index 9ec14884f4..726764b411 100644 --- a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/datetime/ArticleRepository.java +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/query/datetime/ArticleRepository.java @@ -14,6 +14,9 @@ public interface ArticleRepository extends JpaRepository { List
findAllByPublicationTimeBetween(Date publicationTimeStart, Date publicationTimeEnd); + Article findByPublicationTimeBetween(Date publicationTimeStart, + Date publicationTimeEnd); + @Query("select a from Article a where a.creationDateTime <= :creationDateTime") List
findAllWithCreationDateTimeBefore( @Param("creationDateTime") Date creationDateTime); diff --git a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/nonuniqueresultexception/NonUniqueResultExceptionIntegrationTest.java b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/nonuniqueresultexception/NonUniqueResultExceptionIntegrationTest.java new file mode 100644 index 0000000000..b032819ad6 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/nonuniqueresultexception/NonUniqueResultExceptionIntegrationTest.java @@ -0,0 +1,35 @@ +package com.baeldung.spring.data.jpa.query.nonuniqueresultexception; + +import com.baeldung.spring.data.jpa.query.datetime.ArticleRepository; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.dao.IncorrectResultSizeDataAccessException; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.persistence.NonUniqueResultException; +import java.text.ParseException; +import java.text.SimpleDateFormat; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +@RunWith(SpringRunner.class) +@DataJpaTest(properties = "spring.sql.init.data-locations=classpath:import_entities.sql", showSql = false) +public class NonUniqueResultExceptionIntegrationTest { + + @Autowired + private ArticleRepository repository; + + @Test + public void givenImportedArticles_whenFindByPublicationTimeBetween_thenIncorrectResultSizeDataAccessExceptionThrown() { + assertThatThrownBy(() -> repository.findByPublicationTimeBetween(new SimpleDateFormat("HH:mm").parse("15:15"), new SimpleDateFormat("HH:mm").parse("16:30"))) + .isInstanceOf(IncorrectResultSizeDataAccessException.class) + .hasCauseInstanceOf(NonUniqueResultException.class); + } + + @Test + public void givenImportedArticles_whenFindAllByPublicationTimeBetween_thenSuccess() throws ParseException { + repository.findAllByPublicationTimeBetween(new SimpleDateFormat("HH:mm").parse("15:15"), new SimpleDateFormat("HH:mm").parse("16:30")); + } +} From b4ad1e9f2d9f609f9b748fb72f4c4cc167b04237 Mon Sep 17 00:00:00 2001 From: h_sharifi Date: Mon, 2 Jan 2023 13:33:43 +0330 Subject: [PATCH 197/592] #BAEL-2862: remove SecurityAutoConfiguration class and extra annotation --- .../java/com/baeldung/web/log/app/Application.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/Application.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/Application.java index 40f5341e29..24174815fa 100644 --- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/Application.java +++ b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/Application.java @@ -1,19 +1,18 @@ package com.baeldung.web.log.app; -import javax.servlet.ServletRegistration; - import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.PropertySource; -import com.baeldung.web.log.config.CustomeRequestLoggingFilter; - -@EnableAutoConfiguration @ComponentScan("com.baeldung.web.log") @PropertySource("application-log.properties") -@SpringBootApplication +@SpringBootApplication(exclude = { + SecurityAutoConfiguration.class, + ManagementWebSecurityAutoConfiguration.class +}) public class Application { public static void main(final String[] args) { From d251343e2e2d1995c6e4f8fa18b62a1aeaaa348c Mon Sep 17 00:00:00 2001 From: h_sharifi Date: Mon, 2 Jan 2023 14:10:57 +0330 Subject: [PATCH 198/592] #BAEL-2862: add log level for CommonsRequestLoggingFilter --- .../spring-boot-runtime/src/main/resources/logback.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spring-boot-modules/spring-boot-runtime/src/main/resources/logback.xml b/spring-boot-modules/spring-boot-runtime/src/main/resources/logback.xml index 7d900d8ea8..4552282d23 100644 --- a/spring-boot-modules/spring-boot-runtime/src/main/resources/logback.xml +++ b/spring-boot-modules/spring-boot-runtime/src/main/resources/logback.xml @@ -7,6 +7,10 @@ + + + + From 9b206922fd24e4d04bd911fa8ac1583e5c7062ee Mon Sep 17 00:00:00 2001 From: h_sharifi Date: Mon, 2 Jan 2023 14:11:40 +0330 Subject: [PATCH 199/592] #BAEL-2862: remove interceptor --- .../log/app/TaxiFareRequestInterceptor.java | 44 ------------------- .../web/log/config/TaxiFareMVCConfig.java | 19 -------- 2 files changed, 63 deletions(-) delete mode 100644 spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/TaxiFareRequestInterceptor.java delete mode 100644 spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/TaxiFareMVCConfig.java diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/TaxiFareRequestInterceptor.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/TaxiFareRequestInterceptor.java deleted file mode 100644 index 2ea0204dc3..0000000000 --- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/TaxiFareRequestInterceptor.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung.web.log.app; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; -import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; -import org.springframework.web.util.ContentCachingRequestWrapper; - -import com.baeldung.web.log.util.RequestLoggingUtil; - -@Component -public class TaxiFareRequestInterceptor extends HandlerInterceptorAdapter { - - private final static Logger LOGGER = LoggerFactory.getLogger(TaxiFareRequestInterceptor.class); - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - String postData; - HttpServletRequest requestCacheWrapperObject = null; - try { - // Uncomment to produce the stream closed issue - // postData = RequestLoggingUtil.getStringFromInputStream(request.getInputStream()); - - // To overcome request stream closed issue - requestCacheWrapperObject = new ContentCachingRequestWrapper(request); - requestCacheWrapperObject.getParameterMap(); - } catch (Exception exception) { - exception.printStackTrace(); - } finally { - postData = RequestLoggingUtil.readPayload(requestCacheWrapperObject); - LOGGER.info("REQUEST DATA: " + postData); - } - return true; - } - - @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { - LOGGER.info("RESPONSE: " + response.getStatus()); - } - -} diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/TaxiFareMVCConfig.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/TaxiFareMVCConfig.java deleted file mode 100644 index fda8a845e9..0000000000 --- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/TaxiFareMVCConfig.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.web.log.config; - -import com.baeldung.web.log.app.TaxiFareRequestInterceptor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -public class TaxiFareMVCConfig implements WebMvcConfigurer { - - @Autowired - private TaxiFareRequestInterceptor taxiFareRequestInterceptor; - - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(taxiFareRequestInterceptor).addPathPatterns("/taxifare/*/"); - } -} From 32763ab63d9169ecfae4ba7540aa94d435f8ef40 Mon Sep 17 00:00:00 2001 From: h_sharifi Date: Mon, 2 Jan 2023 14:12:00 +0330 Subject: [PATCH 200/592] #BAEL-2862: update test case --- .../TaxiFareControllerIntegrationTest.java | 30 ++++--------------- 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/spring-boot-modules/spring-boot-runtime/src/test/java/com/baeldung/web/controller/TaxiFareControllerIntegrationTest.java b/spring-boot-modules/spring-boot-runtime/src/test/java/com/baeldung/web/controller/TaxiFareControllerIntegrationTest.java index 97d669d3fa..b98c77ad2b 100644 --- a/spring-boot-modules/spring-boot-runtime/src/test/java/com/baeldung/web/controller/TaxiFareControllerIntegrationTest.java +++ b/spring-boot-modules/spring-boot-runtime/src/test/java/com/baeldung/web/controller/TaxiFareControllerIntegrationTest.java @@ -1,23 +1,19 @@ package com.baeldung.web.controller; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; - +import com.baeldung.web.log.app.Application; +import com.baeldung.web.log.data.TaxiRide; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.context.annotation.Configuration; -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.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import com.baeldung.web.log.app.Application; -import com.baeldung.web.log.data.TaxiRide; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; @RunWith(SpringRunner.class) -@SpringBootTest(classes = { Application.class, TaxiFareControllerIntegrationTest.SecurityConfig.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@SpringBootTest(classes = { Application.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class TaxiFareControllerIntegrationTest { @LocalServerPort @@ -25,8 +21,6 @@ public class TaxiFareControllerIntegrationTest { @Test public void givenRequest_whenFetchTaxiFareRateCard_thanOK() { - - System.out.println(port); String URL = "http://localhost:" + port + "/spring-rest"; TestRestTemplate testRestTemplate = new TestRestTemplate(); TaxiRide taxiRide = new TaxiRide(true, 10l); @@ -37,16 +31,4 @@ public class TaxiFareControllerIntegrationTest { assertThat(fare, equalTo("200")); } - @Configuration - static class SecurityConfig extends WebSecurityConfigurerAdapter { - @Override - protected void configure(HttpSecurity http) throws Exception { - System.out.println("security being set"); - http - .authorizeRequests() - .anyRequest().permitAll() - .and() - .csrf().disable(); - } - } } \ No newline at end of file From c22c1a9cab7c5ea222246258e78744404b9afa34 Mon Sep 17 00:00:00 2001 From: h_sharifi Date: Mon, 2 Jan 2023 14:12:36 +0330 Subject: [PATCH 201/592] #BAEL-2862: remove Spring related class --- .../log/config/CustomWebAppInitializer.java | 27 ------------------- .../config/CustomeRequestLoggingFilter.java | 12 --------- 2 files changed, 39 deletions(-) delete mode 100644 spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/CustomWebAppInitializer.java delete mode 100644 spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/CustomeRequestLoggingFilter.java diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/CustomWebAppInitializer.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/CustomWebAppInitializer.java deleted file mode 100644 index 0f19c6dc48..0000000000 --- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/CustomWebAppInitializer.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.web.log.config; - -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRegistration; - -import org.springframework.web.context.ContextLoaderListener; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; -import org.springframework.web.WebApplicationInitializer; - -public class CustomWebAppInitializer implements WebApplicationInitializer { - - @Override - public void onStartup(ServletContext container) throws ServletException { - - AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); - context.setConfigLocation("com.baeldung.web.log"); - container.addListener(new ContextLoaderListener(context)); - - ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(context)); - dispatcher.setLoadOnStartup(1); - dispatcher.addMapping("/"); - - container.addFilter("customRequestLoggingFilter", CustomeRequestLoggingFilter.class).addMappingForServletNames(null, false, "dispatcher"); - } -} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/CustomeRequestLoggingFilter.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/CustomeRequestLoggingFilter.java deleted file mode 100644 index 3accb0a06e..0000000000 --- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/CustomeRequestLoggingFilter.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.web.log.config; - -import org.springframework.web.filter.CommonsRequestLoggingFilter; - -public class CustomeRequestLoggingFilter extends CommonsRequestLoggingFilter { - - public CustomeRequestLoggingFilter() { - super.setIncludeQueryString(true); - super.setIncludePayload(true); - super.setMaxPayloadLength(10000); - } -} From f23e73e5d31852a4a0c45997e0749e51e3915139 Mon Sep 17 00:00:00 2001 From: h_sharifi Date: Mon, 2 Jan 2023 14:12:57 +0330 Subject: [PATCH 202/592] #BAEL-2862: remove extra space --- .../com/baeldung/web/log/config/RequestLoggingFilterConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/RequestLoggingFilterConfig.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/RequestLoggingFilterConfig.java index 85728729d5..a0622d45d2 100644 --- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/RequestLoggingFilterConfig.java +++ b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/RequestLoggingFilterConfig.java @@ -14,7 +14,7 @@ public class RequestLoggingFilterConfig { filter.setIncludePayload(true); filter.setMaxPayloadLength(10000); filter.setIncludeHeaders(false); - filter.setAfterMessagePrefix("REQUEST DATA : "); + filter.setAfterMessagePrefix("REQUEST DATA: "); return filter; } } From e188b24dbbeb90c636ea657f29a61ed5f4e50946 Mon Sep 17 00:00:00 2001 From: h_sharifi Date: Mon, 2 Jan 2023 14:13:11 +0330 Subject: [PATCH 203/592] #BAEL-2862: remove unused class --- .../web/log/util/RequestLoggingUtil.java | 38 ------------------- 1 file changed, 38 deletions(-) delete mode 100644 spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/util/RequestLoggingUtil.java diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/util/RequestLoggingUtil.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/util/RequestLoggingUtil.java deleted file mode 100644 index 70c4eaee90..0000000000 --- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/util/RequestLoggingUtil.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.web.log.util; - -import java.io.IOException; -import java.io.InputStream; -import java.io.StringWriter; - -import javax.servlet.http.HttpServletRequest; - -import org.apache.commons.io.IOUtils; -import org.springframework.web.util.ContentCachingRequestWrapper; -import org.springframework.web.util.WebUtils; - -public class RequestLoggingUtil { - - public static String getStringFromInputStream(InputStream is) { - StringWriter writer = new StringWriter(); - String encoding = "UTF-8"; - try { - IOUtils.copy(is, writer, encoding); - } catch (IOException e) { - e.printStackTrace(); - } - return writer.toString(); - } - - public static String readPayload(final HttpServletRequest request) throws IOException { - String payloadData = null; - ContentCachingRequestWrapper contentCachingRequestWrapper = WebUtils.getNativeRequest(request, ContentCachingRequestWrapper.class); - if (null != contentCachingRequestWrapper) { - byte[] buf = contentCachingRequestWrapper.getContentAsByteArray(); - if (buf.length > 0) { - payloadData = new String(buf, 0, buf.length, contentCachingRequestWrapper.getCharacterEncoding()); - } - } - return payloadData; - } - -} From 311f190327f9402ed9d061d9df295b1d2bf6652a Mon Sep 17 00:00:00 2001 From: h_sharifi Date: Mon, 2 Jan 2023 14:13:48 +0330 Subject: [PATCH 204/592] #BAEL-2862: add request wrapper & filter --- .../web/log/app/CachedHttpServletRequest.java | 30 +++++++++++++ .../web/log/app/CachedServletInputStream.java | 45 +++++++++++++++++++ .../web/log/app/RequestCachingFilter.java | 33 ++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/CachedHttpServletRequest.java create mode 100644 spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/CachedServletInputStream.java create mode 100644 spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/RequestCachingFilter.java diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/CachedHttpServletRequest.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/CachedHttpServletRequest.java new file mode 100644 index 0000000000..51bbd51ea8 --- /dev/null +++ b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/CachedHttpServletRequest.java @@ -0,0 +1,30 @@ +package com.baeldung.web.log.app; + +import org.springframework.util.StreamUtils; + +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.*; + +public class CachedHttpServletRequest extends HttpServletRequestWrapper { + + private byte[] cachedPayload; + + public CachedHttpServletRequest(HttpServletRequest request) throws IOException { + super(request); + InputStream requestInputStream = request.getInputStream(); + this.cachedPayload = StreamUtils.copyToByteArray(requestInputStream); + } + + @Override + public ServletInputStream getInputStream() { + return new CachedServletInputStream(this.cachedPayload); + } + + @Override + public BufferedReader getReader() { + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(this.cachedPayload); + return new BufferedReader(new InputStreamReader(byteArrayInputStream)); + } +} diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/CachedServletInputStream.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/CachedServletInputStream.java new file mode 100644 index 0000000000..673d04876b --- /dev/null +++ b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/CachedServletInputStream.java @@ -0,0 +1,45 @@ +package com.baeldung.web.log.app; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +public class CachedServletInputStream extends ServletInputStream { + + private final static Logger LOGGER = LoggerFactory.getLogger(CachedServletInputStream.class); + private InputStream cachedInputStream; + + public CachedServletInputStream(byte[] cachedBody) { + this.cachedInputStream = new ByteArrayInputStream(cachedBody); + } + + @Override + public boolean isFinished() { + try { + return cachedInputStream.available() == 0; + } catch (IOException exp) { + LOGGER.error(exp.getMessage()); + } + return false; + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setReadListener(ReadListener readListener) { + throw new UnsupportedOperationException(); + } + + @Override + public int read() throws IOException { + return cachedInputStream.read(); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/RequestCachingFilter.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/RequestCachingFilter.java new file mode 100644 index 0000000000..e0928550fc --- /dev/null +++ b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/app/RequestCachingFilter.java @@ -0,0 +1,33 @@ +package com.baeldung.web.log.app; + +import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +@Order(value = Ordered.HIGHEST_PRECEDENCE) +@Component +@WebFilter(filterName = "RequestCachingFilter", urlPatterns = "/*") +public class RequestCachingFilter extends OncePerRequestFilter { + + private final static Logger LOGGER = LoggerFactory.getLogger(RequestCachingFilter.class); + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, + FilterChain filterChain) throws ServletException, IOException { + CachedHttpServletRequest cachedHttpServletRequest = new CachedHttpServletRequest(request); + LOGGER.info("REQUEST DATA: " + IOUtils.toString(cachedHttpServletRequest.getInputStream(), StandardCharsets.UTF_8)); + filterChain.doFilter(cachedHttpServletRequest, response); + } +} \ No newline at end of file From 1c8006a1df1355ce384b6bca5f0eb80a67c80e34 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Mon, 2 Jan 2023 21:22:06 +0530 Subject: [PATCH 205/592] JAVA-16722 Upgrade and Fix unit tests of jersey module (#13193) --- jersey/pom.xml | 7 ++++++- .../com/baeldung/jersey/client/JerseyClientHeaders.java | 5 ++++- .../com/baeldung/jersey/server/EchoHeadersUnitTest.java | 3 --- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/jersey/pom.xml b/jersey/pom.xml index c8a7de66ae..7c7330d84f 100644 --- a/jersey/pom.xml +++ b/jersey/pom.xml @@ -72,6 +72,11 @@ ${jersey.version} test + + org.glassfish.jersey.connectors + jersey-apache-connector + ${jersey.version} + @@ -95,7 +100,7 @@ - 2.26 + 2.38 \ No newline at end of file diff --git a/jersey/src/main/java/com/baeldung/jersey/client/JerseyClientHeaders.java b/jersey/src/main/java/com/baeldung/jersey/client/JerseyClientHeaders.java index ebcbe1d4ab..29db298e9e 100644 --- a/jersey/src/main/java/com/baeldung/jersey/client/JerseyClientHeaders.java +++ b/jersey/src/main/java/com/baeldung/jersey/client/JerseyClientHeaders.java @@ -1,6 +1,8 @@ package com.baeldung.jersey.client; import com.baeldung.jersey.client.filter.AddHeaderOnRequestFilter; +import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; +import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; import org.glassfish.jersey.client.oauth1.AccessToken; import org.glassfish.jersey.client.oauth1.ConsumerCredentials; @@ -155,7 +157,8 @@ public class JerseyClientHeaders { } public static Response sendRestrictedHeaderThroughDefaultTransportConnector(String headerKey, String headerValue) { - Client client = ClientBuilder.newClient(); + ClientConfig clientConfig = new ClientConfig().connectorProvider(new ApacheConnectorProvider()); + Client client = ClientBuilder.newClient(clientConfig); System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); return client.target(TARGET) diff --git a/jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersUnitTest.java b/jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersUnitTest.java index cca7446dd1..24552f6d81 100644 --- a/jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersUnitTest.java +++ b/jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersUnitTest.java @@ -2,10 +2,8 @@ package com.baeldung.jersey.server; import com.baeldung.jersey.client.JerseyClientHeaders; import com.baeldung.jersey.client.filter.AddHeaderOnRequestFilter; -import org.glassfish.jersey.media.sse.SseFeature; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.test.JerseyTest; -import org.junit.Ignore; import org.junit.Test; import javax.ws.rs.core.Application; @@ -17,7 +15,6 @@ import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -@Ignore public class EchoHeadersUnitTest extends JerseyTest { private static final String SIMPLE_HEADER_KEY = "my-header-key"; From 4c153707aa7837fe8b2dd4a80594db6c0862d341 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Mon, 2 Jan 2023 23:40:25 +0530 Subject: [PATCH 206/592] Java 16013 Add suffix legacy to spring-cloud-bootstrap module (#13218) * JAVA-16013 Add suffix legacy spring-cloud-bootstrap to module * JAVA-16013 Revert local change done to run test --- spring-cloud-modules/pom.xml | 2 +- .../README.md | 0 .../application-config/book-service.properties | 0 .../application-config/discovery.properties | 0 .../application-config/gateway.properties | 0 .../application-config/rating-service.properties | 0 .../application-config/zipkin.properties | 0 .../config/pom.xml | 0 .../cloud/bootstrap/config/ConfigApplication.java | 0 .../cloud/bootstrap/config/SecurityConfig.java | 0 .../src/main/resources/application.properties | 0 .../config/src/main/resources/logback.xml | 0 .../test/java/com/baeldung/SpringContextTest.java | 0 .../customer-service/pom.xml | 0 .../java/com/baeldung/customerservice/Customer.java | 0 .../customerservice/CustomerApplication.java | 0 .../baeldung/customerservice/CustomerService.java | 0 .../src/main/resources/application.properties | 0 .../src/test/resources/application.properties | 0 .../discovery/pom.xml | 0 .../bootstrap/discovery/DiscoveryApplication.java | 0 .../cloud/bootstrap/discovery/SecurityConfig.java | 0 .../cloud/bootstrap/discovery/SessionConfig.java | 0 .../src/main/resources/bootstrap.properties | 0 .../discovery/src/main/resources/logback.xml | 0 .../java/com/baeldung/SpringContextLiveTest.java | 0 .../gateway/pom.xml | 0 .../gateway/src/main/angular/ui/.angular-cli.json | 0 .../gateway/src/main/angular/ui/.editorconfig | 0 .../gateway/src/main/angular/ui/.gitignore | 0 .../gateway/src/main/angular/ui/README.md | 0 .../gateway/src/main/angular/ui/e2e/app.e2e-spec.ts | 0 .../gateway/src/main/angular/ui/e2e/app.po.ts | 0 .../src/main/angular/ui/e2e/tsconfig.e2e.json | 0 .../gateway/src/main/angular/ui/karma.conf.js | 0 .../gateway/src/main/angular/ui/package.json | 0 .../gateway/src/main/angular/ui/protractor.conf.js | 0 .../src/main/angular/ui/src/app/app.component.css | 0 .../src/main/angular/ui/src/app/app.component.html | 0 .../src/main/angular/ui/src/app/app.component.ts | 0 .../src/main/angular/ui/src/app/app.module.ts | 0 .../gateway/src/main/angular/ui/src/app/book.ts | 0 .../app/book/book-detail/book-detail.component.css | 0 .../app/book/book-detail/book-detail.component.html | 0 .../app/book/book-detail/book-detail.component.ts | 0 .../src/app/book/book-list/book-list.component.css | 0 .../src/app/book/book-list/book-list.component.html | 0 .../src/app/book/book-list/book-list.component.ts | 0 .../ui/src/app/click-stop-propagation.directive.ts | 0 .../src/main/angular/ui/src/app/http.service.ts | 0 .../src/main/angular/ui/src/app/principal.ts | 0 .../gateway/src/main/angular/ui/src/app/rating.ts | 0 .../angular/ui/src/app/rating/rating.component.css | 0 .../angular/ui/src/app/rating/rating.component.html | 0 .../angular/ui/src/app/rating/rating.component.ts | 0 .../gateway/src/main/angular/ui/src/assets/.gitkeep | 0 .../angular/ui/src/environments/environment.prod.ts | 0 .../main/angular/ui/src/environments/environment.ts | 0 .../gateway/src/main/angular/ui/src/favicon.ico | Bin .../gateway/src/main/angular/ui/src/index.html | 0 .../gateway/src/main/angular/ui/src/main.ts | 0 .../gateway/src/main/angular/ui/src/polyfills.ts | 0 .../gateway/src/main/angular/ui/src/styles.css | 0 .../gateway/src/main/angular/ui/src/test.ts | 0 .../src/main/angular/ui/src/tsconfig.app.json | 0 .../src/main/angular/ui/src/tsconfig.spec.json | 0 .../gateway/src/main/angular/ui/src/typings.d.ts | 0 .../gateway/src/main/angular/ui/tsconfig.json | 0 .../gateway/src/main/angular/ui/tslint.json | 0 .../bootstrap/gateway/AuthenticationController.java | 0 .../cloud/bootstrap/gateway/ErrorPageConfig.java | 0 .../cloud/bootstrap/gateway/GatewayApplication.java | 0 .../cloud/bootstrap/gateway/SecurityConfig.java | 0 .../cloud/bootstrap/gateway/SessionConfig.java | 0 .../cloud/bootstrap/gateway/client/book/Book.java | 0 .../bootstrap/gateway/client/book/BooksClient.java | 0 .../bootstrap/gateway/client/rating/Rating.java | 0 .../gateway/client/rating/RatingsClient.java | 0 .../gateway/controller/CombinedController.java | 0 .../gateway/filter/SessionSavingZuulPreFilter.java | 0 .../gateway/src/main/resources/bootstrap.properties | 0 .../gateway/src/main/resources/logback.xml | 0 .../src/main/resources/static/eureka/css/wro.css | 0 .../static/eureka/fonts/montserrat-webfont.eot | Bin .../static/eureka/fonts/montserrat-webfont.svg | 0 .../static/eureka/fonts/montserrat-webfont.ttf | Bin .../static/eureka/fonts/montserrat-webfont.woff | Bin .../static/eureka/fonts/varela_round-webfont.eot | Bin .../static/eureka/fonts/varela_round-webfont.svg | 0 .../static/eureka/fonts/varela_round-webfont.ttf | Bin .../static/eureka/fonts/varela_round-webfont.woff | Bin .../resources/static/eureka/images/404-icon.png | Bin .../resources/static/eureka/images/homepage-bg.jpg | Bin .../resources/static/eureka/images/platform-bg.png | Bin .../static/eureka/images/platform-spring-xd.png | Bin .../eureka/images/spring-logo-eureka-mobile.png | Bin .../static/eureka/images/spring-logo-eureka.png | Bin .../src/main/resources/static/eureka/js/wro.js | 0 .../src/main/resources/static/home/favicon.ico | Bin .../src/main/resources/static/home/index.html | 0 .../src/main/resources/static/home/inline.bundle.js | 0 .../main/resources/static/home/inline.bundle.js.map | 0 .../src/main/resources/static/home/main.bundle.js | 0 .../main/resources/static/home/main.bundle.js.map | 0 .../main/resources/static/home/polyfills.bundle.js | 0 .../resources/static/home/polyfills.bundle.js.map | 0 .../src/main/resources/static/home/styles.bundle.js | 0 .../main/resources/static/home/styles.bundle.js.map | 0 .../gateway/src/main/resources/static/index.html | 0 .../java/com/baeldung/SpringContextLiveTest.java | 0 .../spring/cloud/bootstrap/gateway/LiveTest.java | 0 .../bootstrap/gateway/SpringContextLiveTest.java | 0 .../gateway/src/test/resources/bootstrap.properties | 0 .../order-service/order-client/pom.xml | 0 .../baeldung/orderservice/client/OrderClient.java | 0 .../orderservice/client/OrderClientImpl.java | 0 .../com/baeldung/orderservice/client/OrderDTO.java | 0 .../baeldung/orderservice/client/OrderResponse.java | 0 .../src/main/resources/application.properties | 0 .../order-service/order-server/pom.xml | 0 .../main/java/com/baeldung/orderservice/Order.java | 0 .../com/baeldung/orderservice/OrderApplication.java | 0 .../com/baeldung/orderservice/OrderService.java | 0 .../src/main/resources/application.properties | 0 .../order-service/pom.xml | 0 .../pom.xml | 4 ++-- .../svc-book/pom.xml | 0 .../bootstrap/svcbook/BookServiceApplication.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 .../svc-book/src/main/resources/logback.xml | 0 .../java/com/baeldung/SpringContextLiveTest.java | 0 .../src/test/resources/bootstrap.properties | 0 .../svc-rating/pom.xml | 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 .../svc-rating/src/main/resources/logback.xml | 0 .../java/com/baeldung/SpringContextLiveTest.java | 0 .../src/test/resources/bootstrap.properties | 0 .../zipkin/pom.xml | 0 .../cloud/bootstrap/zipkin/ZipkinApplication.java | 0 .../zipkin/src/main/resources/bootstrap.properties | 0 .../zipkin/src/main/resources/logback.xml | 0 .../test/java/com/baeldung/SpringContextTest.java | 0 160 files changed, 3 insertions(+), 3 deletions(-) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/README.md (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/application-config/book-service.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/application-config/discovery.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/application-config/gateway.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/application-config/rating-service.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/application-config/zipkin.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/config/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/ConfigApplication.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/SecurityConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/config/src/main/resources/application.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/config/src/main/resources/logback.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/config/src/test/java/com/baeldung/SpringContextTest.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/customer-service/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/customer-service/src/main/java/com/baeldung/customerservice/Customer.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/customer-service/src/main/java/com/baeldung/customerservice/CustomerApplication.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/customer-service/src/main/java/com/baeldung/customerservice/CustomerService.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/customer-service/src/main/resources/application.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/customer-service/src/test/resources/application.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/discovery/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/DiscoveryApplication.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SecurityConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SessionConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/discovery/src/main/resources/bootstrap.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/discovery/src/main/resources/logback.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/discovery/src/test/java/com/baeldung/SpringContextLiveTest.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/.angular-cli.json (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/.editorconfig (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/.gitignore (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/README.md (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/e2e/app.e2e-spec.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/e2e/app.po.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/e2e/tsconfig.e2e.json (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/karma.conf.js (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/package.json (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/protractor.conf.js (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/app.component.css (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/app.component.html (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/app.component.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/app.module.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/book.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.css (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.html (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.css (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.html (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/click-stop-propagation.directive.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/http.service.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/principal.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/rating.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/rating/rating.component.css (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/rating/rating.component.html (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/app/rating/rating.component.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/assets/.gitkeep (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/environments/environment.prod.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/environments/environment.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/favicon.ico (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/index.html (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/main.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/polyfills.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/styles.css (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/test.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/tsconfig.app.json (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/tsconfig.spec.json (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/src/typings.d.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/tsconfig.json (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/angular/ui/tslint.json (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/AuthenticationController.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/ErrorPageConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SessionConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/Book.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/BooksClient.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/Rating.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/RatingsClient.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/controller/CombinedController.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/filter/SessionSavingZuulPreFilter.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/bootstrap.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/logback.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/eureka/css/wro.css (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.eot (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.svg (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.ttf (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.woff (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.eot (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.svg (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.ttf (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.woff (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/eureka/images/404-icon.png (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/eureka/images/homepage-bg.jpg (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/eureka/images/platform-bg.png (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/eureka/images/platform-spring-xd.png (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/eureka/images/spring-logo-eureka-mobile.png (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/eureka/images/spring-logo-eureka.png (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/eureka/js/wro.js (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/home/favicon.ico (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/home/index.html (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/home/inline.bundle.js (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/home/inline.bundle.js.map (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/home/main.bundle.js (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/home/main.bundle.js.map (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/home/polyfills.bundle.js (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/home/polyfills.bundle.js.map (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/home/styles.bundle.js (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/home/styles.bundle.js.map (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/main/resources/static/index.html (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/test/java/com/baeldung/SpringContextLiveTest.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/LiveTest.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/gateway/src/test/resources/bootstrap.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/order-service/order-client/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClient.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClientImpl.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderDTO.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderResponse.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/order-service/order-client/src/main/resources/application.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/order-service/order-server/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/order-service/order-server/src/main/java/com/baeldung/orderservice/Order.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderApplication.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderService.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/order-service/order-server/src/main/resources/application.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/order-service/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/pom.xml (88%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-book/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/DataLoader.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SessionConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookNotFoundException.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookRepository.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-book/src/main/resources/bootstrap.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-book/src/main/resources/logback.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-book/src/test/java/com/baeldung/SpringContextLiveTest.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-book/src/test/resources/bootstrap.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-rating/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/DataLoader.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingCacheRepository.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingNotFoundException.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingRepository.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-rating/src/main/resources/bootstrap.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-rating/src/main/resources/logback.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-rating/src/test/java/com/baeldung/SpringContextLiveTest.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/svc-rating/src/test/resources/bootstrap.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/zipkin/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/zipkin/src/main/java/com/baeldung/spring/cloud/bootstrap/zipkin/ZipkinApplication.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/zipkin/src/main/resources/bootstrap.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/zipkin/src/main/resources/logback.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap => spring-cloud-bootstrap-legacy}/zipkin/src/test/java/com/baeldung/SpringContextTest.java (100%) diff --git a/spring-cloud-modules/pom.xml b/spring-cloud-modules/pom.xml index 7a4eec679e..2f5410b308 100644 --- a/spring-cloud-modules/pom.xml +++ b/spring-cloud-modules/pom.xml @@ -21,7 +21,7 @@ spring-cloud-config spring-cloud-eureka spring-cloud-hystrix - spring-cloud-bootstrap + spring-cloud-bootstrap-legacy spring-cloud-ribbon-client spring-cloud-zookeeper spring-cloud-gateway diff --git a/spring-cloud-modules/spring-cloud-bootstrap/README.md b/spring-cloud-modules/spring-cloud-bootstrap-legacy/README.md similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/README.md rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/README.md diff --git a/spring-cloud-modules/spring-cloud-bootstrap/application-config/book-service.properties b/spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/book-service.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/application-config/book-service.properties rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/book-service.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/application-config/discovery.properties b/spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/discovery.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/application-config/discovery.properties rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/discovery.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/application-config/gateway.properties b/spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/gateway.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/application-config/gateway.properties rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/gateway.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/application-config/rating-service.properties b/spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/rating-service.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/application-config/rating-service.properties rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/rating-service.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/application-config/zipkin.properties b/spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/zipkin.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/application-config/zipkin.properties rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/zipkin.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/config/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap-legacy/config/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/config/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/config/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/ConfigApplication.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/ConfigApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/ConfigApplication.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/ConfigApplication.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/SecurityConfig.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/SecurityConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/SecurityConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/SecurityConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/config/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/main/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/config/src/main/resources/application.properties rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/main/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/config/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/config/src/main/resources/logback.xml rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/main/resources/logback.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap/config/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/config/src/test/java/com/baeldung/SpringContextTest.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/customer-service/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/customer-service/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/main/java/com/baeldung/customerservice/Customer.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/main/java/com/baeldung/customerservice/Customer.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/main/java/com/baeldung/customerservice/Customer.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/main/java/com/baeldung/customerservice/Customer.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/main/java/com/baeldung/customerservice/CustomerApplication.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/main/java/com/baeldung/customerservice/CustomerApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/main/java/com/baeldung/customerservice/CustomerApplication.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/main/java/com/baeldung/customerservice/CustomerApplication.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/main/java/com/baeldung/customerservice/CustomerService.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/main/java/com/baeldung/customerservice/CustomerService.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/main/java/com/baeldung/customerservice/CustomerService.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/main/java/com/baeldung/customerservice/CustomerService.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/main/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/main/resources/application.properties rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/main/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/test/resources/application.properties b/spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/test/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/test/resources/application.properties rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/test/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/discovery/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/discovery/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/DiscoveryApplication.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/DiscoveryApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/DiscoveryApplication.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/DiscoveryApplication.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SecurityConfig.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SecurityConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SecurityConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SecurityConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SessionConfig.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SessionConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SessionConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SessionConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/resources/bootstrap.properties b/spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/resources/bootstrap.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/resources/bootstrap.properties rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/resources/logback.xml rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/resources/logback.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap/discovery/src/test/java/com/baeldung/SpringContextLiveTest.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/test/java/com/baeldung/SpringContextLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/discovery/src/test/java/com/baeldung/SpringContextLiveTest.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/test/java/com/baeldung/SpringContextLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/.angular-cli.json b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/.angular-cli.json similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/.angular-cli.json rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/.angular-cli.json diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/.editorconfig b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/.editorconfig similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/.editorconfig rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/.editorconfig diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/.gitignore b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/.gitignore similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/.gitignore rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/.gitignore diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/README.md b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/README.md similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/README.md rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/README.md diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/e2e/app.e2e-spec.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/e2e/app.e2e-spec.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/e2e/app.e2e-spec.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/e2e/app.e2e-spec.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/e2e/app.po.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/e2e/app.po.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/e2e/app.po.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/e2e/app.po.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/e2e/tsconfig.e2e.json b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/e2e/tsconfig.e2e.json similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/e2e/tsconfig.e2e.json rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/e2e/tsconfig.e2e.json diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/karma.conf.js b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/karma.conf.js similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/karma.conf.js rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/karma.conf.js diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/package.json b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/package.json similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/package.json rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/package.json diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/protractor.conf.js b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/protractor.conf.js similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/protractor.conf.js rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/protractor.conf.js diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/app.component.css b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/app.component.css similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/app.component.css rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/app.component.css diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/app.component.html b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/app.component.html similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/app.component.html rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/app.component.html diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/app.component.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/app.component.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/app.component.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/app.component.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/app.module.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/app.module.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/app.module.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/app.module.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.css b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.css similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.css rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.css diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.html b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.html similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.html rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.html diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.css b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.css similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.css rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.css diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.html b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.html similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.html rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.html diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/click-stop-propagation.directive.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/click-stop-propagation.directive.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/click-stop-propagation.directive.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/click-stop-propagation.directive.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/http.service.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/http.service.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/http.service.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/http.service.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/principal.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/principal.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/principal.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/principal.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/rating.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/rating.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.css b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/rating/rating.component.css similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.css rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/rating/rating.component.css diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.html b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/rating/rating.component.html similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.html rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/rating/rating.component.html diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/rating/rating.component.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/rating/rating.component.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/assets/.gitkeep b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/assets/.gitkeep similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/assets/.gitkeep rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/assets/.gitkeep diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/environments/environment.prod.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/environments/environment.prod.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/environments/environment.prod.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/environments/environment.prod.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/environments/environment.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/environments/environment.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/environments/environment.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/environments/environment.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/favicon.ico b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/favicon.ico similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/favicon.ico rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/favicon.ico diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/index.html b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/index.html similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/index.html rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/index.html diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/main.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/main.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/main.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/main.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/polyfills.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/polyfills.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/polyfills.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/polyfills.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/styles.css b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/styles.css similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/styles.css rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/styles.css diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/test.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/test.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/test.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/test.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/tsconfig.app.json b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/tsconfig.app.json similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/tsconfig.app.json rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/tsconfig.app.json diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/tsconfig.spec.json b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/tsconfig.spec.json similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/tsconfig.spec.json rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/tsconfig.spec.json diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/typings.d.ts b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/typings.d.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/typings.d.ts rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/typings.d.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/tsconfig.json b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/tsconfig.json similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/tsconfig.json rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/tsconfig.json diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/tslint.json b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/tslint.json similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/tslint.json rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/tslint.json diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/AuthenticationController.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/AuthenticationController.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/AuthenticationController.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/AuthenticationController.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/ErrorPageConfig.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/ErrorPageConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/ErrorPageConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/ErrorPageConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SessionConfig.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SessionConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SessionConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SessionConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/Book.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/Book.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/Book.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/Book.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/BooksClient.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/BooksClient.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/BooksClient.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/BooksClient.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/Rating.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/Rating.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/Rating.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/Rating.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/RatingsClient.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/RatingsClient.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/RatingsClient.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/RatingsClient.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/controller/CombinedController.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/controller/CombinedController.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/controller/CombinedController.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/controller/CombinedController.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/filter/SessionSavingZuulPreFilter.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/filter/SessionSavingZuulPreFilter.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/filter/SessionSavingZuulPreFilter.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/filter/SessionSavingZuulPreFilter.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/bootstrap.properties b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/bootstrap.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/bootstrap.properties rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/logback.xml rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/logback.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/css/wro.css b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/css/wro.css similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/css/wro.css rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/css/wro.css diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.eot b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.eot similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.eot rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.eot diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.svg b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.svg similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.svg rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.svg diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.ttf b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.ttf similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.ttf rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.ttf diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.woff b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.woff similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.woff rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.woff diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.eot b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.eot similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.eot rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.eot diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.svg b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.svg similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.svg rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.svg diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.ttf b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.ttf similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.ttf rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.ttf diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.woff b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.woff similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.woff rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.woff diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/404-icon.png b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/404-icon.png similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/404-icon.png rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/404-icon.png diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/homepage-bg.jpg b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/homepage-bg.jpg similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/homepage-bg.jpg rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/homepage-bg.jpg diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/platform-bg.png b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/platform-bg.png similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/platform-bg.png rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/platform-bg.png diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/platform-spring-xd.png b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/platform-spring-xd.png similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/platform-spring-xd.png rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/platform-spring-xd.png diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/spring-logo-eureka-mobile.png b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/spring-logo-eureka-mobile.png similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/spring-logo-eureka-mobile.png rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/spring-logo-eureka-mobile.png diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/spring-logo-eureka.png b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/spring-logo-eureka.png similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/spring-logo-eureka.png rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/spring-logo-eureka.png diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/js/wro.js b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/js/wro.js similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/js/wro.js rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/js/wro.js diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/favicon.ico b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/favicon.ico similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/favicon.ico rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/favicon.ico diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/index.html b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/index.html similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/index.html rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/index.html diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/inline.bundle.js b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/inline.bundle.js similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/inline.bundle.js rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/inline.bundle.js diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/inline.bundle.js.map b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/inline.bundle.js.map similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/inline.bundle.js.map rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/inline.bundle.js.map diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/main.bundle.js b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/main.bundle.js similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/main.bundle.js rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/main.bundle.js diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/main.bundle.js.map b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/main.bundle.js.map similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/main.bundle.js.map rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/main.bundle.js.map diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/polyfills.bundle.js b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/polyfills.bundle.js similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/polyfills.bundle.js rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/polyfills.bundle.js diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/polyfills.bundle.js.map b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/polyfills.bundle.js.map similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/polyfills.bundle.js.map rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/polyfills.bundle.js.map diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/styles.bundle.js b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/styles.bundle.js similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/styles.bundle.js rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/styles.bundle.js diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/styles.bundle.js.map b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/styles.bundle.js.map similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/styles.bundle.js.map rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/styles.bundle.js.map diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/index.html b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/index.html similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/index.html rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/index.html diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/SpringContextLiveTest.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/test/java/com/baeldung/SpringContextLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/SpringContextLiveTest.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/test/java/com/baeldung/SpringContextLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/LiveTest.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/LiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/LiveTest.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/LiveTest.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/test/resources/bootstrap.properties b/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/test/resources/bootstrap.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/gateway/src/test/resources/bootstrap.properties rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/test/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClient.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClient.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClient.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClient.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClientImpl.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClientImpl.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClientImpl.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClientImpl.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderDTO.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderDTO.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderDTO.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderDTO.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderResponse.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderResponse.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderResponse.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderResponse.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/resources/application.properties rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/src/main/java/com/baeldung/orderservice/Order.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/src/main/java/com/baeldung/orderservice/Order.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/src/main/java/com/baeldung/orderservice/Order.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/src/main/java/com/baeldung/orderservice/Order.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderApplication.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderApplication.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderApplication.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderService.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderService.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderService.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderService.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/src/main/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/src/main/resources/application.properties rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/src/main/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/order-service/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/order-service/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap-legacy/pom.xml similarity index 88% rename from spring-cloud-modules/spring-cloud-bootstrap/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/pom.xml index 1e97082db1..597f669c69 100644 --- a/spring-cloud-modules/spring-cloud-bootstrap/pom.xml +++ b/spring-cloud-modules/spring-cloud-bootstrap-legacy/pom.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - spring-cloud-bootstrap + spring-cloud-bootstrap-legacy 1.0.0-SNAPSHOT - spring-cloud-bootstrap + spring-cloud-bootstrap-legacy pom diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-book/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/pom.xml 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-legacy/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-legacy/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/DataLoader.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/svc-rating/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/pom.xml 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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/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-legacy/svc-rating/src/test/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/zipkin/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/zipkin/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap/zipkin/src/main/java/com/baeldung/spring/cloud/bootstrap/zipkin/ZipkinApplication.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/src/main/java/com/baeldung/spring/cloud/bootstrap/zipkin/ZipkinApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/zipkin/src/main/java/com/baeldung/spring/cloud/bootstrap/zipkin/ZipkinApplication.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/src/main/java/com/baeldung/spring/cloud/bootstrap/zipkin/ZipkinApplication.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/zipkin/src/main/resources/bootstrap.properties b/spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/src/main/resources/bootstrap.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/zipkin/src/main/resources/bootstrap.properties rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/src/main/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/zipkin/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/zipkin/src/main/resources/logback.xml rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/src/main/resources/logback.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap/zipkin/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/zipkin/src/test/java/com/baeldung/SpringContextTest.java rename to spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/src/test/java/com/baeldung/SpringContextTest.java From 111532dc4a59c2e7564621c592477fa867536572 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 3 Jan 2023 00:02:26 +0530 Subject: [PATCH 207/592] Revert "Java 16013 Add suffix legacy to spring-cloud-bootstrap module (#13218)" (#13231) This reverts commit 4c153707aa7837fe8b2dd4a80594db6c0862d341. --- spring-cloud-modules/pom.xml | 2 +- .../README.md | 0 .../application-config/book-service.properties | 0 .../application-config/discovery.properties | 0 .../application-config/gateway.properties | 0 .../application-config/rating-service.properties | 0 .../application-config/zipkin.properties | 0 .../config/pom.xml | 0 .../cloud/bootstrap/config/ConfigApplication.java | 0 .../cloud/bootstrap/config/SecurityConfig.java | 0 .../src/main/resources/application.properties | 0 .../config/src/main/resources/logback.xml | 0 .../test/java/com/baeldung/SpringContextTest.java | 0 .../customer-service/pom.xml | 0 .../java/com/baeldung/customerservice/Customer.java | 0 .../customerservice/CustomerApplication.java | 0 .../baeldung/customerservice/CustomerService.java | 0 .../src/main/resources/application.properties | 0 .../src/test/resources/application.properties | 0 .../discovery/pom.xml | 0 .../bootstrap/discovery/DiscoveryApplication.java | 0 .../cloud/bootstrap/discovery/SecurityConfig.java | 0 .../cloud/bootstrap/discovery/SessionConfig.java | 0 .../src/main/resources/bootstrap.properties | 0 .../discovery/src/main/resources/logback.xml | 0 .../java/com/baeldung/SpringContextLiveTest.java | 0 .../gateway/pom.xml | 0 .../gateway/src/main/angular/ui/.angular-cli.json | 0 .../gateway/src/main/angular/ui/.editorconfig | 0 .../gateway/src/main/angular/ui/.gitignore | 0 .../gateway/src/main/angular/ui/README.md | 0 .../gateway/src/main/angular/ui/e2e/app.e2e-spec.ts | 0 .../gateway/src/main/angular/ui/e2e/app.po.ts | 0 .../src/main/angular/ui/e2e/tsconfig.e2e.json | 0 .../gateway/src/main/angular/ui/karma.conf.js | 0 .../gateway/src/main/angular/ui/package.json | 0 .../gateway/src/main/angular/ui/protractor.conf.js | 0 .../src/main/angular/ui/src/app/app.component.css | 0 .../src/main/angular/ui/src/app/app.component.html | 0 .../src/main/angular/ui/src/app/app.component.ts | 0 .../src/main/angular/ui/src/app/app.module.ts | 0 .../gateway/src/main/angular/ui/src/app/book.ts | 0 .../app/book/book-detail/book-detail.component.css | 0 .../app/book/book-detail/book-detail.component.html | 0 .../app/book/book-detail/book-detail.component.ts | 0 .../src/app/book/book-list/book-list.component.css | 0 .../src/app/book/book-list/book-list.component.html | 0 .../src/app/book/book-list/book-list.component.ts | 0 .../ui/src/app/click-stop-propagation.directive.ts | 0 .../src/main/angular/ui/src/app/http.service.ts | 0 .../src/main/angular/ui/src/app/principal.ts | 0 .../gateway/src/main/angular/ui/src/app/rating.ts | 0 .../angular/ui/src/app/rating/rating.component.css | 0 .../angular/ui/src/app/rating/rating.component.html | 0 .../angular/ui/src/app/rating/rating.component.ts | 0 .../gateway/src/main/angular/ui/src/assets/.gitkeep | 0 .../angular/ui/src/environments/environment.prod.ts | 0 .../main/angular/ui/src/environments/environment.ts | 0 .../gateway/src/main/angular/ui/src/favicon.ico | Bin .../gateway/src/main/angular/ui/src/index.html | 0 .../gateway/src/main/angular/ui/src/main.ts | 0 .../gateway/src/main/angular/ui/src/polyfills.ts | 0 .../gateway/src/main/angular/ui/src/styles.css | 0 .../gateway/src/main/angular/ui/src/test.ts | 0 .../src/main/angular/ui/src/tsconfig.app.json | 0 .../src/main/angular/ui/src/tsconfig.spec.json | 0 .../gateway/src/main/angular/ui/src/typings.d.ts | 0 .../gateway/src/main/angular/ui/tsconfig.json | 0 .../gateway/src/main/angular/ui/tslint.json | 0 .../bootstrap/gateway/AuthenticationController.java | 0 .../cloud/bootstrap/gateway/ErrorPageConfig.java | 0 .../cloud/bootstrap/gateway/GatewayApplication.java | 0 .../cloud/bootstrap/gateway/SecurityConfig.java | 0 .../cloud/bootstrap/gateway/SessionConfig.java | 0 .../cloud/bootstrap/gateway/client/book/Book.java | 0 .../bootstrap/gateway/client/book/BooksClient.java | 0 .../bootstrap/gateway/client/rating/Rating.java | 0 .../gateway/client/rating/RatingsClient.java | 0 .../gateway/controller/CombinedController.java | 0 .../gateway/filter/SessionSavingZuulPreFilter.java | 0 .../gateway/src/main/resources/bootstrap.properties | 0 .../gateway/src/main/resources/logback.xml | 0 .../src/main/resources/static/eureka/css/wro.css | 0 .../static/eureka/fonts/montserrat-webfont.eot | Bin .../static/eureka/fonts/montserrat-webfont.svg | 0 .../static/eureka/fonts/montserrat-webfont.ttf | Bin .../static/eureka/fonts/montserrat-webfont.woff | Bin .../static/eureka/fonts/varela_round-webfont.eot | Bin .../static/eureka/fonts/varela_round-webfont.svg | 0 .../static/eureka/fonts/varela_round-webfont.ttf | Bin .../static/eureka/fonts/varela_round-webfont.woff | Bin .../resources/static/eureka/images/404-icon.png | Bin .../resources/static/eureka/images/homepage-bg.jpg | Bin .../resources/static/eureka/images/platform-bg.png | Bin .../static/eureka/images/platform-spring-xd.png | Bin .../eureka/images/spring-logo-eureka-mobile.png | Bin .../static/eureka/images/spring-logo-eureka.png | Bin .../src/main/resources/static/eureka/js/wro.js | 0 .../src/main/resources/static/home/favicon.ico | Bin .../src/main/resources/static/home/index.html | 0 .../src/main/resources/static/home/inline.bundle.js | 0 .../main/resources/static/home/inline.bundle.js.map | 0 .../src/main/resources/static/home/main.bundle.js | 0 .../main/resources/static/home/main.bundle.js.map | 0 .../main/resources/static/home/polyfills.bundle.js | 0 .../resources/static/home/polyfills.bundle.js.map | 0 .../src/main/resources/static/home/styles.bundle.js | 0 .../main/resources/static/home/styles.bundle.js.map | 0 .../gateway/src/main/resources/static/index.html | 0 .../java/com/baeldung/SpringContextLiveTest.java | 0 .../spring/cloud/bootstrap/gateway/LiveTest.java | 0 .../bootstrap/gateway/SpringContextLiveTest.java | 0 .../gateway/src/test/resources/bootstrap.properties | 0 .../order-service/order-client/pom.xml | 0 .../baeldung/orderservice/client/OrderClient.java | 0 .../orderservice/client/OrderClientImpl.java | 0 .../com/baeldung/orderservice/client/OrderDTO.java | 0 .../baeldung/orderservice/client/OrderResponse.java | 0 .../src/main/resources/application.properties | 0 .../order-service/order-server/pom.xml | 0 .../main/java/com/baeldung/orderservice/Order.java | 0 .../com/baeldung/orderservice/OrderApplication.java | 0 .../com/baeldung/orderservice/OrderService.java | 0 .../src/main/resources/application.properties | 0 .../order-service/pom.xml | 0 .../pom.xml | 4 ++-- .../svc-book/pom.xml | 0 .../bootstrap/svcbook/BookServiceApplication.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 .../svc-book/src/main/resources/logback.xml | 0 .../java/com/baeldung/SpringContextLiveTest.java | 0 .../src/test/resources/bootstrap.properties | 0 .../svc-rating/pom.xml | 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 .../svc-rating/src/main/resources/logback.xml | 0 .../java/com/baeldung/SpringContextLiveTest.java | 0 .../src/test/resources/bootstrap.properties | 0 .../zipkin/pom.xml | 0 .../cloud/bootstrap/zipkin/ZipkinApplication.java | 0 .../zipkin/src/main/resources/bootstrap.properties | 0 .../zipkin/src/main/resources/logback.xml | 0 .../test/java/com/baeldung/SpringContextTest.java | 0 160 files changed, 3 insertions(+), 3 deletions(-) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/README.md (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/application-config/book-service.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/application-config/discovery.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/application-config/gateway.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/application-config/rating-service.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/application-config/zipkin.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/config/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/ConfigApplication.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/SecurityConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/config/src/main/resources/application.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/config/src/main/resources/logback.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/config/src/test/java/com/baeldung/SpringContextTest.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/customer-service/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/customer-service/src/main/java/com/baeldung/customerservice/Customer.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/customer-service/src/main/java/com/baeldung/customerservice/CustomerApplication.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/customer-service/src/main/java/com/baeldung/customerservice/CustomerService.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/customer-service/src/main/resources/application.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/customer-service/src/test/resources/application.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/discovery/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/DiscoveryApplication.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SecurityConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SessionConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/discovery/src/main/resources/bootstrap.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/discovery/src/main/resources/logback.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/discovery/src/test/java/com/baeldung/SpringContextLiveTest.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/.angular-cli.json (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/.editorconfig (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/.gitignore (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/README.md (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/e2e/app.e2e-spec.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/e2e/app.po.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/e2e/tsconfig.e2e.json (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/karma.conf.js (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/package.json (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/protractor.conf.js (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/app.component.css (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/app.component.html (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/app.component.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/app.module.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/book.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.css (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.html (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.css (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.html (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/click-stop-propagation.directive.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/http.service.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/principal.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/rating.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/rating/rating.component.css (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/rating/rating.component.html (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/app/rating/rating.component.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/assets/.gitkeep (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/environments/environment.prod.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/environments/environment.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/favicon.ico (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/index.html (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/main.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/polyfills.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/styles.css (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/test.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/tsconfig.app.json (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/tsconfig.spec.json (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/src/typings.d.ts (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/tsconfig.json (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/angular/ui/tslint.json (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/AuthenticationController.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/ErrorPageConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SessionConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/Book.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/BooksClient.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/Rating.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/RatingsClient.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/controller/CombinedController.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/filter/SessionSavingZuulPreFilter.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/bootstrap.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/logback.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/eureka/css/wro.css (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.eot (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.svg (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.ttf (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.woff (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.eot (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.svg (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.ttf (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.woff (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/eureka/images/404-icon.png (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/eureka/images/homepage-bg.jpg (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/eureka/images/platform-bg.png (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/eureka/images/platform-spring-xd.png (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/eureka/images/spring-logo-eureka-mobile.png (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/eureka/images/spring-logo-eureka.png (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/eureka/js/wro.js (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/home/favicon.ico (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/home/index.html (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/home/inline.bundle.js (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/home/inline.bundle.js.map (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/home/main.bundle.js (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/home/main.bundle.js.map (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/home/polyfills.bundle.js (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/home/polyfills.bundle.js.map (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/home/styles.bundle.js (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/home/styles.bundle.js.map (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/main/resources/static/index.html (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/test/java/com/baeldung/SpringContextLiveTest.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/LiveTest.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/gateway/src/test/resources/bootstrap.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/order-service/order-client/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClient.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClientImpl.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderDTO.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderResponse.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/order-service/order-client/src/main/resources/application.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/order-service/order-server/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/order-service/order-server/src/main/java/com/baeldung/orderservice/Order.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderApplication.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderService.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/order-service/order-server/src/main/resources/application.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/order-service/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/pom.xml (88%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-book/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/DataLoader.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SessionConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookNotFoundException.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookRepository.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-book/src/main/resources/bootstrap.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-book/src/main/resources/logback.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-book/src/test/java/com/baeldung/SpringContextLiveTest.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-book/src/test/resources/bootstrap.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-rating/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/DataLoader.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingCacheRepository.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingNotFoundException.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingRepository.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-rating/src/main/resources/bootstrap.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-rating/src/main/resources/logback.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-rating/src/test/java/com/baeldung/SpringContextLiveTest.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/svc-rating/src/test/resources/bootstrap.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/zipkin/pom.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/zipkin/src/main/java/com/baeldung/spring/cloud/bootstrap/zipkin/ZipkinApplication.java (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/zipkin/src/main/resources/bootstrap.properties (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/zipkin/src/main/resources/logback.xml (100%) rename spring-cloud-modules/{spring-cloud-bootstrap-legacy => spring-cloud-bootstrap}/zipkin/src/test/java/com/baeldung/SpringContextTest.java (100%) diff --git a/spring-cloud-modules/pom.xml b/spring-cloud-modules/pom.xml index 2f5410b308..7a4eec679e 100644 --- a/spring-cloud-modules/pom.xml +++ b/spring-cloud-modules/pom.xml @@ -21,7 +21,7 @@ spring-cloud-config spring-cloud-eureka spring-cloud-hystrix - spring-cloud-bootstrap-legacy + spring-cloud-bootstrap spring-cloud-ribbon-client spring-cloud-zookeeper spring-cloud-gateway diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/README.md b/spring-cloud-modules/spring-cloud-bootstrap/README.md similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/README.md rename to spring-cloud-modules/spring-cloud-bootstrap/README.md diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/book-service.properties b/spring-cloud-modules/spring-cloud-bootstrap/application-config/book-service.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/book-service.properties rename to spring-cloud-modules/spring-cloud-bootstrap/application-config/book-service.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/discovery.properties b/spring-cloud-modules/spring-cloud-bootstrap/application-config/discovery.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/discovery.properties rename to spring-cloud-modules/spring-cloud-bootstrap/application-config/discovery.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/gateway.properties b/spring-cloud-modules/spring-cloud-bootstrap/application-config/gateway.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/gateway.properties rename to spring-cloud-modules/spring-cloud-bootstrap/application-config/gateway.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/rating-service.properties b/spring-cloud-modules/spring-cloud-bootstrap/application-config/rating-service.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/rating-service.properties rename to spring-cloud-modules/spring-cloud-bootstrap/application-config/rating-service.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/zipkin.properties b/spring-cloud-modules/spring-cloud-bootstrap/application-config/zipkin.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/application-config/zipkin.properties rename to spring-cloud-modules/spring-cloud-bootstrap/application-config/zipkin.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/config/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap/config/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/config/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap/config/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/ConfigApplication.java b/spring-cloud-modules/spring-cloud-bootstrap/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/ConfigApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/ConfigApplication.java rename to spring-cloud-modules/spring-cloud-bootstrap/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/ConfigApplication.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/SecurityConfig.java b/spring-cloud-modules/spring-cloud-bootstrap/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/SecurityConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/SecurityConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap/config/src/main/java/com/baeldung/spring/cloud/bootstrap/config/SecurityConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-bootstrap/config/src/main/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/main/resources/application.properties rename to spring-cloud-modules/spring-cloud-bootstrap/config/src/main/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-bootstrap/config/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/main/resources/logback.xml rename to spring-cloud-modules/spring-cloud-bootstrap/config/src/main/resources/logback.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud-modules/spring-cloud-bootstrap/config/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/config/src/test/java/com/baeldung/SpringContextTest.java rename to spring-cloud-modules/spring-cloud-bootstrap/config/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap/customer-service/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap/customer-service/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/main/java/com/baeldung/customerservice/Customer.java b/spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/main/java/com/baeldung/customerservice/Customer.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/main/java/com/baeldung/customerservice/Customer.java rename to spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/main/java/com/baeldung/customerservice/Customer.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/main/java/com/baeldung/customerservice/CustomerApplication.java b/spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/main/java/com/baeldung/customerservice/CustomerApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/main/java/com/baeldung/customerservice/CustomerApplication.java rename to spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/main/java/com/baeldung/customerservice/CustomerApplication.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/main/java/com/baeldung/customerservice/CustomerService.java b/spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/main/java/com/baeldung/customerservice/CustomerService.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/main/java/com/baeldung/customerservice/CustomerService.java rename to spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/main/java/com/baeldung/customerservice/CustomerService.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/main/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/main/resources/application.properties rename to spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/main/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/test/resources/application.properties b/spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/test/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/customer-service/src/test/resources/application.properties rename to spring-cloud-modules/spring-cloud-bootstrap/customer-service/src/test/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap/discovery/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap/discovery/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/DiscoveryApplication.java b/spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/DiscoveryApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/DiscoveryApplication.java rename to spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/DiscoveryApplication.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SecurityConfig.java b/spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SecurityConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SecurityConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SecurityConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SessionConfig.java b/spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SessionConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SessionConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/java/com/baeldung/spring/cloud/bootstrap/discovery/SessionConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/resources/bootstrap.properties b/spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/resources/bootstrap.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/resources/bootstrap.properties rename to spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/main/resources/logback.xml rename to spring-cloud-modules/spring-cloud-bootstrap/discovery/src/main/resources/logback.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/test/java/com/baeldung/SpringContextLiveTest.java b/spring-cloud-modules/spring-cloud-bootstrap/discovery/src/test/java/com/baeldung/SpringContextLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/discovery/src/test/java/com/baeldung/SpringContextLiveTest.java rename to spring-cloud-modules/spring-cloud-bootstrap/discovery/src/test/java/com/baeldung/SpringContextLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap/gateway/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/.angular-cli.json b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/.angular-cli.json similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/.angular-cli.json rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/.angular-cli.json diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/.editorconfig b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/.editorconfig similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/.editorconfig rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/.editorconfig diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/.gitignore b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/.gitignore similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/.gitignore rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/.gitignore diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/README.md b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/README.md similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/README.md rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/README.md diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/e2e/app.e2e-spec.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/e2e/app.e2e-spec.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/e2e/app.e2e-spec.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/e2e/app.e2e-spec.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/e2e/app.po.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/e2e/app.po.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/e2e/app.po.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/e2e/app.po.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/e2e/tsconfig.e2e.json b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/e2e/tsconfig.e2e.json similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/e2e/tsconfig.e2e.json rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/e2e/tsconfig.e2e.json diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/karma.conf.js b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/karma.conf.js similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/karma.conf.js rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/karma.conf.js diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/package.json b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/package.json similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/package.json rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/package.json diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/protractor.conf.js b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/protractor.conf.js similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/protractor.conf.js rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/protractor.conf.js diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/app.component.css b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/app.component.css similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/app.component.css rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/app.component.css diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/app.component.html b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/app.component.html similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/app.component.html rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/app.component.html diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/app.component.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/app.component.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/app.component.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/app.component.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/app.module.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/app.module.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/app.module.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/app.module.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.css b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.css similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.css rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.css diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.html b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.html similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.html rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.html diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-detail/book-detail.component.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.css b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.css similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.css rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.css diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.html b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.html similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.html rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.html diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/book/book-list/book-list.component.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/click-stop-propagation.directive.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/click-stop-propagation.directive.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/click-stop-propagation.directive.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/click-stop-propagation.directive.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/http.service.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/http.service.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/http.service.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/http.service.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/principal.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/principal.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/principal.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/principal.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/rating.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/rating.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/rating/rating.component.css b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.css similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/rating/rating.component.css rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.css diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/rating/rating.component.html b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.html similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/rating/rating.component.html rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.html diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/rating/rating.component.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/app/rating/rating.component.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/app/rating/rating.component.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/assets/.gitkeep b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/assets/.gitkeep similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/assets/.gitkeep rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/assets/.gitkeep diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/environments/environment.prod.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/environments/environment.prod.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/environments/environment.prod.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/environments/environment.prod.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/environments/environment.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/environments/environment.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/environments/environment.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/environments/environment.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/favicon.ico b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/favicon.ico similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/favicon.ico rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/favicon.ico diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/index.html b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/index.html similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/index.html rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/index.html diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/main.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/main.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/main.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/main.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/polyfills.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/polyfills.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/polyfills.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/polyfills.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/styles.css b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/styles.css similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/styles.css rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/styles.css diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/test.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/test.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/test.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/test.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/tsconfig.app.json b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/tsconfig.app.json similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/tsconfig.app.json rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/tsconfig.app.json diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/tsconfig.spec.json b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/tsconfig.spec.json similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/tsconfig.spec.json rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/tsconfig.spec.json diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/typings.d.ts b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/typings.d.ts similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/src/typings.d.ts rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/src/typings.d.ts diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/tsconfig.json b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/tsconfig.json similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/tsconfig.json rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/tsconfig.json diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/tslint.json b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/tslint.json similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/angular/ui/tslint.json rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/angular/ui/tslint.json diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/AuthenticationController.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/AuthenticationController.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/AuthenticationController.java rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/AuthenticationController.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/ErrorPageConfig.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/ErrorPageConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/ErrorPageConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/ErrorPageConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SecurityConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SessionConfig.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SessionConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SessionConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/SessionConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/Book.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/Book.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/Book.java rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/Book.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/BooksClient.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/BooksClient.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/BooksClient.java rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/BooksClient.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/Rating.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/Rating.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/Rating.java rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/Rating.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/RatingsClient.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/RatingsClient.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/RatingsClient.java rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/RatingsClient.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/controller/CombinedController.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/controller/CombinedController.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/controller/CombinedController.java rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/controller/CombinedController.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/filter/SessionSavingZuulPreFilter.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/filter/SessionSavingZuulPreFilter.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/filter/SessionSavingZuulPreFilter.java rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/filter/SessionSavingZuulPreFilter.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/bootstrap.properties b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/bootstrap.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/bootstrap.properties rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/logback.xml rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/logback.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/css/wro.css b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/css/wro.css similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/css/wro.css rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/css/wro.css diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.eot b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.eot similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.eot rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.eot diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.svg b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.svg similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.svg rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.svg diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.ttf b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.ttf similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.ttf rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.ttf diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.woff b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.woff similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.woff rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/montserrat-webfont.woff diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.eot b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.eot similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.eot rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.eot diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.svg b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.svg similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.svg rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.svg diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.ttf b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.ttf similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.ttf rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.ttf diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.woff b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.woff similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.woff rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/fonts/varela_round-webfont.woff diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/404-icon.png b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/404-icon.png similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/404-icon.png rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/404-icon.png diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/homepage-bg.jpg b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/homepage-bg.jpg similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/homepage-bg.jpg rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/homepage-bg.jpg diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/platform-bg.png b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/platform-bg.png similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/platform-bg.png rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/platform-bg.png diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/platform-spring-xd.png b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/platform-spring-xd.png similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/platform-spring-xd.png rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/platform-spring-xd.png diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/spring-logo-eureka-mobile.png b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/spring-logo-eureka-mobile.png similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/spring-logo-eureka-mobile.png rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/spring-logo-eureka-mobile.png diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/spring-logo-eureka.png b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/spring-logo-eureka.png similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/images/spring-logo-eureka.png rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/images/spring-logo-eureka.png diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/js/wro.js b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/js/wro.js similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/eureka/js/wro.js rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/eureka/js/wro.js diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/favicon.ico b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/favicon.ico similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/favicon.ico rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/favicon.ico diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/index.html b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/index.html similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/index.html rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/index.html diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/inline.bundle.js b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/inline.bundle.js similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/inline.bundle.js rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/inline.bundle.js diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/inline.bundle.js.map b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/inline.bundle.js.map similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/inline.bundle.js.map rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/inline.bundle.js.map diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/main.bundle.js b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/main.bundle.js similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/main.bundle.js rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/main.bundle.js diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/main.bundle.js.map b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/main.bundle.js.map similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/main.bundle.js.map rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/main.bundle.js.map diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/polyfills.bundle.js b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/polyfills.bundle.js similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/polyfills.bundle.js rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/polyfills.bundle.js diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/polyfills.bundle.js.map b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/polyfills.bundle.js.map similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/polyfills.bundle.js.map rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/polyfills.bundle.js.map diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/styles.bundle.js b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/styles.bundle.js similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/styles.bundle.js rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/styles.bundle.js diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/styles.bundle.js.map b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/styles.bundle.js.map similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/home/styles.bundle.js.map rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/home/styles.bundle.js.map diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/index.html b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/index.html similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/main/resources/static/index.html rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/resources/static/index.html diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/test/java/com/baeldung/SpringContextLiveTest.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/SpringContextLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/test/java/com/baeldung/SpringContextLiveTest.java rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/SpringContextLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/LiveTest.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/LiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/LiveTest.java rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/LiveTest.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/test/resources/bootstrap.properties b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/test/resources/bootstrap.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/gateway/src/test/resources/bootstrap.properties rename to spring-cloud-modules/spring-cloud-bootstrap/gateway/src/test/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClient.java b/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClient.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClient.java rename to spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClient.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClientImpl.java b/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClientImpl.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClientImpl.java rename to spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderClientImpl.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderDTO.java b/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderDTO.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderDTO.java rename to spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderDTO.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderResponse.java b/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderResponse.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderResponse.java rename to spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/java/com/baeldung/orderservice/client/OrderResponse.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-client/src/main/resources/application.properties rename to spring-cloud-modules/spring-cloud-bootstrap/order-service/order-client/src/main/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/src/main/java/com/baeldung/orderservice/Order.java b/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/src/main/java/com/baeldung/orderservice/Order.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/src/main/java/com/baeldung/orderservice/Order.java rename to spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/src/main/java/com/baeldung/orderservice/Order.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderApplication.java b/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderApplication.java rename to spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderApplication.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderService.java b/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderService.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderService.java rename to spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/src/main/java/com/baeldung/orderservice/OrderService.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/src/main/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/order-server/src/main/resources/application.properties rename to spring-cloud-modules/spring-cloud-bootstrap/order-service/order-server/src/main/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap/order-service/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/order-service/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap/order-service/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap/pom.xml similarity index 88% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap/pom.xml index 597f669c69..1e97082db1 100644 --- a/spring-cloud-modules/spring-cloud-bootstrap-legacy/pom.xml +++ b/spring-cloud-modules/spring-cloud-bootstrap/pom.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - spring-cloud-bootstrap-legacy + spring-cloud-bootstrap 1.0.0-SNAPSHOT - spring-cloud-bootstrap-legacy + spring-cloud-bootstrap pom diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap/svc-book/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap/svc-book/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java b/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/DataLoader.java b/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/DataLoader.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/DataLoader.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/DataLoader.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java b/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SessionConfig.java b/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SessionConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SessionConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SessionConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java b/spring-cloud-modules/spring-cloud-bootstrap/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-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java b/spring-cloud-modules/spring-cloud-bootstrap/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-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookNotFoundException.java b/spring-cloud-modules/spring-cloud-bootstrap/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-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookNotFoundException.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookNotFoundException.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookRepository.java b/spring-cloud-modules/spring-cloud-bootstrap/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-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookRepository.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookRepository.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java b/spring-cloud-modules/spring-cloud-bootstrap/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-legacy/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/resources/bootstrap.properties b/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/resources/bootstrap.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/resources/bootstrap.properties rename to spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/main/resources/logback.xml rename to spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/resources/logback.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/test/java/com/baeldung/SpringContextLiveTest.java b/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/test/java/com/baeldung/SpringContextLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/test/java/com/baeldung/SpringContextLiveTest.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/test/java/com/baeldung/SpringContextLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/test/resources/bootstrap.properties b/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/test/resources/bootstrap.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-book/src/test/resources/bootstrap.properties rename to spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/test/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap/svc-rating/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/DataLoader.java b/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/DataLoader.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/DataLoader.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/DataLoader.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java b/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java b/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java b/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java b/spring-cloud-modules/spring-cloud-bootstrap/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-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingCacheRepository.java b/spring-cloud-modules/spring-cloud-bootstrap/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-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingCacheRepository.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingCacheRepository.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java b/spring-cloud-modules/spring-cloud-bootstrap/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-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingNotFoundException.java b/spring-cloud-modules/spring-cloud-bootstrap/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-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingNotFoundException.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingNotFoundException.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingRepository.java b/spring-cloud-modules/spring-cloud-bootstrap/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-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingRepository.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingRepository.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java b/spring-cloud-modules/spring-cloud-bootstrap/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-legacy/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/resources/bootstrap.properties b/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/resources/bootstrap.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/resources/bootstrap.properties rename to spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/main/resources/logback.xml rename to spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/resources/logback.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/test/java/com/baeldung/SpringContextLiveTest.java b/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/test/java/com/baeldung/SpringContextLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/test/java/com/baeldung/SpringContextLiveTest.java rename to spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/test/java/com/baeldung/SpringContextLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/test/resources/bootstrap.properties b/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/test/resources/bootstrap.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/svc-rating/src/test/resources/bootstrap.properties rename to spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/test/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap/zipkin/pom.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin/pom.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/src/main/java/com/baeldung/spring/cloud/bootstrap/zipkin/ZipkinApplication.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin/src/main/java/com/baeldung/spring/cloud/bootstrap/zipkin/ZipkinApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/src/main/java/com/baeldung/spring/cloud/bootstrap/zipkin/ZipkinApplication.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin/src/main/java/com/baeldung/spring/cloud/bootstrap/zipkin/ZipkinApplication.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/src/main/resources/bootstrap.properties b/spring-cloud-modules/spring-cloud-bootstrap/zipkin/src/main/resources/bootstrap.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/src/main/resources/bootstrap.properties rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin/src/main/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-bootstrap/zipkin/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/src/main/resources/logback.xml rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin/src/main/resources/logback.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap-legacy/zipkin/src/test/java/com/baeldung/SpringContextTest.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin/src/test/java/com/baeldung/SpringContextTest.java From 306949719b0914ba02a54c2a1b6eda095cd0ff61 Mon Sep 17 00:00:00 2001 From: Kapil Khandelwal Date: Tue, 3 Jan 2023 01:31:12 +0530 Subject: [PATCH 208/592] Fixing the No such DSL method Error in Jenkins Pipeline (#13223) --- .../jenkins-jobs/dsl-error-fix/no-such-dsl-method-job | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 jenkins-modules/jenkins-jobs/dsl-error-fix/no-such-dsl-method-job diff --git a/jenkins-modules/jenkins-jobs/dsl-error-fix/no-such-dsl-method-job b/jenkins-modules/jenkins-jobs/dsl-error-fix/no-such-dsl-method-job new file mode 100644 index 0000000000..f68cb70c2f --- /dev/null +++ b/jenkins-modules/jenkins-jobs/dsl-error-fix/no-such-dsl-method-job @@ -0,0 +1,10 @@ +pipeline { + agent any + stages { + stage('Build') { + steps { + mvn 'clean install' + } + } + } +} From d6bc6bb5d2dc2fde75dcb0335589514d9256cca0 Mon Sep 17 00:00:00 2001 From: cesarevalenti90 <50798547+cesarevalenti90@users.noreply.github.com> Date: Mon, 2 Jan 2023 21:08:01 +0100 Subject: [PATCH 209/592] BAEL-6057 - Implementing Retry In Kafka Consumer (#13229) * Added test class for a simple shallow copy and deep copy * Added test class for a simple shallow copy and deep copy * refactor naming of test method * formatted * refactor test whenIsAShallowCopyDoneByCopyConstructor_thenImmutableObjectWillNotChange * Renamed package and added md file * refactor README.md * first push * refactor * Revert "refactor README.md" This reverts commit eae77c453ba0bf2af62bad52dc1ed61d07931e34. * Revert "Renamed package and added md file" This reverts commit 42c6f97cbde39cc0a5e0bacf34f86a32ded4f4aa. * Revert "refactor test whenIsAShallowCopyDoneByCopyConstructor_thenImmutableObjectWillNotChange" This reverts commit 44fb57fe2b51857f960dc216d33508e718e5414f. * Revert "formatted" This reverts commit 44be87ef25e566b8e9175cb0fdeed7f0ef485dd3. * Revert "refactor naming of test method" This reverts commit 6133c31057e39b19c4978f960cda1c0ba5559aae. * Revert "Added test class for a simple shallow copy and deep copy" This reverts commit 2cae083578883ae693d1c5e76fd4948e213e9ea0. * Revert "Added test class for a simple shallow copy and deep copy" This reverts commit f43312e2c1979410409f46020a3f7d555e11e966. * Merge prohect java-supplier-callable to project core-java-lambdas * adjusted package name * removed AbstractAgeCalculator.java * added test for supplier-callable * first push for article "Implementing Retry In Kafka Consumer" Co-authored-by: Cesare --- .../spring/kafka/KafkaConsumerConfig.java | 35 +++++++- .../spring/kafka/MultiTypeKafkaListener.java | 6 ++ .../kafka/RetryableApplicationKafkaApp.java | 14 ++++ .../src/main/resources/application.properties | 3 + .../EmbeddedKafkaIntegrationTest.java | 11 ++- .../kafka/KafkaRetryableIntegrationTest.java | 84 +++++++++++++++++++ 6 files changed, 147 insertions(+), 6 deletions(-) create mode 100644 spring-kafka/src/main/java/com/baeldung/spring/kafka/RetryableApplicationKafkaApp.java create mode 100644 spring-kafka/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java index e8aa63a88d..463d3209ea 100644 --- a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java +++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java @@ -1,5 +1,6 @@ package com.baeldung.spring.kafka; +import java.net.SocketTimeoutException; import java.util.HashMap; import java.util.Map; @@ -8,15 +9,20 @@ 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.context.annotation.Primary; import org.springframework.kafka.annotation.EnableKafka; import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; import org.springframework.kafka.core.ConsumerFactory; import org.springframework.kafka.core.DefaultKafkaConsumerFactory; +import org.springframework.kafka.listener.ContainerProperties; +import org.springframework.kafka.listener.DefaultErrorHandler; import org.springframework.kafka.support.converter.RecordMessageConverter; import org.springframework.kafka.support.converter.StringJsonMessageConverter; import org.springframework.kafka.support.mapping.DefaultJackson2JavaTypeMapper; import org.springframework.kafka.support.mapping.Jackson2JavaTypeMapper; import org.springframework.kafka.support.serializer.JsonDeserializer; +import org.springframework.util.backoff.BackOff; +import org.springframework.util.backoff.FixedBackOff; @EnableKafka @Configuration @@ -25,6 +31,12 @@ public class KafkaConsumerConfig { @Value(value = "${spring.kafka.bootstrap-servers}") private String bootstrapAddress; + @Value(value = "${kafka.backoff.interval}") + private Long interval; + + @Value(value = "${kafka.backoff.max_failure}") + private Long maxAttempts; + public ConsumerFactory consumerFactory(String groupId) { Map props = new HashMap<>(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); @@ -71,7 +83,7 @@ public class KafkaConsumerConfig { public ConcurrentKafkaListenerContainerFactory filterKafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory factory = kafkaListenerContainerFactory("filter"); factory.setRecordFilterStrategy(record -> record.value() - .contains("World")); + .contains("World")); return factory; } @@ -83,7 +95,7 @@ public class KafkaConsumerConfig { } @Bean - public ConcurrentKafkaListenerContainerFactory greetingKafkaListenerContainerFactory() { + public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); factory.setConsumerFactory(greetingConsumerFactory()); return factory; @@ -109,15 +121,32 @@ public class KafkaConsumerConfig { props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class); + props.put(ConsumerConfig.GROUP_ID_CONFIG, "group_id_test"); return new DefaultKafkaConsumerFactory<>(props); } @Bean - public ConcurrentKafkaListenerContainerFactory multiTypeKafkaListenerContainerFactory() { + @Primary + public ConcurrentKafkaListenerContainerFactory greetingKafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); factory.setConsumerFactory(multiTypeConsumerFactory()); factory.setMessageConverter(multiTypeConverter()); + factory.setCommonErrorHandler(errorHandler()); + factory.getContainerProperties() + .setAckMode(ContainerProperties.AckMode.RECORD); return factory; } + @Bean + public DefaultErrorHandler errorHandler() { + BackOff fixedBackOff = new FixedBackOff(interval, maxAttempts); + DefaultErrorHandler errorHandler = new DefaultErrorHandler((consumerRecord, e) -> { + System.out.println(String.format("consumed record %s because this exception was thrown",consumerRecord.toString(),e.getClass().getName())); + }, fixedBackOff); + //Commented because of the test + //errorHandler.addRetryableExceptions(SocketTimeoutException.class,RuntimeException.class); + errorHandler.addNotRetryableExceptions(NullPointerException.class); + return errorHandler; + } + } diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java index 9afb5ff0b6..4b43c84f15 100644 --- a/spring-kafka/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java +++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java @@ -2,6 +2,7 @@ package com.baeldung.spring.kafka; import org.springframework.kafka.annotation.KafkaHandler; import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.messaging.MessagingException; import org.springframework.stereotype.Component; @Component @@ -9,7 +10,12 @@ import org.springframework.stereotype.Component; public class MultiTypeKafkaListener { @KafkaHandler + //@RetryableTopic(backoff = @Backoff(value = 3000L), attempts = "5", autoCreateTopics = "false",include = SocketTimeoutException.class, exclude = NullPointerException.class) public void handleGreeting(Greeting greeting) { + if (greeting.getName() + .equalsIgnoreCase("test")) { + throw new MessagingException("test not allowed"); + } System.out.println("Greeting received: " + greeting); } diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/RetryableApplicationKafkaApp.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/RetryableApplicationKafkaApp.java new file mode 100644 index 0000000000..e43207829a --- /dev/null +++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/RetryableApplicationKafkaApp.java @@ -0,0 +1,14 @@ +package com.baeldung.spring.kafka; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Import; + +@SpringBootApplication +@Import(value = { KafkaTopicConfig.class, KafkaConsumerConfig.class, KafkaProducerConfig.class }) +public class RetryableApplicationKafkaApp { + + public static void main(String[] args) { + SpringApplication.run(RetryableApplicationKafkaApp.class, args); + } +} diff --git a/spring-kafka/src/main/resources/application.properties b/spring-kafka/src/main/resources/application.properties index c57537e2af..691b6f55b7 100644 --- a/spring-kafka/src/main/resources/application.properties +++ b/spring-kafka/src/main/resources/application.properties @@ -14,4 +14,7 @@ monitor.producer.simulate=true monitor.consumer.simulate=true monitor.kafka.consumer.groupid.simulate=baeldungGrpSimulate test.topic=testtopic1 +kafka.backoff.interval=9000 +kafka.backoff.max_failure=5 + diff --git a/spring-kafka/src/test/java/com/baeldung/kafka/embedded/EmbeddedKafkaIntegrationTest.java b/spring-kafka/src/test/java/com/baeldung/kafka/embedded/EmbeddedKafkaIntegrationTest.java index eebcf778be..030d166ca4 100644 --- a/spring-kafka/src/test/java/com/baeldung/kafka/embedded/EmbeddedKafkaIntegrationTest.java +++ b/spring-kafka/src/test/java/com/baeldung/kafka/embedded/EmbeddedKafkaIntegrationTest.java @@ -1,7 +1,6 @@ package com.baeldung.kafka.embedded; import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -16,6 +15,8 @@ import org.springframework.kafka.core.KafkaTemplate; import org.springframework.kafka.test.context.EmbeddedKafka; import org.springframework.test.annotation.DirtiesContext; +import com.fasterxml.jackson.databind.ObjectMapper; + @SpringBootTest @DirtiesContext @EmbeddedKafka(partitions = 1, brokerProperties = { "listeners=PLAINTEXT://localhost:9092", "port=9092" }) @@ -33,6 +34,8 @@ class EmbeddedKafkaIntegrationTest { @Value("${test.topic}") private String topic; + private ObjectMapper objectMapper = new ObjectMapper(); + @BeforeEach void setup() { consumer.resetLatch(); @@ -44,7 +47,8 @@ class EmbeddedKafkaIntegrationTest { template.send(topic, data); - boolean messageConsumed = consumer.getLatch().await(10, TimeUnit.SECONDS); + boolean messageConsumed = consumer.getLatch() + .await(10, TimeUnit.SECONDS); assertTrue(messageConsumed); assertThat(consumer.getPayload(), containsString(data)); } @@ -55,7 +59,8 @@ class EmbeddedKafkaIntegrationTest { producer.send(topic, data); - boolean messageConsumed = consumer.getLatch().await(10, TimeUnit.SECONDS); + boolean messageConsumed = consumer.getLatch() + .await(10, TimeUnit.SECONDS); assertTrue(messageConsumed); assertThat(consumer.getPayload(), containsString(data)); } diff --git a/spring-kafka/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java b/spring-kafka/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java new file mode 100644 index 0000000000..029031923e --- /dev/null +++ b/spring-kafka/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java @@ -0,0 +1,84 @@ +package com.baeldung.spring.kafka; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import org.junit.Before; +import org.junit.ClassRule; +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.AcknowledgingConsumerAwareMessageListener; +import org.springframework.kafka.listener.ConcurrentMessageListenerContainer; +import org.springframework.kafka.test.EmbeddedKafkaBroker; +import org.springframework.kafka.test.context.EmbeddedKafka; + +import com.fasterxml.jackson.databind.ObjectMapper; + +@SpringBootTest(classes = RetryableApplicationKafkaApp.class) +@EmbeddedKafka(partitions = 1, brokerProperties = { "listeners=PLAINTEXT://localhost:9092", "port=9092" }) +public class KafkaRetryableIntegrationTest { + @ClassRule + public static EmbeddedKafkaBroker embeddedKafka = new EmbeddedKafkaBroker(1, true, "multitype"); + + @Autowired + private KafkaListenerEndpointRegistry registry; + + @Autowired + private KafkaTemplate template; + + private ObjectMapper objectMapper = new ObjectMapper(); + + private static final String CONTAINER_GROUP = "multiGroup"; + + private static final String TOPIC = "topic"; + + @Before + public void setup() { + System.setProperty("spring.kafka.bootstrap-servers", embeddedKafka.getBrokersAsString()); + } + + @Test + public void givenEmbeddedKafkaBroker_whenSendingAWellFormedMessage_thenMessageIsConsumed() throws Exception { + ConcurrentMessageListenerContainer container = (ConcurrentMessageListenerContainer) registry.getListenerContainer(CONTAINER_GROUP); + container.stop(); + @SuppressWarnings("unchecked") AcknowledgingConsumerAwareMessageListener messageListener = (AcknowledgingConsumerAwareMessageListener) container.getContainerProperties() + .getMessageListener(); + CountDownLatch latch = new CountDownLatch(1); + container.getContainerProperties() + .setMessageListener((AcknowledgingConsumerAwareMessageListener) (data, acknowledgment, consumer) -> { + messageListener.onMessage(data, acknowledgment, consumer); + latch.countDown(); + }); + Greeting greeting = new Greeting("test1", "test2"); + container.start(); + template.send(TOPIC, objectMapper.writeValueAsString(greeting)); + assertThat(latch.await(10, TimeUnit.SECONDS)).isTrue(); + } + + @Test + public void givenEmbeddedKafkaBroker_whenSendingAMalFormedMessage_thenMessageIsConsumedAfterRetry() throws Exception { + ConcurrentMessageListenerContainer container = (ConcurrentMessageListenerContainer) registry.getListenerContainer(CONTAINER_GROUP); + container.stop(); + @SuppressWarnings("unchecked") AcknowledgingConsumerAwareMessageListener messageListener = (AcknowledgingConsumerAwareMessageListener) container.getContainerProperties() + .getMessageListener(); + CountDownLatch latch = new CountDownLatch(1); + container.getContainerProperties() + .setMessageListener((AcknowledgingConsumerAwareMessageListener) (data, acknowledgment, consumer) -> { + messageListener.onMessage(data, acknowledgment, consumer); + latch.countDown(); + }); + container.start(); + Greeting greeting = new Greeting("test", "test"); + template.send(TOPIC, objectMapper.writeValueAsString(greeting)); + //this message will go on error + Greeting greeting2 = new Greeting("test2", "test2"); + template.send(TOPIC, objectMapper.writeValueAsString(greeting2)); + assertThat(latch.await(10, TimeUnit.SECONDS)).isTrue(); + } + +} From ca9fecfaae3aa490e8832ffe0350b6b6df18302a Mon Sep 17 00:00:00 2001 From: neha298 <32795246+neha298@users.noreply.github.com> Date: Tue, 3 Jan 2023 18:02:13 +0530 Subject: [PATCH 210/592] Multiple repositories in Gradle (#13226) * Creating a deep vs shallow copy of an object * WIP: Initial commit * Publish package to GitHub registry * Import library from package registry * Evaluation code removal Co-authored-by: neha --- .../multiple-repositories/build.gradle | 29 +++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + .../multiple-repositories/gradlew | 234 ++++++++++++++++++ .../multiple-repositories/gradlew.bat | 89 +++++++ .../multiple-repositories/settings.gradle | 1 + .../gradle/multiplerepositories/Student.java | 26 ++ .../MultipleRepositoryTest.java | 19 ++ .../publish-package/build.gradle | 33 +++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + .../publish-package/gradlew | 234 ++++++++++++++++++ .../publish-package/gradlew.bat | 89 +++++++ .../publish-package/settings.gradle | 1 + .../baeldung/gradle/publish_package/User.java | 35 +++ 15 files changed, 800 insertions(+) create mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/build.gradle create mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradle/wrapper/gradle-wrapper.properties create mode 100755 gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradlew create mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradlew.bat create mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/settings.gradle create mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/src/main/java/com/baeldung/gradle/multiplerepositories/Student.java create mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/src/test/java/com/baeldung/gradle/multiplerepositories/MultipleRepositoryTest.java create mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/publish-package/build.gradle create mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradle/wrapper/gradle-wrapper.properties create mode 100755 gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradlew create mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradlew.bat create mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/publish-package/settings.gradle create mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/publish-package/src/main/java/com/baeldung/gradle/publish_package/User.java diff --git a/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/build.gradle b/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/build.gradle new file mode 100644 index 0000000000..355744da86 --- /dev/null +++ b/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/build.gradle @@ -0,0 +1,29 @@ +plugins { + id 'java' +} + +group = "com.baeldung.gradle" +version = "1.0.0-SNAPSHOT" +sourceCompatibility = JavaVersion.VERSION_17 + +repositories { + mavenLocal() + mavenCentral() + maven { + name = "GitHubPackages" + url = "https://maven.pkg.github.com/eugenp/tutorials" + credentials { + username = project.USERNAME + password = project.GITHUB_TOKEN + } + } +} + +dependencies { + implementation('com.baeldung.gradle:publish-package:1.0.0-SNAPSHOT') + testImplementation("org.junit.jupiter:junit-jupiter-engine:5.9.0") +} + +tasks.named('test') { + useJUnitPlatform() +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..41d9927a4d4fb3f96a785543079b8df6723c946b GIT binary patch literal 59821 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000..070cb702f0 --- /dev/null +++ b/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +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 new file mode 100755 index 0000000000..1b6c787337 --- /dev/null +++ b/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradlew @@ -0,0 +1,234 @@ +#!/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 new file mode 100644 index 0000000000..107acd32c4 --- /dev/null +++ b/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/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/multiple-repositories-demo/multiple-repositories/settings.gradle b/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/settings.gradle new file mode 100644 index 0000000000..0177937493 --- /dev/null +++ b/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/settings.gradle @@ -0,0 +1 @@ +rootProject.name = "multiple-repositories" diff --git a/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/src/main/java/com/baeldung/gradle/multiplerepositories/Student.java b/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/src/main/java/com/baeldung/gradle/multiplerepositories/Student.java new file mode 100644 index 0000000000..dcb28a3742 --- /dev/null +++ b/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/src/main/java/com/baeldung/gradle/multiplerepositories/Student.java @@ -0,0 +1,26 @@ +package com.baeldung.gradle.multiplerepositories; + +import com.baeldung.gradle.publishPackage.User; + +public class Student extends User { + + private String studentCode; + + private String lastInstitution; + + public String getStudentCode() { + return studentCode; + } + + public void setStudentCode(String studentCode) { + this.studentCode = studentCode; + } + + public String getLastInstitution() { + return lastInstitution; + } + + public void setLastInstitution(String lastInstitution) { + this.lastInstitution = lastInstitution; + } +} diff --git a/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/src/test/java/com/baeldung/gradle/multiplerepositories/MultipleRepositoryTest.java b/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/src/test/java/com/baeldung/gradle/multiplerepositories/MultipleRepositoryTest.java new file mode 100644 index 0000000000..d0a72d9b3c --- /dev/null +++ b/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/src/test/java/com/baeldung/gradle/multiplerepositories/MultipleRepositoryTest.java @@ -0,0 +1,19 @@ +package com.baeldung.gradle.multiplerepositories; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class MultipleRepositoryTest { + + @Test + public void testPublishedPackage() { + Student student = new Student(); + student.setId(1); + student.setStudentCode("CD-875"); + student.setName("John Doe"); + student.setLastInstitution("Institute of Technology"); + + assertEquals("John Doe", student.getName()); + } +} diff --git a/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/build.gradle b/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/build.gradle new file mode 100644 index 0000000000..bd97650e9c --- /dev/null +++ b/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/build.gradle @@ -0,0 +1,33 @@ +plugins { + id "maven-publish" + id "java" +} + +group = "com.baeldung.gradle" +version = "1.0.0-SNAPSHOT" + +repositories { + mavenLocal() + mavenCentral() +} + +publishing { + publications { + register("jar", MavenPublication) { + from(components["java"]) + pom { + url.set("https://github.com/eugenp/tutorials.git") + } + } + } + repositories { + maven { + name = "GitHubPackages" + url = "https://maven.pkg.github.com/eugenp/tutorials" + credentials { + username = project.USERNAME + password = project.GITHUB_TOKEN + } + } + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..41d9927a4d4fb3f96a785543079b8df6723c946b GIT binary patch literal 59821 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000..070cb702f0 --- /dev/null +++ b/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +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 new file mode 100755 index 0000000000..1b6c787337 --- /dev/null +++ b/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradlew @@ -0,0 +1,234 @@ +#!/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 new file mode 100644 index 0000000000..107acd32c4 --- /dev/null +++ b/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/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/multiple-repositories-demo/publish-package/settings.gradle b/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/settings.gradle new file mode 100644 index 0000000000..9ccd121d0d --- /dev/null +++ b/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/settings.gradle @@ -0,0 +1 @@ +rootProject.name = "publish-package" diff --git a/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/src/main/java/com/baeldung/gradle/publish_package/User.java b/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/src/main/java/com/baeldung/gradle/publish_package/User.java new file mode 100644 index 0000000000..bc612d038b --- /dev/null +++ b/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/src/main/java/com/baeldung/gradle/publish_package/User.java @@ -0,0 +1,35 @@ +package com.baeldung.gradle.publish_package; + +import java.util.Date; + +public class User { + private Integer id; + + private String name; + + private Date dob; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDob() { + return dob; + } + + public void setDob(Date dob) { + this.dob = dob; + } +} From 84a93ffbd4bca171159760a4ce1dc6733ad5545c Mon Sep 17 00:00:00 2001 From: Daniel Strmecki Date: Tue, 3 Jan 2023 14:52:58 +0100 Subject: [PATCH 211/592] Feature/bael 5756 choose api (#13227) * BAEL-5756: Rest controller * BAEL-5756: GraphQL controller (without tests) * BAEL-5756: Fix GraphQL test * BAEL-5756: Fix GraphQL test 2 * BAEL-5756: GRPC working * BAEL-5756: GRPC with Spring Boot * BAEL-5756: Books proto service * BAEL-5756: Fix grpc integration test * BAEL-5756: Refactor * BAEL-5756: Revert some changes * BAEL-5756: Fix integration tests port issue between gRPC and GraphQL * BAEL-5756: Fix pom merge issue * BAEL-5756: Fix typo --- .../spring-boot-graphql/pom.xml | 86 +++++++++---------- .../main/resources/application-chooseapi.yml | 4 +- ...BooksControllerGraphQLIntegrationTest.java | 4 +- .../BooksControllerRestIntegrationTest.java | 4 +- 4 files changed, 52 insertions(+), 46 deletions(-) diff --git a/spring-boot-modules/spring-boot-graphql/pom.xml b/spring-boot-modules/spring-boot-graphql/pom.xml index b4b449166f..bb475679ad 100644 --- a/spring-boot-modules/spring-boot-graphql/pom.xml +++ b/spring-boot-modules/spring-boot-graphql/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-graphql spring-boot-graphql @@ -13,6 +13,47 @@ 1.0.0-SNAPSHOT + + + + kr.motd.maven + os-maven-plugin + 1.7.0 + + + + + org.xolstice.maven.plugins + protobuf-maven-plugin + ${protobuf-plugin.version} + + com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier} + grpc-java + io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier} + + + + + compile + compile-custom + + + + + + + + + 3.19.2 + 0.6.1 + 1.43.2 + 2.13.1.RELEASE + 1.5.1 + 1.3.5 + 1.6.2 + 3.3.2 + + org.springframework.boot @@ -78,45 +119,4 @@ - - - - kr.motd.maven - os-maven-plugin - 1.7.0 - - - - - org.xolstice.maven.plugins - protobuf-maven-plugin - ${protobuf-plugin.version} - - com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier} - grpc-java - io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier} - - - - - compile - compile-custom - - - - - - - - - 3.19.2 - 0.6.1 - 1.43.2 - 2.13.1.RELEASE - 1.5.1 - 1.3.5 - 1.6.2 - 3.3.2 - - \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-graphql/src/main/resources/application-chooseapi.yml b/spring-boot-modules/spring-boot-graphql/src/main/resources/application-chooseapi.yml index 889842df9f..0036bb3284 100644 --- a/spring-boot-modules/spring-boot-graphql/src/main/resources/application-chooseapi.yml +++ b/spring-boot-modules/spring-boot-graphql/src/main/resources/application-chooseapi.yml @@ -2,8 +2,10 @@ server: port: 8082 spring: + main: + allow-bean-definition-overriding: true graphql: graphiql: enabled: true schema: - locations: classpath:chooseapi/ \ No newline at end of file + locations: classpath:chooseapi/ diff --git a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/controllers/BooksControllerGraphQLIntegrationTest.java b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/controllers/BooksControllerGraphQLIntegrationTest.java index c1ce711388..48ed73fbde 100644 --- a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/controllers/BooksControllerGraphQLIntegrationTest.java +++ b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/controllers/BooksControllerGraphQLIntegrationTest.java @@ -11,7 +11,9 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = ChooseApiApp.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + properties = { "grpc.server.port=-1" }, // Disable gRPC external server + classes = ChooseApiApp.class) @ActiveProfiles("chooseapi") class BooksControllerGraphQLIntegrationTest { diff --git a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/controllers/BooksControllerRestIntegrationTest.java b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/controllers/BooksControllerRestIntegrationTest.java index 977a132653..4f2f8e8e51 100644 --- a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/controllers/BooksControllerRestIntegrationTest.java +++ b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/chooseapi/controllers/BooksControllerRestIntegrationTest.java @@ -9,13 +9,15 @@ 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 java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -@SpringBootTest +@SpringBootTest(properties = { "grpc.server.port=-1" }) // Disable gRPC external server +@ActiveProfiles("chooseapi") @AutoConfigureMockMvc class BooksControllerRestIntegrationTest { From 9d4f599a1a399d80b7ba8f8f2b07e368135b87a4 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 4 Jan 2023 15:29:16 +0000 Subject: [PATCH 212/592] [JAVA-16834] Added test case (#13192) Co-authored-by: panagiotiskakos --- .../listassert/OrderAgnosticListComparisonUnitTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/testing-modules/testing-assertions/src/test/java/com/baeldung/listassert/OrderAgnosticListComparisonUnitTest.java b/testing-modules/testing-assertions/src/test/java/com/baeldung/listassert/OrderAgnosticListComparisonUnitTest.java index bf278cea90..58b80ff07e 100644 --- a/testing-modules/testing-assertions/src/test/java/com/baeldung/listassert/OrderAgnosticListComparisonUnitTest.java +++ b/testing-modules/testing-assertions/src/test/java/com/baeldung/listassert/OrderAgnosticListComparisonUnitTest.java @@ -51,4 +51,12 @@ public class OrderAgnosticListComparisonUnitTest { assertThat(a).hasSameElementsAs(b); } + + @Test + void whenTestingForOrderAgnosticEqualityWithDuplicateElementsBothList_ShouldBeEqual() { + List a = Arrays.asList("a", "a", "b", "c"); + List b = Arrays.asList("a", "b", "a", "c"); + + assertThat(a).containsExactlyInAnyOrderElementsOf(b); + } } From f28c9a79b835677dd8bb04c48208d5c31122716f Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 4 Jan 2023 23:10:33 +0530 Subject: [PATCH 213/592] JAVA-14987 Added missing code and split the code in packages (#13238) - Split the code in respective packages - Added missing codes --- .../spring-cloud-stream-kinesis/pom.xml | 84 +++++++++++-------- .../java/com/baeldung/KinesisApplication.java | 53 ------------ .../com/baeldung/binder/ConsumerBinder.java | 16 ++++ .../binder/KinesisBinderApplication.java | 12 +++ .../com/baeldung/binder/ProducerBinder.java | 24 ++++++ .../baeldung/{ => kclkpl}/IpProcessor.java | 2 +- .../{ => kclkpl}/IpProcessorFactory.java | 2 +- .../java/com/baeldung/kclkpl/IpProducer.java | 30 +++++++ .../kclkpl/KinesisKCLApplication.java | 48 +++++++++++ .../kclkpl/KinesisKPLApplication.java | 38 +++++++++ .../{IpConsumer.java => sdk/ConsumerSDK.java} | 15 +--- .../baeldung/sdk/KinesisSDKApplication.java | 35 ++++++++ .../{IpProducer.java => sdk/ProducerSDK.java} | 16 +--- .../src/main/resources/application.properties | 12 +-- .../KinesisApplicationManualTest.java | 4 +- .../src/test/resources/application.properties | 12 +-- 16 files changed, 274 insertions(+), 129 deletions(-) delete mode 100644 spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java create mode 100644 spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/ConsumerBinder.java create mode 100644 spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/KinesisBinderApplication.java create mode 100644 spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/ProducerBinder.java rename spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/{ => kclkpl}/IpProcessor.java (96%) rename spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/{ => kclkpl}/IpProcessorFactory.java (92%) create mode 100644 spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/IpProducer.java create mode 100644 spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/KinesisKCLApplication.java create mode 100644 spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/KinesisKPLApplication.java rename spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/{IpConsumer.java => sdk/ConsumerSDK.java} (82%) create mode 100644 spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/sdk/KinesisSDKApplication.java rename spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/{IpProducer.java => sdk/ProducerSDK.java} (72%) diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml index c7d3f5d12c..397f06399f 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml @@ -1,44 +1,54 @@ - 4.0.0 - spring-cloud-stream-kinesis - spring-cloud-stream-kinesis + 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-cloud-stream-kinesis + spring-cloud-stream-kinesis - - com.baeldung - spring-cloud-stream - 1.0.0-SNAPSHOT - + + com.baeldung + spring-cloud-stream + 1.0.0-SNAPSHOT + - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.cloud - spring-cloud-stream-binder-kinesis - ${spring-cloud-stream-kinesis-binder.version} - - - com.amazonaws - aws-java-sdk-kinesis - ${aws-sdk.version} - - - org.springframework.cloud - spring-cloud-stream-test-support - ${spring-cloud-stream-test.version} - test - - + + + org.springframework.boot + spring-boot-starter-web + + + com.amazonaws + aws-java-sdk-kinesis + ${aws-sdk.version} + + + org.springframework.cloud + spring-cloud-stream-test-support + ${spring-cloud-stream-test.version} + test + + + com.amazonaws + amazon-kinesis-producer + 0.13.1 + + + com.amazonaws + amazon-kinesis-client + 1.11.2 + + + org.springframework.cloud + spring-cloud-stream-binder-kinesis + ${spring-cloud-stream-kinesis-binder.version} + + - - 1.11.632 - 2.0.2.RELEASE - 2.2.1.RELEASE - + + 1.11.632 + 2.0.2.RELEASE + 2.2.1.RELEASE + \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java deleted file mode 100644 index 6926560244..0000000000 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.baeldung; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.stream.annotation.EnableBinding; -import org.springframework.cloud.stream.annotation.StreamListener; -import org.springframework.cloud.stream.messaging.Processor; -import org.springframework.context.annotation.Bean; -import org.springframework.messaging.support.MessageBuilder; - -import com.amazonaws.auth.AWSStaticCredentialsProvider; -import com.amazonaws.auth.BasicAWSCredentials; -import com.amazonaws.regions.Regions; -import com.amazonaws.services.kinesis.AmazonKinesis; -import com.amazonaws.services.kinesis.AmazonKinesisClientBuilder; - -@SpringBootApplication -@EnableBinding(Processor.class) -public class KinesisApplication { - - @Value("${aws.access.key}") - private String accessKey; - - @Value("${aws.secret.key}") - private String secretKey; - - @Autowired - private Processor processor; - - public static void main(String[] args) { - SpringApplication.run(KinesisApplication.class, args); - } - - @Bean - public AmazonKinesis buildAmazonKinesis() { - BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey); - return AmazonKinesisClientBuilder.standard() - .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)) - .withRegion(Regions.EU_CENTRAL_1) - .build(); - } - - @StreamListener(Processor.INPUT) - public void consume(String val) { - System.out.println(val); - } - - public void produce(String val) { - processor.output().send(MessageBuilder.withPayload(val).build()); - } -} \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/ConsumerBinder.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/ConsumerBinder.java new file mode 100644 index 0000000000..38ad634086 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/ConsumerBinder.java @@ -0,0 +1,16 @@ +package com.baeldung.binder; + +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.StreamListener; +import org.springframework.cloud.stream.messaging.Sink; +import org.springframework.stereotype.Component; + +@Component +@EnableBinding(Sink.class) +public class ConsumerBinder { + + @StreamListener(Sink.INPUT) + public void consume(String ip) { + System.out.println(ip); + } +} \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/KinesisBinderApplication.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/KinesisBinderApplication.java new file mode 100644 index 0000000000..e4f6916ed9 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/KinesisBinderApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.binder; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class KinesisBinderApplication { + + public static void main(String[] args) { + SpringApplication.run(KinesisBinderApplication.class, args); + } +} \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/ProducerBinder.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/ProducerBinder.java new file mode 100644 index 0000000000..468f2886de --- /dev/null +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/ProducerBinder.java @@ -0,0 +1,24 @@ +package com.baeldung.binder; + +import java.util.stream.IntStream; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.messaging.Source; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@EnableBinding(Source.class) +public class ProducerBinder { + + @Autowired + private Source source; + + @Scheduled(fixedDelay = 3000L) + private void produce() { + IntStream.range(1, 200).mapToObj(ipSuffix -> "192.168.0." + ipSuffix) + .forEach(entry -> source.output().send(MessageBuilder.withPayload(entry).build())); + } +} \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProcessor.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/IpProcessor.java similarity index 96% rename from spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProcessor.java rename to spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/IpProcessor.java index 32e6babc86..c028f530dc 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProcessor.java +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/IpProcessor.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.kclkpl; import com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IRecordProcessor; import com.amazonaws.services.kinesis.clientlibrary.types.InitializationInput; diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProcessorFactory.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/IpProcessorFactory.java similarity index 92% rename from spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProcessorFactory.java rename to spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/IpProcessorFactory.java index 1ca774bb39..7515e65eff 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProcessorFactory.java +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/IpProcessorFactory.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.kclkpl; import com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IRecordProcessor; import com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IRecordProcessorFactory; diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/IpProducer.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/IpProducer.java new file mode 100644 index 0000000000..76111cfe57 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/IpProducer.java @@ -0,0 +1,30 @@ +package com.baeldung.kclkpl; + +import java.nio.ByteBuffer; +import java.util.stream.IntStream; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import com.amazonaws.services.kinesis.producer.KinesisProducer; + +@Component +public class IpProducer { + + @Value("${ips.stream}") + private String IPS_STREAM; + + @Value("${ips.partition.key}") + private String IPS_PARTITION_KEY; + + @Autowired + private KinesisProducer kinesisProducer; + + @Scheduled(fixedDelay = 3000L) + private void produce() { + IntStream.range(1, 200).mapToObj(ipSuffix -> ByteBuffer.wrap(("192.168.0." + ipSuffix).getBytes())) + .forEach(entry -> kinesisProducer.addUserRecord(IPS_STREAM, IPS_PARTITION_KEY, entry)); + } +} \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/KinesisKCLApplication.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/KinesisKCLApplication.java new file mode 100644 index 0000000000..01c5af596d --- /dev/null +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/KinesisKCLApplication.java @@ -0,0 +1,48 @@ +package com.baeldung.kclkpl; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.regions.Regions; +import com.amazonaws.services.kinesis.clientlibrary.lib.worker.KinesisClientLibConfiguration; +import com.amazonaws.services.kinesis.clientlibrary.lib.worker.Worker; + +@SpringBootApplication +public class KinesisKCLApplication implements ApplicationRunner { + + @Value("${aws.access.key}") + private String accessKey; + + @Value("${aws.secret.key}") + private String secretKey; + + @Value("${ips.stream}") + private String IPS_STREAM; + + public static void main(String[] args) { + SpringApplication.run(KinesisKCLApplication.class, args); + } + + @Override + public void run(ApplicationArguments args) throws Exception { + BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey); + KinesisClientLibConfiguration consumerConfig = new KinesisClientLibConfiguration( + "KinesisKCLConsumer", + IPS_STREAM, + new AWSStaticCredentialsProvider(awsCredentials), + "KinesisKCLConsumer") + .withRegionName(Regions.EU_CENTRAL_1.getName()); + + new Worker.Builder() + .recordProcessorFactory(new IpProcessorFactory()) + .config(consumerConfig) + .build() + .run(); + } + +} \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/KinesisKPLApplication.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/KinesisKPLApplication.java new file mode 100644 index 0000000000..4ff7cf8087 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/KinesisKPLApplication.java @@ -0,0 +1,38 @@ +package com.baeldung.kclkpl; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; + +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.regions.Regions; +import com.amazonaws.services.kinesis.producer.KinesisProducer; +import com.amazonaws.services.kinesis.producer.KinesisProducerConfiguration; + +@SpringBootApplication +public class KinesisKPLApplication { + + @Value("${aws.access.key}") + private String accessKey; + + @Value("${aws.secret.key}") + private String secretKey; + + public static void main(String[] args) { + SpringApplication.run(KinesisKPLApplication.class, args); + } + + @Bean + public KinesisProducer kinesisProducer() { + BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey); + KinesisProducerConfiguration producerConfig = new KinesisProducerConfiguration() + .setCredentialsProvider(new AWSStaticCredentialsProvider(awsCredentials)) + .setVerifyCertificate(false) + .setRegion(Regions.EU_CENTRAL_1.getName()); + + return new KinesisProducer(producerConfig); + } + +} \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpConsumer.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/sdk/ConsumerSDK.java similarity index 82% rename from spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpConsumer.java rename to spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/sdk/ConsumerSDK.java index 949787b687..d95d66b75a 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpConsumer.java +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/sdk/ConsumerSDK.java @@ -1,12 +1,9 @@ -package com.baeldung; +package com.baeldung.sdk; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.cloud.stream.annotation.EnableBinding; -import org.springframework.cloud.stream.annotation.StreamListener; -import org.springframework.cloud.stream.messaging.Sink; import org.springframework.stereotype.Component; import com.amazonaws.services.kinesis.AmazonKinesis; @@ -17,8 +14,7 @@ import com.amazonaws.services.kinesis.model.GetShardIteratorResult; import com.amazonaws.services.kinesis.model.ShardIteratorType; @Component -@EnableBinding(Sink.class) -public class IpConsumer { +public class ConsumerSDK { @Value("${ips.stream}") private String IPS_STREAM; @@ -31,12 +27,7 @@ public class IpConsumer { private GetShardIteratorResult shardIterator; - @StreamListener(Sink.INPUT) - public void consume(String ip) { - System.out.println(ip); - } - - private void consumeWithKinesis() { + public void consumeWithKinesis() { GetRecordsRequest recordsRequest = new GetRecordsRequest(); recordsRequest.setShardIterator(shardIterator.getShardIterator()); recordsRequest.setLimit(25); diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/sdk/KinesisSDKApplication.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/sdk/KinesisSDKApplication.java new file mode 100644 index 0000000000..28901c0723 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/sdk/KinesisSDKApplication.java @@ -0,0 +1,35 @@ +package com.baeldung.sdk; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; + +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.regions.Regions; +import com.amazonaws.services.kinesis.AmazonKinesis; +import com.amazonaws.services.kinesis.AmazonKinesisClientBuilder; + +@SpringBootApplication +public class KinesisSDKApplication { + + @Value("${aws.access.key}") + private String accessKey; + + @Value("${aws.secret.key}") + private String secretKey; + + public static void main(String[] args) { + SpringApplication.run(KinesisSDKApplication.class, args); + } + + @Bean + public AmazonKinesis buildAmazonKinesis() { + BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey); + return AmazonKinesisClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)) + .withRegion(Regions.EU_CENTRAL_1) + .build(); + } +} \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProducer.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/sdk/ProducerSDK.java similarity index 72% rename from spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProducer.java rename to spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/sdk/ProducerSDK.java index f59b2161f9..76ece8ddb7 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/IpProducer.java +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/sdk/ProducerSDK.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.sdk; import java.nio.ByteBuffer; import java.util.List; @@ -7,9 +7,6 @@ import java.util.stream.IntStream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.cloud.stream.annotation.EnableBinding; -import org.springframework.cloud.stream.messaging.Source; -import org.springframework.messaging.support.MessageBuilder; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -18,8 +15,7 @@ import com.amazonaws.services.kinesis.model.PutRecordsRequest; import com.amazonaws.services.kinesis.model.PutRecordsRequestEntry; @Component -@EnableBinding(Source.class) -public class IpProducer { +public class ProducerSDK { @Value("${ips.partition.key}") private String IPS_PARTITION_KEY; @@ -27,17 +23,9 @@ public class IpProducer { @Value("${ips.stream}") private String IPS_STREAM; - @Autowired - private Source source; @Autowired private AmazonKinesis kinesis; - @Scheduled(fixedDelay = 3000L) - private void produce() { - IntStream.range(1, 200).mapToObj(ipSuffix -> "192.168.0." + ipSuffix) - .forEach(entry -> source.output().send(MessageBuilder.withPayload(entry).build())); - } - @Scheduled(fixedDelay = 3000L) private void produceWithKinesis() { List entries = IntStream.range(1, 200).mapToObj(ipSuffix -> { diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties index 1943766c26..777abef1cc 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties @@ -1,6 +1,12 @@ +# configurations for AWS SDK consumer and producer aws.access.key=my-aws-access-key-goes-here aws.secret.key=my-aws-secret-key-goes-here +ips.partition.key=ips-partition-key +ips.stream=ips-stream +ips.shard.id=1 + +# configurations for Spring Cloud Stream Kineses Binder consumer and producer cloud.aws.credentials.access-key=my-aws-access-key cloud.aws.credentials.secret-key=my-aws-secret-key cloud.aws.region.static=eu-central-1 @@ -11,8 +17,4 @@ spring.cloud.stream.bindings.input.group=live-ips-group spring.cloud.stream.bindings.input.content-type=text/plain spring.cloud.stream.bindings.output.destination=myStream -spring.cloud.stream.bindings.output.content-type=text/plain - -ips.partition.key=ips-partition-key -ips.stream=ips-stream -ips.shard.id=1 \ No newline at end of file +spring.cloud.stream.bindings.output.content-type=text/plain \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationManualTest.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationManualTest.java index a232d29be5..bbe871ea11 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationManualTest.java +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationManualTest.java @@ -5,11 +5,13 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.kclkpl.KinesisKPLApplication; + /** * Manual Test - this test needs correct AWS Access Key and Secret to build the Amazon Kinesis and complete successfully */ @RunWith(SpringRunner.class) -@SpringBootTest(classes = KinesisApplication.class) +@SpringBootTest(classes = KinesisKPLApplication.class) public class KinesisApplicationManualTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties index 1943766c26..777abef1cc 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties @@ -1,6 +1,12 @@ +# configurations for AWS SDK consumer and producer aws.access.key=my-aws-access-key-goes-here aws.secret.key=my-aws-secret-key-goes-here +ips.partition.key=ips-partition-key +ips.stream=ips-stream +ips.shard.id=1 + +# configurations for Spring Cloud Stream Kineses Binder consumer and producer cloud.aws.credentials.access-key=my-aws-access-key cloud.aws.credentials.secret-key=my-aws-secret-key cloud.aws.region.static=eu-central-1 @@ -11,8 +17,4 @@ spring.cloud.stream.bindings.input.group=live-ips-group spring.cloud.stream.bindings.input.content-type=text/plain spring.cloud.stream.bindings.output.destination=myStream -spring.cloud.stream.bindings.output.content-type=text/plain - -ips.partition.key=ips-partition-key -ips.stream=ips-stream -ips.shard.id=1 \ No newline at end of file +spring.cloud.stream.bindings.output.content-type=text/plain \ No newline at end of file From f63772f5e46f93e6bbffd1a371fc7b6c6f89a686 Mon Sep 17 00:00:00 2001 From: lucaCambi77 Date: Thu, 5 Jan 2023 04:34:13 +0100 Subject: [PATCH 214/592] [ BAEL-5987 ] - Difference Between JPA and Spring Data JPA (#13209) * feat: add jpa - spring data difference examples * fix: remove _ from package name --- .../spring-data-jpa-repo-2/pom.xml | 61 +++++- .../model/Employee.java | 76 +++++++ .../config/SpringDataJpaConfig.java | 66 ++++++ .../repository/EmployeeRepository.java | 19 ++ .../EmployeeRepositoryPagingAndSort.java | 11 + .../JpaDaoIntegrationTest.java | 201 ++++++++++++++++++ .../SpringDataJpaIntegrationTest.java | 153 +++++++++++++ .../springdatajpadifference/TestUtils.java | 15 ++ .../test/resources/META-INF/persistence.xml | 21 ++ 9 files changed, 621 insertions(+), 2 deletions(-) create mode 100644 persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/model/Employee.java create mode 100644 persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/config/SpringDataJpaConfig.java create mode 100644 persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/repository/EmployeeRepository.java create mode 100644 persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/repository/EmployeeRepositoryPagingAndSort.java create mode 100644 persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/springdatajpadifference/JpaDaoIntegrationTest.java create mode 100644 persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/springdatajpadifference/SpringDataJpaIntegrationTest.java create mode 100644 persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/springdatajpadifference/TestUtils.java create mode 100644 persistence-modules/spring-data-jpa-repo-2/src/test/resources/META-INF/persistence.xml diff --git a/persistence-modules/spring-data-jpa-repo-2/pom.xml b/persistence-modules/spring-data-jpa-repo-2/pom.xml index 9240a00ee2..dd0406eca8 100644 --- a/persistence-modules/spring-data-jpa-repo-2/pom.xml +++ b/persistence-modules/spring-data-jpa-repo-2/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-data-jpa-repo-2 spring-data-jpa-repo-2 @@ -34,6 +34,14 @@ com.h2database h2 + + com.querydsl + querydsl-apt + + + com.querydsl + querydsl-jpa + com.google.guava guava @@ -41,4 +49,53 @@ + + + + com.mysema.maven + apt-maven-plugin + 1.1.3 + + + generate-sources + + process + + + ${project.build.directory}/generated-sources + com.querydsl.apt.jpa.JPAAnnotationProcessor + + + + + + org.bsc.maven + maven-processor-plugin + 3.3.3 + + + process + + process + + generate-sources + + ${project.build.directory}/generated-sources + + org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor + + + + + + + org.hibernate + hibernate-jpamodelgen + 5.6.11.Final + + + + + + \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/model/Employee.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/model/Employee.java new file mode 100644 index 0000000000..9690bcf68a --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/model/Employee.java @@ -0,0 +1,76 @@ +package com.baeldung.spring.data.persistence.springdatajpadifference.model; + +import java.io.Serializable; +import java.util.Objects; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.NamedQuery; +import javax.persistence.Table; + +@Entity +@Table(name = "employee") +@NamedQuery(name = "Employee.findById", query = "SELECT e FROM Employee e WHERE e.id = :id") +public class Employee implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + @Column(nullable = false) + private String firstName; + @Column(nullable = false) + private String lastName; + + @Column(nullable = false) + private String email; + + 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 getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Employee employee = (Employee) o; + return Objects.equals(id, employee.id) && Objects.equals(firstName, employee.firstName) && Objects.equals(lastName, employee.lastName) && Objects.equals(email, employee.email); + } + + @Override + public int hashCode() { + return Objects.hash(id, firstName, lastName, email); + } +} diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/config/SpringDataJpaConfig.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/config/SpringDataJpaConfig.java new file mode 100644 index 0000000000..57f9d2981f --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/config/SpringDataJpaConfig.java @@ -0,0 +1,66 @@ +package com.baeldung.spring.data.persistence.springdatajpadifference.springdata.config; + +import java.util.Properties; + +import javax.persistence.EntityManager; +import javax.sql.DataSource; + +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.JpaVendorAdapter; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import com.baeldung.spring.data.persistence.springdatajpadifference.springdata.repository.EmployeeRepository; +import com.querydsl.jpa.impl.JPAQueryFactory; + +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories(basePackageClasses = EmployeeRepository.class) +public class SpringDataJpaConfig { + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { + LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); + em.setDataSource(dataSource); + em.setPackagesToScan("com.baeldung.spring.data.persistence.springdata_jpa_difference.model"); + + JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + em.setJpaVendorAdapter(vendorAdapter); + + Properties properties = new Properties(); + properties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); + properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); + + em.setJpaProperties(properties); + + return em; + } + + @Bean + public PlatformTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean entityManagerFactoryBean) { + JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(entityManagerFactoryBean.getObject()); + return transactionManager; + } + + @Bean + public DataSource dataSource() { + return DataSourceBuilder.create() + .url("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1") + .driverClassName("org.h2.Driver") + .username("sa") + .password("sa") + .build(); + } + + @Bean + public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) { + return new JPAQueryFactory((entityManager)); + } +} diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/repository/EmployeeRepository.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/repository/EmployeeRepository.java new file mode 100644 index 0000000000..012a46d885 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/repository/EmployeeRepository.java @@ -0,0 +1,19 @@ +package com.baeldung.spring.data.persistence.springdatajpadifference.springdata.repository; + +import java.util.List; + +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import com.baeldung.spring.data.persistence.springdatajpadifference.model.Employee; + +@Repository +public interface EmployeeRepository extends JpaRepository { + + List findByFirstName(String firstName); + + @Query(value = "SELECT e FROM Employee e") + List findAllEmployee(Sort sort); +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/repository/EmployeeRepositoryPagingAndSort.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/repository/EmployeeRepositoryPagingAndSort.java new file mode 100644 index 0000000000..731735ea62 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/repository/EmployeeRepositoryPagingAndSort.java @@ -0,0 +1,11 @@ +package com.baeldung.spring.data.persistence.springdatajpadifference.springdata.repository; + +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.stereotype.Repository; + +import com.baeldung.spring.data.persistence.springdatajpadifference.model.Employee; + +@Repository +public interface EmployeeRepositoryPagingAndSort extends PagingAndSortingRepository { + +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/springdatajpadifference/JpaDaoIntegrationTest.java b/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/springdatajpadifference/JpaDaoIntegrationTest.java new file mode 100644 index 0000000000..b25038f175 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/springdatajpadifference/JpaDaoIntegrationTest.java @@ -0,0 +1,201 @@ +package com.baeldung.spring.data.persistence.springdatajpadifference; + +import static com.baeldung.spring.data.persistence.springdatajpadifference.TestUtils.employee; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import java.util.Arrays; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.persistence.Query; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.CriteriaUpdate; +import javax.persistence.criteria.Root; + +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.spring.data.persistence.springdatajpadifference.model.Employee; +import com.baeldung.spring.data.persistence.springdatajpadifference.model.Employee_; + +public class JpaDaoIntegrationTest { + + private final EntityManagerFactory emf = Persistence.createEntityManagerFactory("pu-test"); + private final EntityManager entityManager = emf.createEntityManager(); + + @Before + public void setup() { + deleteAllEmployees(); + } + + @Test + public void givenPersistedEmployee_whenFindById_thenEmployeeIsFound() { + Employee employee = employee("John", "Doe"); + save(employee); + + assertEquals(employee, entityManager.find(Employee.class, employee.getId())); + } + + @Test + public void givenPersistedEmployee_whenFindByIdCriteriaQuery_thenEmployeeIsFound() { + Employee employee = employee("John", "Doe"); + save(employee); + + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Employee.class); + Root root = criteriaQuery.from(Employee.class); + criteriaQuery.select(root); + + criteriaQuery.where(criteriaBuilder.equal(root.get(Employee_.ID), employee.getId())); + + assertEquals(employee, entityManager.createQuery(criteriaQuery) + .getSingleResult()); + } + + @Test + public void givenPersistedEmployee_whenFindByIdJpql_thenEmployeeIsFound() { + Employee employee = employee("John", "Doe"); + save(employee); + + Query jpqlQuery = entityManager.createQuery("SELECT e from Employee e WHERE e.id=:id"); + jpqlQuery.setParameter("id", employee.getId()); + + assertEquals(employee, jpqlQuery.getSingleResult()); + } + + @Test + public void givenPersistedEmployee_whenFindByIdNamedQuery_thenEmployeeIsFound() { + Employee employee = employee("John", "Doe"); + save(employee); + + Query query = entityManager.createNamedQuery("Employee.findById"); + + query.setParameter(Employee_.ID, employee.getId()); + + assertEquals(employee, query.getSingleResult()); + } + + @Test + public void givenPersistedEmployee_whenFindWithPaginationAndSort_thenEmployeesAreFound() { + Employee john = employee("John", "Doe"); + Employee bob = employee("Bob", "Smith"); + Employee frank = employee("Frank", "Brown"); + Employee james = employee("James", "Smith"); + save(john); + save(bob); + save(frank); + save(james); + + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Employee.class); + Root root = criteriaQuery.from(Employee.class); + criteriaQuery.select(root); + criteriaQuery.orderBy(criteriaBuilder.asc(root.get(Employee_.FIRST_NAME))); + + TypedQuery query = entityManager.createQuery(criteriaQuery); + + query.setFirstResult(0); + query.setMaxResults(3); + + List employeeList = query.getResultList(); + + assertEquals(Arrays.asList(bob, frank, james), employeeList); + } + + @Test + public void givenPersistedEmployee_whenUpdateEmployeeEmail_thenEmployeeHasUpdatedEmail() { + Employee employee = employee("John", "Doe"); + save(employee); + + Employee employeeToUpdate = entityManager.find(Employee.class, employee.getId()); + + String updatedEmail = "email@gmail.com"; + + employeeToUpdate.setEmail(updatedEmail); + + update(employeeToUpdate); + + assertEquals(updatedEmail, entityManager.find(Employee.class, employee.getId()) + .getEmail()); + } + + @Test + public void givenPersistedEmployee_whenUpdateEmployeeEmailWithCriteria_thenEmployeeHasUpdatedEmail() { + Employee employee = employee("John", "Doe"); + save(employee); + + String updatedEmail = "email@gmail.com"; + + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); + CriteriaUpdate criteriaUpdate = criteriaBuilder.createCriteriaUpdate(Employee.class); + Root root = criteriaUpdate.from(Employee.class); + + criteriaUpdate.set(Employee_.EMAIL, updatedEmail); + criteriaUpdate.where(criteriaBuilder.equal(root.get(Employee_.ID), employee.getId())); + + assertEquals(1, update(criteriaUpdate)); + + assertEquals(updatedEmail, entityManager.find(Employee.class, employee.getId()) + .getEmail()); + } + + @Test + public void givenPersistedEmployee_whenRemoveEmployee_thenNoEmployeeIsFound() { + Employee employee = employee("John", "Doe"); + save(employee); + + delete(employee.getId()); + + assertNull(entityManager.find(Employee.class, employee.getId())); + } + + private void deleteAllEmployees() { + entityManager.getTransaction() + .begin(); + entityManager.createNativeQuery("DELETE from Employee") + .executeUpdate(); + entityManager.getTransaction() + .commit(); + } + + public void save(Employee entity) { + entityManager.getTransaction() + .begin(); + entityManager.persist(entity); + entityManager.getTransaction() + .commit(); + } + + public void update(Employee entity) { + entityManager.getTransaction() + .begin(); + entityManager.merge(entity); + entityManager.getTransaction() + .commit(); + } + + public void delete(Long employee) { + entityManager.getTransaction() + .begin(); + entityManager.remove(entityManager.find(Employee.class, employee)); + entityManager.getTransaction() + .commit(); + } + + public int update(CriteriaUpdate criteriaUpdate) { + entityManager.getTransaction() + .begin(); + int result = entityManager.createQuery(criteriaUpdate) + .executeUpdate(); + entityManager.getTransaction() + .commit(); + entityManager.clear(); + + return result; + } +} diff --git a/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/springdatajpadifference/SpringDataJpaIntegrationTest.java b/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/springdatajpadifference/SpringDataJpaIntegrationTest.java new file mode 100644 index 0000000000..e6febdc9f1 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/springdatajpadifference/SpringDataJpaIntegrationTest.java @@ -0,0 +1,153 @@ +package com.baeldung.spring.data.persistence.springdatajpadifference; + +import static com.baeldung.spring.data.persistence.springdatajpadifference.TestUtils.employee; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.test.annotation.Rollback; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +import com.baeldung.spring.data.persistence.springdatajpadifference.model.Employee; +import com.baeldung.spring.data.persistence.springdatajpadifference.model.QEmployee; +import com.baeldung.spring.data.persistence.springdatajpadifference.springdata.config.SpringDataJpaConfig; +import com.baeldung.spring.data.persistence.springdatajpadifference.springdata.repository.EmployeeRepository; +import com.baeldung.spring.data.persistence.springdatajpadifference.springdata.repository.EmployeeRepositoryPagingAndSort; +import com.querydsl.jpa.impl.JPAQueryFactory; + +@ContextConfiguration(classes = SpringDataJpaConfig.class) +@RunWith(SpringJUnit4ClassRunner.class) +@Transactional +@Rollback +public class SpringDataJpaIntegrationTest { + + @Autowired + private EmployeeRepository employeeRepository; + + @Autowired + private EmployeeRepositoryPagingAndSort employeeRepositoryPagingAndSort; + + @Autowired + private JPAQueryFactory jpaQueryFactory; + + @Test + public void givenPersistedEmployee_whenFindById_thenEmployeeIsFound() { + Employee employee = employee("John", "Doe"); + + employeeRepository.save(employee); + + assertEquals(Optional.of(employee), employeeRepository.findById(employee.getId())); + } + + @Test + public void givenPersistedEmployee_whenFindByFirstName_thenEmployeeIsFound() { + Employee employee = employee("John", "Doe"); + + employeeRepository.save(employee); + + assertEquals(employee, employeeRepository.findByFirstName(employee.getFirstName()) + .get(0)); + } + + @Test + public void givenPersistedEmployee_whenUpdateEmployeeEmail_thenEmployeeHasUpdatedEmail() { + Employee employee = employee("John", "Doe"); + + employeeRepository.save(employee); + + Employee employeeToUpdate = employeeRepository.findById(employee.getId()) + .orElse(null); + + assertNotNull(employeeToUpdate); + assertEquals(employee, employeeToUpdate); + + String updatedEmail = "email@gmail.com"; + + employeeToUpdate.setEmail(updatedEmail); + + employeeRepository.save(employeeToUpdate); + + assertEquals(Optional.of(employeeToUpdate), employeeRepository.findById(employee.getId())); + } + + @Test + public void givenPersistedEmployee_whenRemoveEmployee_thenNoEmployeeIsFound() { + Employee employee = employee("John", "Doe"); + + employeeRepository.save(employee); + + Employee persistedEmployee = employeeRepository.findById(employee.getId()) + .orElse(null); + + assertNotNull(persistedEmployee); + + employeeRepository.delete(persistedEmployee); + + assertFalse(employeeRepository.findById(employee.getId()) + .isPresent()); + } + + @Test + public void givenPersistedEmployees_whenFindSortedByFirstName_thenEmployeeAreFoundInOrder() { + Employee john = employee("John", "Doe"); + Employee bob = employee("Bob", "Smith"); + Employee frank = employee("Frank", "Brown"); + + employeeRepository.saveAll(Arrays.asList(john, bob, frank)); + + List employees = employeeRepository.findAllEmployee(Sort.by("firstName")); + + assertEquals(3, employees.size()); + assertEquals(bob, employees.get(0)); + assertEquals(frank, employees.get(1)); + assertEquals(john, employees.get(2)); + } + + @Test + public void givenPersistedEmployee_whenFindByQueryDsl_thenEmployeeIsFound() { + Employee john = employee("John", "Doe"); + Employee frank = employee("Frank", "Doe"); + + employeeRepository.saveAll(Arrays.asList(john, frank)); + + QEmployee employeePath = QEmployee.employee; + + List employees = jpaQueryFactory.selectFrom(employeePath) + .where(employeePath.firstName.eq("John"), employeePath.lastName.eq("Doe")) + .fetch(); + + assertEquals(1, employees.size()); + assertEquals(john, employees.get(0)); + } + + @Test + public void givenPersistedEmployee_whenFindBySortAndPagingRepository_thenEmployeeAreFound() { + Employee john = employee("John", "Doe"); + Employee bob = employee("Bob", "Smith"); + Employee frank = employee("Frank", "Brown"); + Employee jimmy = employee("Jimmy", "Armstrong"); + + employeeRepositoryPagingAndSort.saveAll(Arrays.asList(john, bob, frank, jimmy)); + + Pageable pageable = PageRequest.of(0, 2, Sort.by("firstName")); + + Page employees = employeeRepositoryPagingAndSort.findAll(pageable); + + assertEquals(Arrays.asList(bob, frank), employees.get() + .collect(Collectors.toList())); + } +} diff --git a/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/springdatajpadifference/TestUtils.java b/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/springdatajpadifference/TestUtils.java new file mode 100644 index 0000000000..989a7db247 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/springdatajpadifference/TestUtils.java @@ -0,0 +1,15 @@ +package com.baeldung.spring.data.persistence.springdatajpadifference; + +import com.baeldung.spring.data.persistence.springdatajpadifference.model.Employee; + +public class TestUtils { + + public static Employee employee(String firstName, String lastname) { + Employee employee = new Employee(); + employee.setFirstName(firstName); + employee.setLastName(lastname); + employee.setEmail(firstName + lastname + "@baeldung.com"); + + return employee; + } +} diff --git a/persistence-modules/spring-data-jpa-repo-2/src/test/resources/META-INF/persistence.xml b/persistence-modules/spring-data-jpa-repo-2/src/test/resources/META-INF/persistence.xml new file mode 100644 index 0000000000..94df50cf0a --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-2/src/test/resources/META-INF/persistence.xml @@ -0,0 +1,21 @@ + + + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.spring.data.persistence.springdatajpadifference.model.Employee + + + + + + + + + + + + From ca9ab2e374396f72399ea7ada15dd684f023ce05 Mon Sep 17 00:00:00 2001 From: Uhrin Attila Date: Thu, 5 Jan 2023 09:03:10 +0100 Subject: [PATCH 215/592] Add Flyway out of order migration scripts --- .../db/out-of-order-migration/V1_0__create_city_table.sql | 5 +++++ .../db/out-of-order-migration/V1_1__add_zipcode_to_city.sql | 3 +++ .../db/out-of-order-migration/V2_0__create_person_table.sql | 5 +++++ 3 files changed, 13 insertions(+) create mode 100644 persistence-modules/flyway/db/out-of-order-migration/V1_0__create_city_table.sql create mode 100644 persistence-modules/flyway/db/out-of-order-migration/V1_1__add_zipcode_to_city.sql create mode 100644 persistence-modules/flyway/db/out-of-order-migration/V2_0__create_person_table.sql diff --git a/persistence-modules/flyway/db/out-of-order-migration/V1_0__create_city_table.sql b/persistence-modules/flyway/db/out-of-order-migration/V1_0__create_city_table.sql new file mode 100644 index 0000000000..1c45a12fac --- /dev/null +++ b/persistence-modules/flyway/db/out-of-order-migration/V1_0__create_city_table.sql @@ -0,0 +1,5 @@ +create table city ( + id numeric, + name varchar(50), + constraint pk_city primary key (id) +); \ No newline at end of file diff --git a/persistence-modules/flyway/db/out-of-order-migration/V1_1__add_zipcode_to_city.sql b/persistence-modules/flyway/db/out-of-order-migration/V1_1__add_zipcode_to_city.sql new file mode 100644 index 0000000000..a619097071 --- /dev/null +++ b/persistence-modules/flyway/db/out-of-order-migration/V1_1__add_zipcode_to_city.sql @@ -0,0 +1,3 @@ +alter table city add column ( + zip varchar(10) +); \ No newline at end of file diff --git a/persistence-modules/flyway/db/out-of-order-migration/V2_0__create_person_table.sql b/persistence-modules/flyway/db/out-of-order-migration/V2_0__create_person_table.sql new file mode 100644 index 0000000000..19aa5e2ac7 --- /dev/null +++ b/persistence-modules/flyway/db/out-of-order-migration/V2_0__create_person_table.sql @@ -0,0 +1,5 @@ +create table person ( + id numeric, + name varchar(50), + constraint pk_person primary key (id) +); \ No newline at end of file From 08dd5a6f909238c246fac239749352205660d992 Mon Sep 17 00:00:00 2001 From: Kapil Khandelwal Date: Fri, 6 Jan 2023 04:28:26 +0530 Subject: [PATCH 216/592] BAEL-4737:- Jenkins pipeline - change to another folder (#13242) --- .../change-directory-job/pipeline-dir-fullpath-job | 11 +++++++++++ .../change-directory-job/pipeline-dir-job | 11 +++++++++++ .../jenkins-jobs/change-directory-job/pipeline-sh-job | 10 ++++++++++ 3 files changed, 32 insertions(+) create mode 100644 jenkins-modules/jenkins-jobs/change-directory-job/pipeline-dir-fullpath-job create mode 100644 jenkins-modules/jenkins-jobs/change-directory-job/pipeline-dir-job create mode 100644 jenkins-modules/jenkins-jobs/change-directory-job/pipeline-sh-job diff --git a/jenkins-modules/jenkins-jobs/change-directory-job/pipeline-dir-fullpath-job b/jenkins-modules/jenkins-jobs/change-directory-job/pipeline-dir-fullpath-job new file mode 100644 index 0000000000..98dc32efe5 --- /dev/null +++ b/jenkins-modules/jenkins-jobs/change-directory-job/pipeline-dir-fullpath-job @@ -0,0 +1,11 @@ +pipeline { + agent any + stages { + stage('Build') { + steps { + dir('/var/jenkins_home/workspace/SamplePipeline/scripts') { + } + } + } + } +} diff --git a/jenkins-modules/jenkins-jobs/change-directory-job/pipeline-dir-job b/jenkins-modules/jenkins-jobs/change-directory-job/pipeline-dir-job new file mode 100644 index 0000000000..42a946ca49 --- /dev/null +++ b/jenkins-modules/jenkins-jobs/change-directory-job/pipeline-dir-job @@ -0,0 +1,11 @@ + pipeline { + agent any + stages { + stage('Build') { + steps { + dir('scripts') { + } + } + } + } +} diff --git a/jenkins-modules/jenkins-jobs/change-directory-job/pipeline-sh-job b/jenkins-modules/jenkins-jobs/change-directory-job/pipeline-sh-job new file mode 100644 index 0000000000..9b7f992b86 --- /dev/null +++ b/jenkins-modules/jenkins-jobs/change-directory-job/pipeline-sh-job @@ -0,0 +1,10 @@ +pipeline { + agent any + stages { + stage('Build') { + steps { + sh 'cd scripts' + } + } + } +} From 962ed719acd6edd5113f3b1602d1cab6d53d332e Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Fri, 6 Jan 2023 04:29:23 +0100 Subject: [PATCH 217/592] [clsTypeByString] get class object from a string (#13233) --- .../baeldung/getclassfromstr/MyNiceClass.java | 7 ++++++ .../GetClassObjectFromStringUnitTest.java | 22 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 core-java-modules/core-java-reflection/src/main/java/com/baeldung/getclassfromstr/MyNiceClass.java create mode 100644 core-java-modules/core-java-reflection/src/test/java/com/baeldung/getclassfromstr/GetClassObjectFromStringUnitTest.java diff --git a/core-java-modules/core-java-reflection/src/main/java/com/baeldung/getclassfromstr/MyNiceClass.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/getclassfromstr/MyNiceClass.java new file mode 100644 index 0000000000..c329421208 --- /dev/null +++ b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/getclassfromstr/MyNiceClass.java @@ -0,0 +1,7 @@ +package com.baeldung.getclassfromstr; + +public class MyNiceClass { + public String greeting(){ + return "Hi there, I wish you all the best!"; + } +} diff --git a/core-java-modules/core-java-reflection/src/test/java/com/baeldung/getclassfromstr/GetClassObjectFromStringUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/getclassfromstr/GetClassObjectFromStringUnitTest.java new file mode 100644 index 0000000000..f0e8022c02 --- /dev/null +++ b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/getclassfromstr/GetClassObjectFromStringUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.getclassfromstr; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class GetClassObjectFromStringUnitTest { + @Test + void givenQualifiedClsName_whenUsingClassForName_shouldGetExpectedClassObject() throws ReflectiveOperationException { + Class cls = Class.forName("com.baeldung.getclassfromstr.MyNiceClass"); + assertNotNull(cls); + + MyNiceClass myNiceObject = (MyNiceClass) cls.getDeclaredConstructor().newInstance(); + assertNotNull(myNiceObject); + assertEquals("Hi there, I wish you all the best!", myNiceObject.greeting()); + } + + @Test + void givenSimpleName_whenUsingClassForName_shouldGetExpectedException() { + assertThrows(ClassNotFoundException.class, () -> Class.forName("MyNiceClass")); + } +} From 0ce4cfcfda1e5046aacd53f4fd0f143492a4feea Mon Sep 17 00:00:00 2001 From: psevestre Date: Fri, 6 Jan 2023 15:37:59 -0300 Subject: [PATCH 218/592] BAEL 5974 - Guide to Sentry (#13244) * [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-5900] Initial commit * [BAEL-5974] Article Code * [BAEL-5974] Article Code --- saas-modules/pom.xml | 1 + saas-modules/sentry-servlet/pom.xml | 49 +++++++++++++++++++ .../sentry/servlet/FaultyServlet.java | 32 ++++++++++++ .../sentry/support/SentryContextListener.java | 39 +++++++++++++++ .../baeldung/sentry/support/SentryFilter.java | 32 ++++++++++++ .../src/main/resources/sentry.properties | 3 ++ .../src/main/webapp/WEB-INF/web.xml | 14 ++++++ .../sentry/servlet/FaultyServletLiveTest.java | 46 +++++++++++++++++ 8 files changed, 216 insertions(+) create mode 100644 saas-modules/sentry-servlet/pom.xml create mode 100644 saas-modules/sentry-servlet/src/main/java/com/baeldung/sentry/servlet/FaultyServlet.java create mode 100644 saas-modules/sentry-servlet/src/main/java/com/baeldung/sentry/support/SentryContextListener.java create mode 100644 saas-modules/sentry-servlet/src/main/java/com/baeldung/sentry/support/SentryFilter.java create mode 100644 saas-modules/sentry-servlet/src/main/resources/sentry.properties create mode 100644 saas-modules/sentry-servlet/src/main/webapp/WEB-INF/web.xml create mode 100644 saas-modules/sentry-servlet/src/test/java/com/baeldung/sentry/servlet/FaultyServletLiveTest.java diff --git a/saas-modules/pom.xml b/saas-modules/pom.xml index 7a626e7663..7e8adebdd9 100644 --- a/saas-modules/pom.xml +++ b/saas-modules/pom.xml @@ -20,6 +20,7 @@ stripe twilio twitter4j + sentry-servlet diff --git a/saas-modules/sentry-servlet/pom.xml b/saas-modules/sentry-servlet/pom.xml new file mode 100644 index 0000000000..c86fcbce03 --- /dev/null +++ b/saas-modules/sentry-servlet/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + com.baeldung + saas-modules + 1.0.0-SNAPSHOT + + sentry-servlet + sentry-servlet + war + + + 6.11.0 + 1.10.4 + + + + + io.sentry + sentry-servlet + ${sentry.version} + + + + javax.servlet + javax.servlet-api + provided + + + + + + + org.codehaus.cargo + cargo-maven3-plugin + ${cargo.version} + + + tomcat9x + embedded + + + + + + \ No newline at end of file diff --git a/saas-modules/sentry-servlet/src/main/java/com/baeldung/sentry/servlet/FaultyServlet.java b/saas-modules/sentry-servlet/src/main/java/com/baeldung/sentry/servlet/FaultyServlet.java new file mode 100644 index 0000000000..7a32094221 --- /dev/null +++ b/saas-modules/sentry-servlet/src/main/java/com/baeldung/sentry/servlet/FaultyServlet.java @@ -0,0 +1,32 @@ +package com.baeldung.sentry.servlet; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet(urlPatterns = "/fault", loadOnStartup = 1) +public class FaultyServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + String op = req.getParameter("op"); + if( "fault".equals(op) ) { + resp.sendError(500, "Something bad happened !"); + } + else if ( "exception".equals(op) ) { + throw new IllegalArgumentException("Internal error"); + } + else { + resp.setStatus(200); + resp.setContentType("text/plain"); + resp.getWriter().println("OK"); + } + } +} diff --git a/saas-modules/sentry-servlet/src/main/java/com/baeldung/sentry/support/SentryContextListener.java b/saas-modules/sentry-servlet/src/main/java/com/baeldung/sentry/support/SentryContextListener.java new file mode 100644 index 0000000000..6f25dd36aa --- /dev/null +++ b/saas-modules/sentry-servlet/src/main/java/com/baeldung/sentry/support/SentryContextListener.java @@ -0,0 +1,39 @@ +package com.baeldung.sentry.support; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.annotation.WebListener; + +import io.sentry.Sentry; +import io.sentry.SentryLevel; + +@WebListener +public class SentryContextListener implements ServletContextListener { + @Override + public void contextInitialized(ServletContextEvent sce) { + + // Besides standard supported locations, let's also allow the DSN to be + // passed using servlet container managed parameters. This can be useful if your app + // is hosted in a shared application server. + ServletContext context = sce.getServletContext(); + String sentryDsn = context.getInitParameter("sentry.dsn"); + + if ( sentryDsn != null ) { + context.log("[I21] sentry.dsn init parameter found. Configuring Sentry SDK..."); + Sentry.init(sentryDsn); + } + else { + context.log("[I25] sentry.dsn init parameter not found. Configuring Sentry SDK with defaults"); + Sentry.init(); + } + + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + sce.getServletContext().log("[I34] shutting down context"); + Sentry.captureMessage("[I35] contextDestroyed", SentryLevel.INFO); + Sentry.close(); + } +} diff --git a/saas-modules/sentry-servlet/src/main/java/com/baeldung/sentry/support/SentryFilter.java b/saas-modules/sentry-servlet/src/main/java/com/baeldung/sentry/support/SentryFilter.java new file mode 100644 index 0000000000..e853368ad9 --- /dev/null +++ b/saas-modules/sentry-servlet/src/main/java/com/baeldung/sentry/support/SentryFilter.java @@ -0,0 +1,32 @@ +package com.baeldung.sentry.support; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletResponse; + +import io.sentry.Sentry; +import io.sentry.SentryLevel; + +@WebFilter(urlPatterns = "/*") +public class SentryFilter implements Filter { + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + try { + chain.doFilter(request, response); + int rc = ((HttpServletResponse) response).getStatus(); + if (rc/100 == 5) { + Sentry.captureMessage("Application error: code=" + rc, SentryLevel.ERROR); + } + } catch (Throwable t) { + Sentry.captureException(t); + throw t; + } + } +} diff --git a/saas-modules/sentry-servlet/src/main/resources/sentry.properties b/saas-modules/sentry-servlet/src/main/resources/sentry.properties new file mode 100644 index 0000000000..c937874420 --- /dev/null +++ b/saas-modules/sentry-servlet/src/main/resources/sentry.properties @@ -0,0 +1,3 @@ +# Sentry configuration file +# put your DSN here +dsn=https://xxxxxxxxxxxxxxxx@zzzzzzz.ingest.sentry.io/wwww \ No newline at end of file diff --git a/saas-modules/sentry-servlet/src/main/webapp/WEB-INF/web.xml b/saas-modules/sentry-servlet/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..e89de5f352 --- /dev/null +++ b/saas-modules/sentry-servlet/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/saas-modules/sentry-servlet/src/test/java/com/baeldung/sentry/servlet/FaultyServletLiveTest.java b/saas-modules/sentry-servlet/src/test/java/com/baeldung/sentry/servlet/FaultyServletLiveTest.java new file mode 100644 index 0000000000..3db0d1c66e --- /dev/null +++ b/saas-modules/sentry-servlet/src/test/java/com/baeldung/sentry/servlet/FaultyServletLiveTest.java @@ -0,0 +1,46 @@ +package com.baeldung.sentry.servlet; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.net.HttpURLConnection; +import java.net.URL; + +import org.junit.jupiter.api.Test; + +class FaultyServletLiveTest { + + + @Test + void testGivenFaultyRequestWithNoQueryString_thenSuccess() throws Exception { + + //int port = getServerPort(); + URL u = new URL("http://localhost:8080/sentry-servlet/fault"); + HttpURLConnection conn = (HttpURLConnection)u.openConnection(); + int rc = conn.getResponseCode(); + assertThat(rc) + .isEqualTo(200); + } + + @Test + void testGivenFaultyRequestWithFaultString_thenFail() throws Exception { + + //int port = getServerPort(); + URL u = new URL("http://localhost:8080/sentry-servlet/fault?fault=true"); + HttpURLConnection conn = (HttpURLConnection)u.openConnection(); + int rc = conn.getResponseCode(); + assertThat(rc) + .isEqualTo(500); + } + + @Test + void testGivenFaultyRequestWithExceptionString_thenFail() throws Exception { + + //int port = getServerPort(); + URL u = new URL("http://localhost:8080/sentry-servlet/fault?exception=true"); + HttpURLConnection conn = (HttpURLConnection)u.openConnection(); + int rc = conn.getResponseCode(); + assertThat(rc) + .isEqualTo(500); + } + +} From 6d57bf1f6f946b16544a420d02e001734d87beae Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 7 Jan 2023 05:52:50 +0800 Subject: [PATCH 219/592] Delete README.md --- jenkins-modules/README.md | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 jenkins-modules/README.md diff --git a/jenkins-modules/README.md b/jenkins-modules/README.md deleted file mode 100644 index 5c0971321d..0000000000 --- a/jenkins-modules/README.md +++ /dev/null @@ -1,6 +0,0 @@ -## Jenkins - -This is an aggregator modules for Jenkins-related modules. - -## Relevant Articles -- [Trigger Another Job from a Jenkins Pipeline](https://www.baeldung.com/ops/jenkins-pipeline-trigger-new-job) From 0a9424696af7e22c445edc5ae412b197572123ba Mon Sep 17 00:00:00 2001 From: Kilian Schneider <48420258+Basler182@users.noreply.github.com> Date: Fri, 6 Jan 2023 23:12:38 +0100 Subject: [PATCH 220/592] feat BAEL-6092 Record Patterns (#13243) * feat BAEL-6092 Record Patterns * Update pom.xml * Update pom.xml * Add additional Switch Test Case --- core-java-modules/core-java-19/pom.xml | 33 +++++++ .../baeldung/features/records/GPSPoint.java | 3 + .../baeldung/features/records/ILocation.java | 9 ++ .../baeldung/features/records/Location.java | 5 + .../features/records/LocationWrapper.java | 3 + .../JEP405RecordPatternsUnitTest.java | 99 +++++++++++++++++++ core-java-modules/pom.xml | 2 +- pom.xml | 1 + 8 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 core-java-modules/core-java-19/pom.xml create mode 100644 core-java-modules/core-java-19/src/main/java/com/baeldung/features/records/GPSPoint.java create mode 100644 core-java-modules/core-java-19/src/main/java/com/baeldung/features/records/ILocation.java create mode 100644 core-java-modules/core-java-19/src/main/java/com/baeldung/features/records/Location.java create mode 100644 core-java-modules/core-java-19/src/main/java/com/baeldung/features/records/LocationWrapper.java create mode 100644 core-java-modules/core-java-19/src/test/java/com/baeldung/features/JEP405RecordPatternsUnitTest.java diff --git a/core-java-modules/core-java-19/pom.xml b/core-java-modules/core-java-19/pom.xml new file mode 100644 index 0000000000..096b13e679 --- /dev/null +++ b/core-java-modules/core-java-19/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + core-java-19 + + + 19 + 19 + UTF-8 + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 19 + 19 + --enable-preview + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-19/src/main/java/com/baeldung/features/records/GPSPoint.java b/core-java-modules/core-java-19/src/main/java/com/baeldung/features/records/GPSPoint.java new file mode 100644 index 0000000000..961575c88d --- /dev/null +++ b/core-java-modules/core-java-19/src/main/java/com/baeldung/features/records/GPSPoint.java @@ -0,0 +1,3 @@ +package com.baeldung.features.records; + +public record GPSPoint (double lat, double lng) { } \ No newline at end of file diff --git a/core-java-modules/core-java-19/src/main/java/com/baeldung/features/records/ILocation.java b/core-java-modules/core-java-19/src/main/java/com/baeldung/features/records/ILocation.java new file mode 100644 index 0000000000..00851c8d5e --- /dev/null +++ b/core-java-modules/core-java-19/src/main/java/com/baeldung/features/records/ILocation.java @@ -0,0 +1,9 @@ +package com.baeldung.features.records; + +public sealed interface ILocation permits Location { + default String getName() { + return switch (this) { + case Location(var name, var ignored) -> name; + }; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-19/src/main/java/com/baeldung/features/records/Location.java b/core-java-modules/core-java-19/src/main/java/com/baeldung/features/records/Location.java new file mode 100644 index 0000000000..fb50fbe645 --- /dev/null +++ b/core-java-modules/core-java-19/src/main/java/com/baeldung/features/records/Location.java @@ -0,0 +1,5 @@ +package com.baeldung.features.records; + +public record Location(String name, GPSPoint gpsPoint) implements ILocation { +} + diff --git a/core-java-modules/core-java-19/src/main/java/com/baeldung/features/records/LocationWrapper.java b/core-java-modules/core-java-19/src/main/java/com/baeldung/features/records/LocationWrapper.java new file mode 100644 index 0000000000..e7ddfef5f0 --- /dev/null +++ b/core-java-modules/core-java-19/src/main/java/com/baeldung/features/records/LocationWrapper.java @@ -0,0 +1,3 @@ +package com.baeldung.features.records; + +public record LocationWrapper(T t, String description) { } diff --git a/core-java-modules/core-java-19/src/test/java/com/baeldung/features/JEP405RecordPatternsUnitTest.java b/core-java-modules/core-java-19/src/test/java/com/baeldung/features/JEP405RecordPatternsUnitTest.java new file mode 100644 index 0000000000..10ad33b411 --- /dev/null +++ b/core-java-modules/core-java-19/src/test/java/com/baeldung/features/JEP405RecordPatternsUnitTest.java @@ -0,0 +1,99 @@ +package com.baeldung.features; + +import com.baeldung.features.records.GPSPoint; +import com.baeldung.features.records.Location; +import com.baeldung.features.records.LocationWrapper; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + + +public class JEP405RecordPatternsUnitTest { + + Object object = new Location("Home", new GPSPoint(1.0, 2.0)); + + @Test + void givenObject_whenTestInstanceOfAndCastIdiom_shouldMatchNewInstanceOf() { + // old Code + if (object instanceof Location) { + Location l = (Location) object; + assertThat(l).isInstanceOf(Location.class); + } + // new code + if (object instanceof Location l) { + assertThat(l).isInstanceOf(Location.class); + } + } + + @Test + void givenObject_whenTestDestruct_shouldMatch() { + // when + if (object instanceof Location(var name, var gpsPoint)) { + // then + assertThat(name).isEqualTo("Home"); + assertThat(gpsPoint).isInstanceOf(GPSPoint.class); + } + + if (object instanceof Location(var name, GPSPoint(var lat, var lng))) { + assertThat(lat).isEqualTo(1.0); + assertThat(lng).isEqualTo(2.0); + } + } + + @Test + void givenObjectIsNull_whenTestNullCheck_shouldNotMatch() { + Location l = null; + if (l instanceof Location location) { + assertThat(location).isNotNull(); + } + } + + + @Test + void givenObject_whenTestGenericTypeInstanceOf_shouldMatch() { + LocationWrapper locationWrapper = new LocationWrapper<>(new Location("Home", new GPSPoint(1.0, 2.0)), "Description"); + if (locationWrapper instanceof LocationWrapper(var ignored, var description)) { + assertThat(description).isEqualTo("Description"); + } + } + + + @Test + void givenObject_whenTestSwitchExpressionWithTypePattern_shouldMatch() { + String result = switch (object) { + case Location l -> l.name(); + default -> "default"; + }; + assertThat(result).isEqualTo("Home"); + Double result2 = switch (object) { + case Location(var name, GPSPoint(var lat, var lng)) -> lat; + default -> 0.0; + }; + assertThat(result2).isEqualTo(1.0); + } + + @Test + void givenObject_whenTestGuardedSwitchExpressionWithTypePattern_shouldMatchAndGuard() { + String result = switch (object) { + case Location(var name, var ignored) when name.equals("Home") -> "Test"; + case Location(var name, var ignored) -> name; + default -> "default"; + }; + assertThat(result).isEqualTo("Test"); + + String otherResult = switch (new Location("Other", new GPSPoint(1.0, 2.0))) { + case Location(var name, var ignored) when name.equals("Home") -> "Test"; + case Location(var name, var ignored) -> name; + default -> "default"; + }; + assertThat(otherResult).isEqualTo("Other"); + + Object noLocation = new GPSPoint(1.0, 2.0); + String noLocationResult = switch (noLocation) { + case Location(var name, var ignored) when name.equals("Home") -> "Test"; + case Location(var name, var ignored) -> name; + default -> "default"; + }; + assertThat(noLocationResult).isEqualTo("default"); + } +} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index f1c5bfe874..cc137d08b6 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -151,4 +151,4 @@ - \ No newline at end of file + diff --git a/pom.xml b/pom.xml index 3d2863e1f2..c4c9dbf925 100644 --- a/pom.xml +++ b/pom.xml @@ -1130,6 +1130,7 @@ + core-java-modules/core-java-collections-set core-java-modules/core-java-collections-list-4 core-java-modules/core-java-collections-maps-4 From ef0a33a4b93c5630a5835000b1e912d5afad9b59 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 7 Jan 2023 17:34:10 +0800 Subject: [PATCH 221/592] Update README.md [skip ci] --- rxjava-modules/rxjava-core/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/rxjava-modules/rxjava-core/README.md b/rxjava-modules/rxjava-core/README.md index a3c8cef4e7..16625435e6 100644 --- a/rxjava-modules/rxjava-core/README.md +++ b/rxjava-modules/rxjava-core/README.md @@ -14,4 +14,3 @@ This module contains articles about RxJava. - [Combining RxJava Completables](https://www.baeldung.com/rxjava-completable) - [RxJava Hooks](https://www.baeldung.com/rxjava-hooks) - [Retry with Delay in RxJava](https://www.baeldung.com/rxjava-retry-with-delay) -- [RxJava Single.just() vs Single.fromCallable()](https://www.baeldung.com/rxjava-single-just-single-fromcallable) From b268852b3b1a01a4fcc829bb3cf5ffdd0ec60634 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 7 Jan 2023 17:34:39 +0800 Subject: [PATCH 222/592] Update README.md [skip ci] --- rxjava-modules/rxjava-core-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/rxjava-modules/rxjava-core-2/README.md b/rxjava-modules/rxjava-core-2/README.md index 72c9fba62c..122f411256 100644 --- a/rxjava-modules/rxjava-core-2/README.md +++ b/rxjava-modules/rxjava-core-2/README.md @@ -3,3 +3,4 @@ This module contains articles about RxJava. ### Relevant articles: +- [RxJava Single.just() vs Single.fromCallable()](https://www.baeldung.com/rxjava-single-just-single-fromcallable) From 30a3a42e4a05aee51f22d4b4c6d31724c4a239f4 Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Sat, 7 Jan 2023 18:20:57 +0100 Subject: [PATCH 223/592] BAEL-3906: Fix tests for Serenity (#13228) --- libraries-testing/serenity.properties | 5 +++- .../serenity/GoogleSearchLiveTest.java | 23 +++++++++++++------ .../GoogleSearchPageObjectLiveTest.java | 3 +++ .../pageobjects/GoogleSearchPageObject.java | 9 ++++++++ 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/libraries-testing/serenity.properties b/libraries-testing/serenity.properties index c77df9c0f7..9d8c664e2c 100644 --- a/libraries-testing/serenity.properties +++ b/libraries-testing/serenity.properties @@ -1,4 +1,7 @@ jira.url= jira.project= jira.username= -jira.password= \ No newline at end of file +jira.password= +# The path must point to the chromedriver location on your workstation +# The chromedriver must be compatible with your browser version +webdriver.chrome.driver=PATH\\chromedriver.exe \ No newline at end of file diff --git a/libraries-testing/src/test/java/com/baeldung/serenity/GoogleSearchLiveTest.java b/libraries-testing/src/test/java/com/baeldung/serenity/GoogleSearchLiveTest.java index 57bb7c1242..16df26c6b6 100644 --- a/libraries-testing/src/test/java/com/baeldung/serenity/GoogleSearchLiveTest.java +++ b/libraries-testing/src/test/java/com/baeldung/serenity/GoogleSearchLiveTest.java @@ -1,7 +1,9 @@ package com.baeldung.serenity; -import net.serenitybdd.junit.runners.SerenityRunner; -import net.thucydides.core.annotations.Managed; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; +import static org.openqa.selenium.support.ui.ExpectedConditions.visibilityOfElementLocated; + import org.junit.Test; import org.junit.runner.RunWith; import org.openqa.selenium.By; @@ -9,13 +11,17 @@ import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.support.ui.WebDriverWait; -import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; -import static org.openqa.selenium.support.ui.ExpectedConditions.visibilityOfElementLocated; +import net.serenitybdd.junit.runners.SerenityRunner; +import net.thucydides.core.annotations.Managed; @RunWith(SerenityRunner.class) public class GoogleSearchLiveTest { + /* The selectors must be appropriate for your own context. + you can inspect the desired element on the web page you are testing to get the appropriate selector */ + private static String SELECTOR_EUGEN_TEXT = ".haz7je"; + private static String SELECTOR_VALIDATE_COOKIES_DIALOG = "button[id='L2AGLb'] div[role='none']"; + @Managed(driver = "chrome") private WebDriver browser; @@ -23,11 +29,14 @@ public class GoogleSearchLiveTest { public void whenGoogleBaeldungThenShouldSeeEugen() { browser.get("https://www.google.com/ncr"); + // If your browser displays cookie settings dialog, uncomment the line below + // browser.findElement(By.cssSelector(SELECTOR_VALIDATE_COOKIES_DIALOG)).click(); + browser.findElement(By.name("q")).sendKeys("baeldung", Keys.ENTER); - new WebDriverWait(browser, 5).until(visibilityOfElementLocated(By.cssSelector("._ksh"))); + new WebDriverWait(browser, 5).until(visibilityOfElementLocated(By.cssSelector(SELECTOR_EUGEN_TEXT))); - assertThat(browser.findElement(By.cssSelector("._ksh")).getText(), containsString("Eugen (Baeldung)")); + assertThat(browser.findElement(By.cssSelector(SELECTOR_EUGEN_TEXT)).getText(), containsString("Eugen (Baeldung)")); } } diff --git a/libraries-testing/src/test/java/com/baeldung/serenity/GoogleSearchPageObjectLiveTest.java b/libraries-testing/src/test/java/com/baeldung/serenity/GoogleSearchPageObjectLiveTest.java index 47fcdd5403..0a20dcd13a 100644 --- a/libraries-testing/src/test/java/com/baeldung/serenity/GoogleSearchPageObjectLiveTest.java +++ b/libraries-testing/src/test/java/com/baeldung/serenity/GoogleSearchPageObjectLiveTest.java @@ -19,6 +19,9 @@ public class GoogleSearchPageObjectLiveTest { public void whenGoogleBaeldungThenShouldSeeEugen() { googleSearch.open(); + // If your browser displays cookie settings dialog, uncomment the line below + // googleSearch.validateCookies(); + googleSearch.searchFor("baeldung"); googleSearch.resultMatches("Eugen (Baeldung)"); diff --git a/libraries-testing/src/test/java/com/baeldung/serenity/pageobjects/GoogleSearchPageObject.java b/libraries-testing/src/test/java/com/baeldung/serenity/pageobjects/GoogleSearchPageObject.java index d922ea8c85..11e7d08248 100644 --- a/libraries-testing/src/test/java/com/baeldung/serenity/pageobjects/GoogleSearchPageObject.java +++ b/libraries-testing/src/test/java/com/baeldung/serenity/pageobjects/GoogleSearchPageObject.java @@ -13,12 +13,18 @@ import static org.hamcrest.MatcherAssert.assertThat; @DefaultUrl("https://www.google.com/ncr") public class GoogleSearchPageObject extends PageObject { + /* The selectors "q", "._ksh" and "button[id='L2AGLb'] div[role='none']" must be appropriate for your own context. + you can inspect the desired element on the web page you are testing to get the appropriate selector */ + @FindBy(name = "q") private WebElement search; @FindBy(css = "._ksh") private WebElement result; + @FindBy(css = "button[id='L2AGLb'] div[role='none']") + private WebElement validateCookies; + public void searchFor(String keyword) { search.sendKeys(keyword, Keys.ENTER); } @@ -28,4 +34,7 @@ public class GoogleSearchPageObject extends PageObject { assertThat(result.getText(), containsString(expected)); } + public void validateCookies() { + validateCookies.click(); + } } From 49550ca022d53a6a1d234636df03fbb7bebf1de2 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sun, 8 Jan 2023 01:31:11 +0530 Subject: [PATCH 224/592] JAVA-16899 Disabled spring-roo project (#13247) --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index c4c9dbf925..c4e5c25d9d 100644 --- a/pom.xml +++ b/pom.xml @@ -590,7 +590,7 @@ spring-quartz spring-remoting-modules - spring-roo + spring-scheduling spring-security-modules @@ -968,7 +968,7 @@ spring-quartz spring-remoting-modules - spring-roo + spring-scheduling spring-security-modules From 8103e7087b0ec9489cc135cee1bfd16f196e1f30 Mon Sep 17 00:00:00 2001 From: Abhinav Pandey Date: Sun, 8 Jan 2023 09:50:13 +0530 Subject: [PATCH 225/592] BAEL-5884 - URI encoding with Rest Template (#13207) * BAEL-5884 - URI encoding with Rest Template * BAEL-5884 - URI encoding with Rest Template - indentation corrected --- .../com/baeldung/encoding/Application.java | 11 +++++++ .../encoding/UriEncodingInterceptor.java | 29 +++++++++++++++++++ .../encoding/config/RestTemplateConfig.java | 19 ++++++++++++ .../RestTemplateWithInterceptorsConfig.java | 20 +++++++++++++ .../encoding/service/HttpBinService.java | 27 +++++++++++++++++ .../service/HttpBinServiceUnitTest.java | 28 ++++++++++++++++++ 6 files changed, 134 insertions(+) create mode 100644 spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/Application.java create mode 100644 spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/UriEncodingInterceptor.java create mode 100644 spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateConfig.java create mode 100644 spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateWithInterceptorsConfig.java create mode 100644 spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/service/HttpBinService.java create mode 100644 spring-web-modules/spring-resttemplate-3/src/test/java/com/baeldung/encoding/service/HttpBinServiceUnitTest.java diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/Application.java b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/Application.java new file mode 100644 index 0000000000..c6160a83d9 --- /dev/null +++ b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/Application.java @@ -0,0 +1,11 @@ +package com.baeldung.encoding; + +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-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/UriEncodingInterceptor.java b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/UriEncodingInterceptor.java new file mode 100644 index 0000000000..0a4bf4dc42 --- /dev/null +++ b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/UriEncodingInterceptor.java @@ -0,0 +1,29 @@ +package com.baeldung.encoding; + + +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.http.client.support.HttpRequestWrapper; +import org.springframework.web.util.UriComponentsBuilder; + +import java.io.IOException; +import java.net.URI; + +public class UriEncodingInterceptor implements ClientHttpRequestInterceptor { + @Override + public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { + HttpRequest encodedRequest = new HttpRequestWrapper(request) { + @Override + public URI getURI() { + URI uri = super.getURI(); + String escapedQuery = uri.getRawQuery().replace("+", "%2B"); + return UriComponentsBuilder.fromUri(uri) + .replaceQuery(escapedQuery) + .build(true).toUri(); + } + }; + return execution.execute(encodedRequest, body); + } +} \ No newline at end of file diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateConfig.java b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateConfig.java new file mode 100644 index 0000000000..a39ba55ccc --- /dev/null +++ b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateConfig.java @@ -0,0 +1,19 @@ +package com.baeldung.encoding.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.DefaultUriBuilderFactory; + +@Configuration +public class RestTemplateConfig { + @Bean + public RestTemplate restTemplate() { + RestTemplate restTemplate = new RestTemplate(); + DefaultUriBuilderFactory defaultUriBuilderFactory = new DefaultUriBuilderFactory(); + defaultUriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY); + restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory()); + return restTemplate; + } +} \ No newline at end of file diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateWithInterceptorsConfig.java b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateWithInterceptorsConfig.java new file mode 100644 index 0000000000..87c50f2e17 --- /dev/null +++ b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateWithInterceptorsConfig.java @@ -0,0 +1,20 @@ +package com.baeldung.encoding.config; + +import com.baeldung.encoding.UriEncodingInterceptor; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +import java.util.Collections; + +@Configuration +public class RestTemplateWithInterceptorsConfig { + @Qualifier("restTemplateWithInterceptors") + @Bean + public RestTemplate restTemplateWithInterceptors() { + RestTemplate restTemplate = new RestTemplate(); + restTemplate.setInterceptors(Collections.singletonList(new UriEncodingInterceptor())); + return restTemplate; + } +} diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/service/HttpBinService.java b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/service/HttpBinService.java new file mode 100644 index 0000000000..53cbb5e1a8 --- /dev/null +++ b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/service/HttpBinService.java @@ -0,0 +1,27 @@ +package com.baeldung.encoding.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.Map; + +@Service +public class HttpBinService { + private final RestTemplate restTemplate; + + public HttpBinService(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + public String get(String parameter) throws JsonProcessingException { + String url = "http://httpbin.org/get?parameter={parameter}"; + ResponseEntity response = restTemplate.getForEntity(url, String.class, parameter); + Map mapping = new ObjectMapper().readValue(response.getBody(), HashMap.class); + Map args = (Map) mapping.get("args"); + return args.get("parameter"); + } +} diff --git a/spring-web-modules/spring-resttemplate-3/src/test/java/com/baeldung/encoding/service/HttpBinServiceUnitTest.java b/spring-web-modules/spring-resttemplate-3/src/test/java/com/baeldung/encoding/service/HttpBinServiceUnitTest.java new file mode 100644 index 0000000000..c45f1991e5 --- /dev/null +++ b/spring-web-modules/spring-resttemplate-3/src/test/java/com/baeldung/encoding/service/HttpBinServiceUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.encoding.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class HttpBinServiceUnitTest { + @Autowired + private HttpBinService httpBinService; + + @Test + void givenWithoutPlusSign_whenGet_thenSameValueReturned() throws JsonProcessingException { + String parameterWithoutPlusSign = "springboot"; + String responseWithoutPlusSign = httpBinService.get(parameterWithoutPlusSign); + assertEquals(parameterWithoutPlusSign, responseWithoutPlusSign); + } + + @Test + void givenWithPlusSign_whenGet_thenSameValueReturned() throws JsonProcessingException { + String parameterWithPlusSign = "spring+boot"; + String responseWithPlusSign = httpBinService.get(parameterWithPlusSign); + assertEquals(parameterWithPlusSign, responseWithPlusSign); + } +} \ No newline at end of file From e9e7aace3164288dfa17113140d69f9bbf974ec0 Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Sun, 8 Jan 2023 16:59:46 +0100 Subject: [PATCH 226/592] BAEL-6058: extracting request header --- .../requestheader/BuzzController.java | 21 ++++++ .../requestheader/FooBarController.java | 22 +++++++ .../HeaderInterceptorApplication.java | 15 +++++ .../config/HeaderInterceptorConfig.java | 33 ++++++++++ .../interceptor/OperatorHolder.java | 13 ++++ .../interceptor/OperatorInterceptor.java | 22 +++++++ .../HeaderInterceptorApplicationTest.java | 66 +++++++++++++++++++ 7 files changed, 192 insertions(+) create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/BuzzController.java create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/FooBarController.java create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/HeaderInterceptorApplication.java create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/config/HeaderInterceptorConfig.java create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/interceptor/OperatorHolder.java create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/interceptor/OperatorInterceptor.java create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/requestheader/HeaderInterceptorApplicationTest.java diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/BuzzController.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/BuzzController.java new file mode 100644 index 0000000000..09bf16f008 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/BuzzController.java @@ -0,0 +1,21 @@ +package com.baeldung.requestheader; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.requestheader.interceptor.OperatorHolder; + +@RestController +public class BuzzController { + private final OperatorHolder operatorHolder; + + public BuzzController(OperatorHolder operatorHolder) { + this.operatorHolder = operatorHolder; + } + + @GetMapping("buzz") + public String buzz() { + return "hello, " + operatorHolder.getOperator(); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/FooBarController.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/FooBarController.java new file mode 100644 index 0000000000..e0fd5f2f64 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/FooBarController.java @@ -0,0 +1,22 @@ +package com.baeldung.requestheader; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class FooBarController { + + @GetMapping("foo") + public String foo(HttpServletRequest request) { + String operator = request.getHeader("operator"); + return "hello, " + operator; + } + + @GetMapping("bar") + public String bar(@RequestHeader("operator") String operator) { + return "hello, " + operator; + } +} diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/HeaderInterceptorApplication.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/HeaderInterceptorApplication.java new file mode 100644 index 0000000000..f2e9aaca12 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/HeaderInterceptorApplication.java @@ -0,0 +1,15 @@ +package com.baeldung.requestheader; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +@SpringBootApplication +@EnableWebMvc +public class HeaderInterceptorApplication { + + public static void main(String[] args) { + SpringApplication.run(HeaderInterceptorApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/config/HeaderInterceptorConfig.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/config/HeaderInterceptorConfig.java new file mode 100644 index 0000000000..07fb5b5184 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/config/HeaderInterceptorConfig.java @@ -0,0 +1,33 @@ +package com.baeldung.requestheader.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import com.baeldung.requestheader.interceptor.OperatorHolder; +import com.baeldung.requestheader.interceptor.OperatorInterceptor; + +@Configuration +public class HeaderInterceptorConfig implements WebMvcConfigurer { + + @Override + public void addInterceptors(final InterceptorRegistry registry) { + registry.addInterceptor(operatorInterceptor()); + } + + @Bean + public OperatorInterceptor operatorInterceptor() { + return new OperatorInterceptor(operatorHolder()); + } + + @Bean + @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) + public OperatorHolder operatorHolder() { + return new OperatorHolder(); + } + +} diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/interceptor/OperatorHolder.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/interceptor/OperatorHolder.java new file mode 100644 index 0000000000..31d36c0b59 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/interceptor/OperatorHolder.java @@ -0,0 +1,13 @@ +package com.baeldung.requestheader.interceptor; + +public class OperatorHolder { + private String operator; + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } +} diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/interceptor/OperatorInterceptor.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/interceptor/OperatorInterceptor.java new file mode 100644 index 0000000000..0d0a0c7405 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/requestheader/interceptor/OperatorInterceptor.java @@ -0,0 +1,22 @@ +package com.baeldung.requestheader.interceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.HandlerInterceptor; + +public class OperatorInterceptor implements HandlerInterceptor { + + private final OperatorHolder operatorHolder; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + String operator = request.getHeader("operator"); + operatorHolder.setOperator(operator); + return true; + } + + public OperatorInterceptor(OperatorHolder operatorHolder) { + this.operatorHolder = operatorHolder; + } +} diff --git a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/requestheader/HeaderInterceptorApplicationTest.java b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/requestheader/HeaderInterceptorApplicationTest.java new file mode 100644 index 0000000000..77b48fbe99 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/requestheader/HeaderInterceptorApplicationTest.java @@ -0,0 +1,66 @@ +package com.baeldung.requestheader; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { HeaderInterceptorApplication.class }) +@WebAppConfiguration +public class HeaderInterceptorApplicationTest { + + @Autowired + private WebApplicationContext webApplicationContext; + + private MockMvc mockMvc; + + @BeforeEach + public void setup() { + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext) + .build(); + } + + @Test + public void givenARequestWithOperatorHeader_whenWeCallFooEndpoint_thenOperatorIsExtracted() throws Exception { + MockHttpServletResponse response = this.mockMvc.perform(get("/foo").header("operator", "John.Doe")) + .andDo(print()) + .andReturn() + .getResponse(); + + assertThat(response.getContentAsString()).isEqualTo("hello, John.Doe"); + } + + @Test + public void givenARequestWithOperatorHeader_whenWeCallBarEndpoint_thenOperatorIsExtracted() throws Exception { + MockHttpServletResponse response = this.mockMvc.perform(get("/bar").header("operator", "John.Doe")) + .andDo(print()) + .andReturn() + .getResponse(); + + assertThat(response.getContentAsString()).isEqualTo("hello, John.Doe"); + } + + @Test + public void givenARequestWithOperatorHeader_whenWeCallBuzzEndpoint_thenOperatorIsIntercepted() throws Exception { + MockHttpServletResponse response = this.mockMvc.perform(get("/buzz").header("operator", "John.Doe")) + .andDo(print()) + .andReturn() + .getResponse(); + + assertThat(response.getContentAsString()).isEqualTo("hello, John.Doe"); + } + +} \ No newline at end of file From b974efc21adc0bb479436c08b503d0564e24519a Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Mon, 9 Jan 2023 12:23:13 +0200 Subject: [PATCH 227/592] Create README.md --- spring-reactive-modules/spring-reactive-exceptions/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 spring-reactive-modules/spring-reactive-exceptions/README.md diff --git a/spring-reactive-modules/spring-reactive-exceptions/README.md b/spring-reactive-modules/spring-reactive-exceptions/README.md new file mode 100644 index 0000000000..8c5bc4f537 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/README.md @@ -0,0 +1,2 @@ + +- [How to Resolve Spring Webflux DataBufferLimitException](https://www.baeldung.com/spring-webflux-databufferlimitexception) From 824630f8f8e01831bdddb7654852e98c83bc3de8 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Mon, 9 Jan 2023 12:23:17 +0200 Subject: [PATCH 228/592] Update README.md --- spring-reactive-modules/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-reactive-modules/README.md b/spring-reactive-modules/README.md index 3522efec17..57c3eebbff 100644 --- a/spring-reactive-modules/README.md +++ b/spring-reactive-modules/README.md @@ -1,4 +1,3 @@ ## Spring Reactive This module contains modules about Spring Reactive -- [How to Resolve Spring Webflux DataBufferLimitException](https://www.baeldung.com/spring-webflux-databufferlimitexception) From b6075009b0c48f40ddce81c812b5e3cd1f2c5f27 Mon Sep 17 00:00:00 2001 From: chrisjaimes <45322800+chrisjaimes@users.noreply.github.com> Date: Mon, 9 Jan 2023 05:52:25 -0500 Subject: [PATCH 229/592] BAEL-5822 printstream vs printwriter (#13199) * BAEL-5822 pr with streams implementation, unit test and resource file for testing * fix unit tests names * swap arguments in assertion Co-authored-by: Christian Jaimes --- .../com/baeldung/iostreams/DataStream.java | 37 ++++++++++ .../iostreams/DataStreamUnitTest.java | 66 ++++++++++++++++++ .../src/test/resources/iostreams/image.png | Bin 0 -> 377689 bytes 3 files changed, 103 insertions(+) create mode 100644 core-java-modules/core-java-io-4/src/main/java/com/baeldung/iostreams/DataStream.java create mode 100644 core-java-modules/core-java-io-4/src/test/java/com/baeldung/iostreams/DataStreamUnitTest.java create mode 100644 core-java-modules/core-java-io-4/src/test/resources/iostreams/image.png diff --git a/core-java-modules/core-java-io-4/src/main/java/com/baeldung/iostreams/DataStream.java b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/iostreams/DataStream.java new file mode 100644 index 0000000000..71c55d31b9 --- /dev/null +++ b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/iostreams/DataStream.java @@ -0,0 +1,37 @@ +package com.baeldung.iostreams; + +import java.io.*; + +public class DataStream { + public static void textDataProcessingByteStream(String fileName, String content) throws IOException { + PrintStream out = new PrintStream(fileName); + out.print(content); + out.flush(); + } + + public static void textDataProcessingCharStream(String fileName, String content) throws IOException { + PrintWriter out = new PrintWriter(fileName); + out.print(content); + out.flush(); + } + + public static void nonTextDataProcessing(String fileName, String streamOutputFile, String writerOutputFile) throws IOException { + FileInputStream inputStream = new FileInputStream(fileName); + PrintStream printStream = new PrintStream(streamOutputFile); + + int b; + while ((b = inputStream.read()) != -1) { + printStream.write(b); + } + printStream.close(); + + FileReader reader = new FileReader(fileName); + PrintWriter writer = new PrintWriter(writerOutputFile); + + int c; + while ((c = reader.read()) != -1) { + writer.write(c); + } + writer.close(); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-io-4/src/test/java/com/baeldung/iostreams/DataStreamUnitTest.java b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/iostreams/DataStreamUnitTest.java new file mode 100644 index 0000000000..a5a53d5a08 --- /dev/null +++ b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/iostreams/DataStreamUnitTest.java @@ -0,0 +1,66 @@ +package com.baeldung.iostreams; + +import org.apache.commons.io.FileUtils; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class DataStreamUnitTest { + + private static final String dataProcessingTextFile = "src/test/resources/iostreams/TestFile.txt"; + private static final String dataProcessingImageFile = "src/test/resources/iostreams/image.png"; + private static final String dataProcessingByteStreamFile = "src/test/resources/iostreams/ps.png"; + private static final String dataProcessingCharStreamFile = "src/test/resources/iostreams/pw.png"; + + private static final String textFileContent = "Hello, world!"; + + @Test + public void whenUsingByteStream_thenWriteTextToFile() throws IOException { + DataStream dataStream = new DataStream(); + dataStream.textDataProcessingByteStream(dataProcessingTextFile, textFileContent); + + File file = new File(dataProcessingTextFile); + assertTrue(file.exists()); + assertEquals(textFileContent, FileUtils.readFileToString(file, "utf-8")); + + Files.delete(Paths.get(dataProcessingTextFile)); + } + + @Test + public void whenUsingCharStream_thenWriteTextToFile() throws IOException { + DataStream dataStream = new DataStream(); + dataStream.textDataProcessingCharStream(dataProcessingTextFile, textFileContent); + + File file = new File(dataProcessingTextFile); + assertTrue(file.exists()); + assertEquals(textFileContent, FileUtils.readFileToString(file, "utf-8")); + + Files.delete(Paths.get(dataProcessingTextFile)); + } + + @Test + public void whenUsingStreams_thenWriteNonTextData() throws IOException { + DataStream dataStream = new DataStream(); + dataStream.nonTextDataProcessing(dataProcessingImageFile, dataProcessingByteStreamFile, dataProcessingCharStreamFile); + + File file = new File(dataProcessingImageFile); + File byteStreamOutputFile = new File(dataProcessingByteStreamFile); + File charStreamOutputFile = new File(dataProcessingCharStreamFile); + assertTrue(file.exists()); + assertTrue(byteStreamOutputFile.exists()); + assertTrue(charStreamOutputFile.exists()); + + assertTrue(FileUtils.contentEquals(file, byteStreamOutputFile)); + assertFalse(FileUtils.contentEquals(file, charStreamOutputFile)); + + Files.delete(Paths.get(dataProcessingByteStreamFile)); + Files.delete(Paths.get(dataProcessingCharStreamFile)); + } +} diff --git a/core-java-modules/core-java-io-4/src/test/resources/iostreams/image.png b/core-java-modules/core-java-io-4/src/test/resources/iostreams/image.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac7f37ece91d289c3e3ca4514820fe601207a04 GIT binary patch literal 377689 zcmd>mgF$y)DN*m> zeSPom{tcJU_>7Hl&Qs@kzE2$9X#tf9aH(-IFfa&Io-62JV36ZrVBqrL+(W<9%~-UH ze!2&Grtu5|qdEca+Uh>~^<$goIvN-lfvgx9p%EAuSLnAww=gh#_%JZGEio`8(l9U{ zxkH<^rO>~)YptfNfPqmO$0UG$^}zkPkrxJr`uffH9Us(TGWtzyZxszi>@_TWLSCFi z6mtN2H4GJnXD|F`cIN{^=T?7xIclgA;nY`9U_^hxh?O%6RrHbyRg)cGlpN=&0(_En zQ~|0Edf#-E>3qhG{2a8DSKe~oQ~ApB?rWBF<@}(1Li!@Z#Egx--#*Cx{MXg>hkrFjY}D#=ZVZJ|DQZOT*xHu+%lU_5#@oiX!+P=lm)XuvDlt&oy+FViQ$0I zLau~2Im=&x2=o)eZe;_=JX;Y3+rguhwK)uXrG6t^%3oI783cC{QT6JJe=SWB=CZ}o z^-rEG#+(1Y0{vbiUwkWE)rmpq`@{O9_E(1e*aI#Xe?-K$aj0jp^p771`o}&{CrF9> zs{|eD-G>~v`)6>jQ2Ju##-|2EW$2qI$QPw4YEzu>^4Pd+Dg6C(Vxm>F*6pXq#*XH` zuxijN8zB(tuDg$$#1~-}Tg-4CB$w-2AX`%E-#>}${FkTiUOiHs&tOSknSQhml8zk# zbkkLty(Rv$g`?>wFK%Asqny|=(~;09Wo$2OlL#OnVO+O|TEFVO=EeK(>h?ZckiSbO z%7Ff*MxqF_DXD_`w}mpf*%paJK^Q44!-va;_#~~Dvz12T$zK7F1^ljtOH zs`q2l2Y;$B-FKXs-o%WG0JiF0v^s6cw=zhO|K0i@q9HlW9@snY>SF>I)|N!hxvX`- zzredaVZPbKe?OQnBqsNd8m+(^KM8ESmD2h%)op`E>}UrtA+^={eWle~524`7^(>tCN;GgxR= zF}?H}I$=WEREmFSuM^h`lB(kZv5FpQL4Sk?q*g9xaO^OagUEM6g`ctrk5v&G5|&$I z?ieXXM1Jv{(Cw=ke(-m1W)|c>d(Q|$b4C+fwx0Qk*d^Id61$x+ZPZV-r7a$6V10|V z7I9rIwYg(quegO&G5VJI20vf6g++?-rIgQHkFdH+eL41!fYcy9+p$@xb!AiJs@JTc z(GMf+;huqY`GxgysemECN?A~r^mO_jyPbcTpZ0$mCY!o7bsZDnid4OuS1db`m%0t2 z#@rM^G{xL8Qg*@W7Fqcb^5o|+Q(MOwq{^eWzY-SDKHB(3QkR~lw%`YCKPG?5C;Qm) z2E8+(0}P3hKAfDNN8I&Aq9)(61_1?85~U^9n91dNF+Sz_VVA94LZyP)2E>foUmE)+Y}ywIIc8)^YDKw7Y+$^y}%Aitnfm=Y@}WFV#Ms)D3F@{*r{7^N$_Z z)w4~W)G@a-Bzuua9(i4{z0T6^aC9uOr=uyhB+x5|L1TJLve@|9yu*uicY69y?^)6v z99qy@`>ZxIUE<9~0QtDN5f8GyYz+fgtom7p6up?l!`x~}GwrsXYl~E6YXIIIp(qQo zCAN#LMj?pk&rufZ`8|Kl|JGp1Lo0XtD5Jiym3(flGxlWpMrI>o^BuKVtkM)Qbp%MQ zrL=I<^nEZtx6K@-^=+HCChWZFotGhWx&2g&ALhZev^;iyi1n!0<%hG+x*`2?QdnsZ zh3{cQGefb&^xLsn0xl{5n5qF|0 zgB$`+Tn`$s#fb5bayxcm72*sLHp%}m&jqv=C8UTTTP!`g^GQh3lri{E?G& z;P6La{pJ*rFc{D0jbtMr}&Sn`HY1Ez5r%`o=<#G>Wu+@bY(pzfB^>)mNXO?9cPn_6HG0 zbeXOyN!8y~{TVL|1HN~2pn#2L%3hpFjnI$7AreS==>X9S3;4IDPVIlZJbEo1B<<~a zM3xh`DojSygKJVEx$N+owR;P_tw=?%91Vv!^pA;&4sBy!yRJ`_`Qbbqcwk0%NNzjL2gj9IQo+RCvINex`aO+xS^=5gWVL z-RWSrW3iuEa!joqHd2Exa%m=yR$J*#_>i~@>mK`7E>P~~6TCAUJ`+)@br0^470;#D zzE0XRC3C|U#iH#nHewkoR^4>_Xs&{Sv^&nq7WH;Cfg|DE(_sS5H2@Z}N6#CaB9F-y z@v_4Hl7I~H#krABjh#@)N*UG8hHz?3?ytPg%Jk@QrWFqaj*V0tIbVDI~szvN_P$lm&+lC7cTpaErd z7f_2paMy?3_b|bOi7dH4U6Y>rn=j2xWykmuQkxPsXQv7!+n2PW3Z+UN2x#CQP@iPl zFWtj&xvj&=aLQhcdMhuHj~T{}#g>@k@%?Am&$|`reN^(Fn8yMB|)$NR7iX9ZO*G zjuY@VxEv+c1Z5?*;wR~Y>ZLPWHU#r>2Ic`S!k>Hl-3ojf!ynLqGA^e$;-~%n(c-2r?vBkH`Ce*WLCodoI=Oj>t0kxoCKL)Y9h~Cw(?p|KlS=%oh??>={-D%PH7uGQ!u>0* z2A%8I&_Vek&N>JBuFN^eu=73fIu;!AVeiwX-ksFoT_$FPW{&}0)%Z)+H zmq|P@txgu`7k$|1_M!R4>{tX)j!L(8;S?l!H5^+p9V6pBvFjLcpVw2Gbag*Osy)wQ zOZB-6JLtXHf9~vtgE1pB6(OY;ha4cSiK@Z;wAnQgnUBSK`@C2~rK<>zGyGp{rQiS# z*k)_Sq# zqg20Nh7>hYFDO<+j&1yb!i5f;*ha575YDdDua%=DzjIJ5b>qp{ivz(&QmO9Z?X|ka$Lf%zCV)4|e~Ozu{!`>~qrvih(}54pbP{pC~-ZJy7lrUdGie_{b*p*7l;SnqE%Vi4l;c}tu?dS zrlLrw;1{D*p9jB01j9yo*zu++v$#K&gTxsGlP3eR3mj;7@GF6r+hXQL!db&SuHbmYC2s&)rZ$QqYYx%32!)u$B}cfeSp=u)=dh8h0nGgX%OwtxC( z`F8MsSu1+Me1$lBC2(bCnYc)tK!TP0VZ4+QA`VZk{iV)u98+VusNpk~Ha0|7B? z#4nqfieC>NX(b*W1=g@vDBm28sLo^TKlk^de z_9u5mJ*5gBB%2{kI+XncC0t+V(q646g(ejPt7JGEW%i#(D8>~i_=76}Yt?SOGp~gk zMkHZ2GSCSRprg)+<#yPOxR|z$x^t5CDjmmUJxi`(*S^8X z!p^yg=vZb6IGDcwA7ZRS+-7`81G}J9w?jLuVZp&~cqV0=MHLdC$h`D1|M^h%u{j8Oxvct2FiFPsl7; zWLJ;wsqw6v`Sv;PmtBMwHNpo$Wt^Kwy7jRw!4fSa(TYZcx=o}7@i!Tlv|f2p%y_vS zfs+x+6KRC9rqCgk(D*B*8?s8YARZKMIvPTF+WqSq@!mn;ys;x{Y#}rbmKBV>Dqpkq zZl%nr)8_WuG;$1^{N!Ug&DEdxwzdUO)DV^ll99Lx)AXo7aQtnr7wGNSQX{23~X z9YO)NW$ff)JrW}F+k|sN%pAtyuguDnVKbBzM2%^CHWY(HC!#JBq>ffW3*5R7OW{u_loC%80sEE$Ksub{{4gXj!;ca%iJm($?|FqYRp$;XY(+ z?jS(nHhXY~Xw4b2fXm~QSLR4OsWa*PQ|8O{(oookmvc#x1`dc*2FGG6y68xt!e0kf z=aM)409{rrk(YeWP=ohtDrSUYGn;tggXCl8c-8=@}HC=9!)RV{u-UD=jKFa9lnEh2nw~c&32Vt3zV3- zie-!W++dq{bGF%#22|b*S|=S4;U;w5oO-}?yOd{xn$>TSo>a#w3; zww1bJ6i9{e;J5I`mQ;d;(B7mOSGkhd)*FVJNv2TIj&a$72x-_Q1iG~e(SRQXO&BeN(gCd{)GFP zo?@NW`=Fd&(Xpo6=0l7%v>5>TVcr&Nb*bnnlv{!4jm!}w9{OF z5C+&CZ!#wcw)gzrp-S{b{T2L;0dr6m%*kos&g+&oK^T{6MOx;|S18V$r6wM-R_F4| z`Ei$8i6nT5gx{e=o}jBCeP3M_()y^#Ko`Peas0GB+Pjk*`ex!eF-zRT62`tb+%TB} z&+R6mjx*}_T|6*t$EKY9JzMV=x927h;s5(=gSD_)q^Esu%$j?%@X*}DlUiAdtAy$G zoMTAKEzG{54pIaaFh~E8u7mWU?P3KSSo91+KYXEbg!q&fymgT`5R1oImqJaWy=X9U z12(FyU%vDt7!dYY+5)Tyb+|5`wzXMu7IQ@HP3 z@uprBrm`TLKaUctjkKn1Ev7Y9>WPCSqC78*r4?C>F0HN1FL93u8OJ}I(f)I_L#3J1 zIP|@s<3x}o!I1(EetszRky%t{OT&S#MCQ9+X{Je?b~0VgU$2Lhy)Dq>D|oMS;@ja! zR++`}_r-iyX^^5R;0sY-1+{kcnNHfyDU%ll>K{H4J$j1OPy00-Uv0Z|my~BChdafr zi}z#$S$T;ALwKoeMbxk(@5S4=f`wn9t4V7wsz_)6LZ6SGJ;~?}C&D{*KeNX*wr&IT@=%F-l@H33D!&~G2hF-r&+ zbaE6&iRILa@v}ASnL16NDn_xJtB|Dtsz|!jhM&JbEL`MjGXmP2q-Q=to>7H>{_7z) z^rd>(-q?wSs#s1J<@40xcisCln?{)qjG5hn>lgGOc~S z;?7zAZIn;E`99_Ab#>N&4H~nGFvODD{R=8;70{qmWa8ZNL1w;B#0w>yUjs5yBeu}t z^J%8@!T(^<$_ePEpHL?he{vb43oRox?8QYFMa;J3_U6Qi*7wT{vzAv?6Z7L8F@8E!D>Zym4>dY6nMs&4CMyl_S3$$22BoRU1V`lE8>d+K+V#C9`ey1(R_q&gSp9(g6 z9;3~Vy`iI^1YQF0_0ouZ+Vmw|UhJEXoO$QRxAUUcj) znX=Hd$oSEQR0|eMybJL(t+HYG8X{mgBSq*S5^ycHk8>em{?!*c@Wb3e)xlBPB}nsZ z6N7N@xdF=Vl+dh$6}aRXXrBxHF|c-j-&%DG7mazAVv2!><=@L%$t8?#Be6h#&Uf@S z_lC1T7mi!Z`QgN_@5ksyCAOZuMjJfXZFSD|YD`9~hasUFmJZye9>wA`1d8LJ+! z!H}NL`8*wd=k)7y<>8^v9mT`rPJED~(?R$2x&aX5`H3mInUI)o30z|Em{2HzCF*h6 zJn>2!+>00Bx!HUB z?xymWK|vIoqfFk4ECsOm6|UrKwqVj`PYh`1B1zg;VLf7sBi12-HwkhEXe7Ko#deCB zo2@!gm8fa-MR{OtkJUhZ+Uv2+bX3Ln4hm;fp|b*ulTn{%3cA&n)`8%{o4-W_`SJgB zCBp(viL$~V{GY0c#$ib>N8J}ts!iG(Cjx$=@v(mRsc@Gqq$*NSJ5YyS;=vL%>Z?)Q zBs@&>;_W-Bry5%^YKi&fk|}ZisYJzi?rTm{j4fbSPVJ;?$uBT#k}Oils7Qcp}%A<$$W}+GT!@VXeAD8 zcf`Dir}GmhhcCO|kaBGc4PRC{S0A_a@cG*I->YBXPq44K^`|}$Z%d3MPi6PlGPzNN zdFq>l+3T+@c?n&|0jCcUR4whO1?y9b}9iY-j!}=bn=esHMxswrdGlL_D$>jzGlu1$-(>#)ejS9(?csS{ z$sl^-B624;>IjOuZk(m?Aa1u?MYqKUA#g#?nK|o6zE-bps-!jKCRzv%{VIrNI)bcl zlWSD*wC~#oR(E#JQ0=+?Q0Ta(PFrBsCzjfImFvp!pD!Q+r6Z^%u}aYB@F0dlKz7ay z0IhO6Bck8|_IgV^ks@%Vv+5&}I}57{g%LpDjjJ6a{-*$=L4L%kdMV0K*EG%o9q(m- zG^m()y$IK|Q;yI~|5Bk2hPUy`T3h%Q`IULNW@da5^-4J+JNr6az1^5Cct9ki*u6mQ7)xek^h_jexN_;?-7K;GRr^4Gt!bmy$0gAD|FCK;|& zY%T7Uj+$*9bB27A0o&bc5ePMhXp=Q_Y-8vjN}M0^`S4HptZJQY_B$)5Mj$1UoV-%b zb!p$jZSItBY)akxvJPFHYSUpOx8ow6ncwydCOx112%3_OTg~Ye4!HOY&(>{1dnNh`L z)I?QGi+KCI_`>0z5aK22WKscG#vrt2#@xzK2&lVGw%FwRvm?$Dt^9MqJGj#}mv;#6 zg-YN7wC;#~&f<=_V6d5;E{r!WHAGNPU~2WK&5iG#B}@S~Kf!1oR}zW6zkl1iRiXOk zU)Hy=JF-@o)ZfVG?f6$(DwhW&9B+HUj)k6dT^TO(;qdgY+hVUMl}fAMoHvFA^Z%AZ zxO2NzXFMOVQ}U0fp>59wJ{Su=;HM463ztobvRad{um6b}%Zvo1nh)ahIN0nSjD}CP z@4c;>Lop>XlfU0tF~6)>!EcTRYTj&`@BU9WWKS}x9YIOuEiLFDC3#UiJ;Dgw#J@t< z$+}`{;$2}$IFCDnvNu^-8w_P2T^Fnt)@35iPwMu#2|=!?9WSc(!ApMGhN$z4h^{RX zE=-js1Jq;W?3^{1rf$ZDcBy|vgMYeTCO7vA2MT{4wVV6aP5ieQtp z;hy8@E|Np#om0EymJPTc`62KA(dW^-zXyE&-MJ&73Cf)~=fr(}92@oLpoeIR(jWQ& z#(9e%bbQG=ADy7Z5>xc{Po8EHB9lLYZmWx;90WK??;&kX3zy|)^- zK)-z0?I?teBCExB`%QD%ehQ{&?>?ObCx3oV(C3)Y|*Z#TR=IW$TNd zW&4=ed}DxubPnyhuXVd~E=0noxL_6iMkq)9ny><{mHDX39Bg;~7SYR%kBJXxX-=XH zZjTl2KNA$Vlh33Qzp#fBQyf$L*|2h~f%NR1;?I-OeJ#3<4-t`}?q8fPAkC?pB(_Te zrxo~0Mn_vw-)d5w9GMpG^nt+#j?zQN93pq65~qIK z17oVa0iTVzO$JfE|FqS7gcM<}3)9?oIqlEaFv(z4(xqL;=;H6^7=$Jwob& zjF(?lK@&fNl7i#rpAlKn^Bxue=jg~{1ZU{H35!M|5AN?1;+{{_z0e^XJK?N%gG;`o zIzJ99+9i|-XMo=?nx%V@nBO`QtJauckTz&-zOH(9cS(SiZJds*jn3=4;fD6CvkKW1 zn|Hx2rbgDHu2*Yr%9t(5IR#Y)5$SWidQ|-@0)#eCqm(_I7qMhE?6Q}rwnJgpNuSol z!qs0zGYFO)eLFH$Iv57{Jl2!y`(*S`f&ioU@Z+RaVvQ?#UiwV$)$i*#Op@m6{JeL^ zl03I1=@?kVxbuv&N(2W|hyA-uJh-Kjt%X00+dppdZA2xSgxiCpGV%z;lHti^H3Z%e z2%|}V_L`cCg`&(qIhJa8cWOR>Z3i*v`ohCI=?W?za0r$FDx}TyYQCACfR97*?aJ{M zSfi}GuhSG%Xbv=1(s4(olm*$Y6XT!{XG!&I@gFI872 zFZP%Shu>CtleEd3fkq_Q8f_W+3g?n9o)=n!YjL~C?bjb2NUT{wD zBbuds!mE3wb5|j4u`xf*!h-~}*h;G1C9z8qA8(#LQKFGO)$1A52iu+El{U3RkEQ+b zXVyHA8zL7oNgi_O>b} z5Lp6){wV*5&eZLA%DkYXTJ<2Oz|mNGZxA|q;%Rz{>%nMlJb#$0=-b=p1(BN^ZNWG{AJk?TL6!HTKF z4}2c)h()$|xkI(32I}Jywhf0QI4HmNYSh0&w>V3zapvVjWAh1Jr5Ekw!0Rk?eH~ei zoa_TD5oz4$(|EUF=D;7Lv=g7&m&Hlx_@LT-6y|zwU8@bfA-YJ z-Js()3w6{t;?*w7oOBFjZDOg0_xwrx;uq@gnM)q-bqcDlSOGs8Y`xIY>h2qO*~%JQ z1qD&jN|e-Y3ugb|M%i!#q-DcMlLXdEnTJ+2hn@jBSLlCvZ2JF89z@es?V^9YUx(vQ zW4Yf#@p1^**=KHl?#uQPotjQU$!Ywz47QmPzHsfKh_nhQfm+z)1RwtD$y;~%0l(7V z)<Jt=lk=Q8dsz`-xLi=7~{eUS8bV zk74qZd@NzwPF?<#KXJMeM?`5rQeG7u6Z4Io!Aix0l{6^bPw_KYOhZ#_OL4#4Wsw&Z z%UoB<3s8P5;}!hANfklnx1@bYjj%SbkTG1G$jX?;>Cv$;g)OWge{Q?Wb@zG5)wk%1 zsYF+2BrAWVVc`j!D`ZorSA#ZNOZj-5w&UXI-i^B|=w`@9KjT_30AXP9paJiVyH#wT zMueAtIZh zi=IJvtC`lLo+3Q^QL>AwQwxaWNgpJujOHHa&sn(?=EtC~JyMWS8}nW_c>|L~48v{% z!#T(A9dk&1m@b|z-H;bml6=t<6&-U<8~xSfGwR>G8-py<9;^nUzhyhwu2b8Ow0l(< z5QA}Wr7=$f<19I%RTAI$SFZ+1ujYo&w=elevHGmese${a_Yi2k>dah!H$vwP?#b?Ce-Q5VFY9ZwaWa{WbR5m(mK9J| zh+bvw33N)6hMFC)<*)nFSsPqA6$`(hm|rcgu%Y8L{Hk7fOmR>vp(EQiP>FAgF(nZ2DgR1WABU|cshJ$iLOyl4fQou3k7&`J`BfFBG{B|0GOWkN8)L7ldKcyE+?C?2lnSoXuvfQL z2N(1>Z*}Wl+IJRRM>@f^T=^F_mBIN8G!4cL+5JuUp`uj8&3Bl6Jc&`ONP9KHWoIR3 zp&wSu#+}YGD|_}J`u=o!32t=O5Ne$=!n8lb?!zzXq-fY(cAX+#F#+vqa-MJ0Yu(wA zSlGZ{c+Q7_&3!fBGcPkZCRi9WYyqz&`wlGy59(1#W{-XQv6Kn65AlsT`V4g35NQJ3 z)CZAHx3~@ovNQd{Kgg<j zo!5%gH1WorPXLiD{Pg5`ZrRe+^l9GBEak8W;-;~yfBx@LJk7hJv95{% zNEbFAEQGtzs~W&Ci_QGg_J?+w3q)p$|6+j1y?fj5HuxMVli!s4Et_Ur%g_j<82CVQ zoRN*8lSZkdBC5ibZh4=xZMkVYuT38XLcHu!nx*J~K4IeJn~yDn59|5x^GOxXur!>Ak*0Ujrc^;oqy{c`=Q|KPL&{zL9Lon@Bkvl%Gc=dp zSmn>#6Z_Zg8RgROta7(q{MlGBi(W;2XaZmh_v^={if4eU2r%;rqjZk}W@f zJmb!;f^6VOoQ9kMYh$wM7Y!qhpAtX~$Db_$;AnZ#xA{OvOzGmg&4LBGzuCp#xJ98e zk^H+tZ*8Vh=>Q+YCjH|xqSn;{cyQ^CuiE;)GAHPD z#_v82L8cAPa;XCriKSB9qg;%X7#OM8mDAlR{ptepwgV~n-<%jxOMC<7g3mq0(qEBV z40SpSqxrgdNW39IhJzcEQS7iC!R$dHtOg0>LhDnF_w_2=jHZxp?chqX(8&#QcIbt4{MCda>+pbKR#Rh@s4k@gp|nBc*6A@NED zo$Z-2vz}Q!8)pAf2QyIHOsm<(7qjR&u>wR0H7h2_N#+OKFBX;c30BF0L(tf+pNFoe#0#(z7+( zImeIB5zvg!kWWX#XO)H`P0W?qq~PZ8`t30-Vtq7d*heMqJNAf|7?&zW_uzN;LG2{+VMeoCgxp5 z{Cq4(K&Z#K(%Lmqx9P{S&VuceboOKdS2UE98A z282L7?-B96V-tH*lYbt}y{vnlIgF<5h<5I3~Wtqvuo?NMkiAI0klfc1sASB4p$4ZWJvEs6nVO*vPz<4sXi zQUe9Fouhz|2iFfoMS%vBZ2~}>yH4RD0a>4_!${#*s*k zx!6QCnj-~zC-mpXM5UxN=xU*-P~Mb;n$Hf-_9f;cyXxyF*U@)ioB(v98<@f$eeNFz z$^vUAj;TO9l2uF}7`TgRHW&xeAnYC|;b05M;0XtXlB86HiVxUR$u2!S%YB6`80Sx7 zYfLE^OgUSP4l3)@J4X-g2e4|5+Gf7GXa`Slsy^`1pg&)})0W-sCqX;`kGVhB$IZ`H zk$Rer9xC$2_1Nnj8wUJ)vjo@ep zNna9J?ecBNz{PZbE2Z-H4myv`!eToDFaO9Eu>{PKEfP*25j)zUU#)|&Qr!fmUp-7| z{Y;lk5jpar|ISh7A2#<~99LyiI~Kz-qN#&PC?U%Z10)H=4ilf=CZ$in4|4^1GcyRZfFqNyHMd8n+z%4Io_&YEF1asmvTAL`Yc|Ookr5o(Yvod1Slvu z8X?8i?KF~dD$%+jfQ$2OoDtc!($k1F$6fC`H3)8DQNTm*b1l8Dw0}(Cq_L}_5WK|dU#ZL@1Fa1Q>hnhf)RzDgh5l=@UaT~rD%MEWjIk53xKCPH zN3^P!(uiukt-|-r!li3>g6G|NhO>yjsBc6A(KUIlE#!TCkaE2hoa~ba({2xhHGxeK zJ;s>L0~1B|a9qqhMc`{#{rV*1ddSF}TSa&;MFD=p6OA^cg*c!6^tX2T=Oat)P!AK9Mw44fd|47Q?-BIdC7 za!x_fq2mp&S(9Kz*#`$`pCpv7;ra<}*Z6fbk>QM3!S!aP`idCwc5z|Yrl8E*uO9}M z3Po6Th&TnAA|~MP`=kc!yot=7l#t>|N^B9p%Kn|J1IS8eENSAS#}UM0DEpIJyE`$= z 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
X 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

    + * This controller demonstrates how to process an entity that is identified by a MongoDB ObjectId. + */ +public class SampleOidEntityController { + private static final UrlBuilder LOCATION_BUILDER = new DefaultUrlBuilder(); + private SampleOidEntityService service; + + public SampleOidEntityController(SampleOidEntityService sampleService) { + super(); + this.service = sampleService; + } + + public SampleOidEntity create(Request request, Response response) { + SampleOidEntity entity = request.getBodyAs(SampleOidEntity.class, "Resource details not provided"); + SampleOidEntity saved = service.create(entity); + + // Construct the response for create... + response.setResponseCreated(); + + // Include the Location header... + String locationPattern = request.getNamedUrl(HttpMethod.GET, Constants.Routes.SINGLE_OID_SAMPLE); + response.addLocationHeader(LOCATION_BUILDER.build(locationPattern, new DefaultTokenResolver())); + + // Return the newly-created resource... + return saved; + } + + public SampleOidEntity read(Request request, Response response) { + String id = request.getHeader(Constants.Url.SAMPLE_ID, "No resource ID supplied"); + SampleOidEntity entity = service.read(Identifiers.MONGOID.parse(id)); + + return entity; + } + + public List readAll(Request request, Response response) { + QueryFilter filter = QueryFilters.parseFrom(request); + QueryOrder order = QueryOrders.parseFrom(request); + QueryRange range = QueryRanges.parseFrom(request, 20); + List entities = service.readAll(filter, range, order); + long count = service.count(filter); + response.setCollectionResponse(range, entities.size(), count); + return entities; + } + + public void update(Request request, Response response) { + String id = request.getHeader(Constants.Url.SAMPLE_ID, "No resource ID supplied"); + SampleOidEntity entity = request.getBodyAs(SampleOidEntity.class, "Resource details not provided"); + entity.setId(Identifiers.MONGOID.parse(id)); + service.update(entity); + response.setResponseNoContent(); + } + + public void delete(Request request, Response response) { + String id = request.getHeader(Constants.Url.SAMPLE_ID, "No resource ID supplied"); + service.delete(Identifiers.MONGOID.parse(id)); + response.setResponseNoContent(); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/objectid/SampleOidEntityRepository.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/objectid/SampleOidEntityRepository.java new file mode 100644 index 0000000000..d003e04254 --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/objectid/SampleOidEntityRepository.java @@ -0,0 +1,12 @@ +package com.baeldung.restexpress.objectid; + +import com.mongodb.MongoClient; +import com.strategicgains.repoexpress.mongodb.MongodbEntityRepository; + +public class SampleOidEntityRepository + extends MongodbEntityRepository { + @SuppressWarnings("unchecked") + public SampleOidEntityRepository(MongoClient mongo, String dbName) { + super(mongo, dbName, SampleOidEntity.class); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/objectid/SampleOidEntityService.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/objectid/SampleOidEntityService.java new file mode 100644 index 0000000000..076fa57e6b --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/objectid/SampleOidEntityService.java @@ -0,0 +1,48 @@ +package com.baeldung.restexpress.objectid; + +import com.strategicgains.repoexpress.domain.Identifier; +import com.strategicgains.syntaxe.ValidationEngine; +import org.restexpress.common.query.QueryFilter; +import org.restexpress.common.query.QueryOrder; +import org.restexpress.common.query.QueryRange; + +import java.util.List; + +/** + * This is the 'service' or 'business logic' layer, where business logic, syntactic and semantic + * domain validation occurs, along with calls to the persistence layer. + */ +public class SampleOidEntityService { + private SampleOidEntityRepository samples; + + public SampleOidEntityService(SampleOidEntityRepository samplesRepository) { + super(); + this.samples = samplesRepository; + } + + public SampleOidEntity create(SampleOidEntity entity) { + ValidationEngine.validateAndThrow(entity); + return samples.create(entity); + } + + public SampleOidEntity read(Identifier id) { + return samples.read(id); + } + + public void update(SampleOidEntity entity) { + ValidationEngine.validateAndThrow(entity); + samples.update(entity); + } + + public void delete(Identifier id) { + samples.delete(id); + } + + public List readAll(QueryFilter filter, QueryRange range, QueryOrder order) { + return samples.readAll(filter, range, order); + } + + public long count(QueryFilter filter) { + return samples.count(filter); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/JsonSerializationProcessor.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/JsonSerializationProcessor.java new file mode 100644 index 0000000000..e9487878f0 --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/JsonSerializationProcessor.java @@ -0,0 +1,35 @@ +package com.baeldung.restexpress.serialization; + +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.strategicgains.hyperexpress.domain.hal.HalResource; +import com.strategicgains.hyperexpress.serialization.jackson.HalResourceDeserializer; +import com.strategicgains.hyperexpress.serialization.jackson.HalResourceSerializer; +import org.bson.types.ObjectId; +import org.restexpress.ContentType; +import org.restexpress.serialization.json.JacksonJsonProcessor; + +import java.util.UUID; + +public class JsonSerializationProcessor + extends JacksonJsonProcessor { + public JsonSerializationProcessor() { + super(); + addSupportedMediaTypes(ContentType.HAL_JSON); + } + + @Override + protected void initializeModule(SimpleModule module) { + super.initializeModule(module); + // For UUID as entity identifiers... + module.addDeserializer(UUID.class, new UuidDeserializer()); + module.addSerializer(UUID.class, new UuidSerializer()); + + // For MongoDB ObjectId as entity identifiers... + module.addDeserializer(ObjectId.class, new ObjectIdDeserializer()); + module.addSerializer(ObjectId.class, new ObjectIdSerializer()); + + // Support HalResource (de)serialization. + module.addDeserializer(HalResource.class, new HalResourceDeserializer()); + module.addSerializer(HalResource.class, new HalResourceSerializer()); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/ObjectIdDeserializer.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/ObjectIdDeserializer.java new file mode 100644 index 0000000000..84c1aca83b --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/ObjectIdDeserializer.java @@ -0,0 +1,19 @@ +package com.baeldung.restexpress.serialization; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.strategicgains.repoexpress.mongodb.Identifiers; +import org.bson.types.ObjectId; + +import java.io.IOException; + +public class ObjectIdDeserializer + extends JsonDeserializer { + @Override + public ObjectId deserialize(JsonParser json, DeserializationContext context) + throws IOException, JsonProcessingException { + return (ObjectId) Identifiers.MONGOID.parse(json.getText()).primaryKey(); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/ObjectIdSerializer.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/ObjectIdSerializer.java new file mode 100644 index 0000000000..8c3e63b7f8 --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/ObjectIdSerializer.java @@ -0,0 +1,18 @@ +package com.baeldung.restexpress.serialization; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import org.bson.types.ObjectId; + +import java.io.IOException; + +public class ObjectIdSerializer + extends JsonSerializer { + @Override + public void serialize(ObjectId objectId, JsonGenerator json, SerializerProvider provider) + throws IOException, JsonProcessingException { + json.writeString(objectId.toString()); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/SerializationProvider.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/SerializationProvider.java new file mode 100644 index 0000000000..cb619be84f --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/SerializationProvider.java @@ -0,0 +1,29 @@ +package com.baeldung.restexpress.serialization; + +import org.restexpress.response.ErrorResponseWrapper; +import org.restexpress.response.ResponseWrapper; +import org.restexpress.serialization.AbstractSerializationProvider; +import org.restexpress.serialization.SerializationProcessor; + +public class SerializationProvider + extends AbstractSerializationProvider { + // SECTION: CONSTANTS + + private static final SerializationProcessor JSON_SERIALIZER = new JsonSerializationProcessor(); + private static final SerializationProcessor XML_SERIALIZER = new XmlSerializationProcessor(); + private static final ResponseWrapper RESPONSE_WRAPPER = new ErrorResponseWrapper(); + + public SerializationProvider() { + super(); + add(JSON_SERIALIZER, RESPONSE_WRAPPER, true); + add(XML_SERIALIZER, RESPONSE_WRAPPER); + } + + public static SerializationProcessor json() { + return JSON_SERIALIZER; + } + + public static SerializationProcessor xml() { + return XML_SERIALIZER; + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/UuidDeserializer.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/UuidDeserializer.java new file mode 100644 index 0000000000..ce676edff5 --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/UuidDeserializer.java @@ -0,0 +1,19 @@ +package com.baeldung.restexpress.serialization; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.strategicgains.repoexpress.util.UuidConverter; + +import java.io.IOException; +import java.util.UUID; + +public class UuidDeserializer + extends JsonDeserializer { + @Override + public UUID deserialize(JsonParser json, DeserializationContext context) + throws IOException, JsonProcessingException { + return UuidConverter.parse(json.getText()); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/UuidFormatter.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/UuidFormatter.java new file mode 100644 index 0000000000..c337dbeafd --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/UuidFormatter.java @@ -0,0 +1,14 @@ +package com.baeldung.restexpress.serialization; + +import com.strategicgains.hyperexpress.annotation.TokenFormatter; +import com.strategicgains.repoexpress.util.UuidConverter; + +import java.util.UUID; + +public class UuidFormatter + implements TokenFormatter { + @Override + public String format(Object field) { + return UuidConverter.format((UUID) field); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/UuidSerializer.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/UuidSerializer.java new file mode 100644 index 0000000000..4349e6d144 --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/UuidSerializer.java @@ -0,0 +1,19 @@ +package com.baeldung.restexpress.serialization; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.strategicgains.repoexpress.util.UuidConverter; + +import java.io.IOException; +import java.util.UUID; + +public class UuidSerializer + extends JsonSerializer { + @Override + public void serialize(UUID objectId, JsonGenerator json, SerializerProvider provider) + throws IOException, JsonProcessingException { + json.writeString(UuidConverter.format(objectId)); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/XmlSerializationProcessor.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/XmlSerializationProcessor.java new file mode 100644 index 0000000000..e1bdd229c1 --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/XmlSerializationProcessor.java @@ -0,0 +1,18 @@ +package com.baeldung.restexpress.serialization; + +import com.baeldung.restexpress.uuid.SampleUuidEntity; +import org.restexpress.serialization.xml.XstreamXmlProcessor; + +public class XmlSerializationProcessor + extends XstreamXmlProcessor { + public XmlSerializationProcessor() { + super(); + alias("sample", SampleUuidEntity.class); +// alias("element_name", Element.class); +// alias("element_name", Element.class); +// alias("element_name", Element.class); +// alias("element_name", Element.class); + registerConverter(new XstreamUuidConverter()); + registerConverter(new XstreamOidConverter()); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/XstreamOidConverter.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/XstreamOidConverter.java new file mode 100644 index 0000000000..5eb53814fb --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/XstreamOidConverter.java @@ -0,0 +1,28 @@ +package com.baeldung.restexpress.serialization; + +import com.strategicgains.repoexpress.mongodb.Identifiers; +import com.thoughtworks.xstream.converters.SingleValueConverter; +import org.bson.types.ObjectId; + +/** + * @author toddf + * @since Feb 16, 2011 + */ +public class XstreamOidConverter + implements SingleValueConverter { + @SuppressWarnings("rawtypes") + @Override + public boolean canConvert(Class aClass) { + return ObjectId.class.isAssignableFrom(aClass); + } + + @Override + public Object fromString(String value) { + return (ObjectId) Identifiers.MONGOID.parse(value).primaryKey(); + } + + @Override + public String toString(Object objectId) { + return ((ObjectId) objectId).toString(); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/XstreamUuidConverter.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/XstreamUuidConverter.java new file mode 100644 index 0000000000..82f34bc36d --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/XstreamUuidConverter.java @@ -0,0 +1,29 @@ +package com.baeldung.restexpress.serialization; + +import com.strategicgains.repoexpress.util.UuidConverter; +import com.thoughtworks.xstream.converters.SingleValueConverter; + +import java.util.UUID; + +/** + * @author toddf + * @since Feb 16, 2011 + */ +public class XstreamUuidConverter + implements SingleValueConverter { + @SuppressWarnings("rawtypes") + @Override + public boolean canConvert(Class aClass) { + return UUID.class.isAssignableFrom(aClass); + } + + @Override + public Object fromString(String value) { + return UuidConverter.parse(value); + } + + @Override + public String toString(Object objectId) { + return UuidConverter.format((UUID) objectId); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/uuid/SampleUuidEntity.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/uuid/SampleUuidEntity.java new file mode 100644 index 0000000000..724e681700 --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/uuid/SampleUuidEntity.java @@ -0,0 +1,23 @@ +package com.baeldung.restexpress.uuid; + +import com.baeldung.restexpress.Constants; +import com.baeldung.restexpress.serialization.UuidFormatter; +import com.strategicgains.hyperexpress.annotation.BindToken; +import com.strategicgains.hyperexpress.annotation.TokenBindings; +import com.strategicgains.repoexpress.mongodb.AbstractUuidMongodbEntity; +import org.restexpress.plugin.hyperexpress.Linkable; + +/** + * This is a sample entity identified by a UUID (instead of a MongoDB ObjectID). + * It also contains createdAt and updatedAt properties that are automatically maintained + * by the persistence layer (SampleUuidEntityRepository). + */ +@TokenBindings({ + @BindToken(value = Constants.Url.SAMPLE_ID, field = "id", formatter = UuidFormatter.class) +}) +public class SampleUuidEntity + extends AbstractUuidMongodbEntity + implements Linkable { + public SampleUuidEntity() { + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/uuid/SampleUuidEntityController.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/uuid/SampleUuidEntityController.java new file mode 100644 index 0000000000..addd94ee3b --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/uuid/SampleUuidEntityController.java @@ -0,0 +1,79 @@ +package com.baeldung.restexpress.uuid; + +import com.baeldung.restexpress.Constants; +import com.strategicgains.hyperexpress.builder.DefaultTokenResolver; +import com.strategicgains.hyperexpress.builder.DefaultUrlBuilder; +import com.strategicgains.hyperexpress.builder.UrlBuilder; +import com.strategicgains.repoexpress.adapter.Identifiers; +import io.netty.handler.codec.http.HttpMethod; +import org.restexpress.Request; +import org.restexpress.Response; +import org.restexpress.common.query.QueryFilter; +import org.restexpress.common.query.QueryOrder; +import org.restexpress.common.query.QueryRange; +import org.restexpress.query.QueryFilters; +import org.restexpress.query.QueryOrders; +import org.restexpress.query.QueryRanges; + +import java.util.List; + +/** + * This is the 'controller' layer, where HTTP details are converted to domain concepts and passed to the service layer. + * Then service layer response information is enhanced with HTTP details, if applicable, for the response. + *

    + * This controller demonstrates how to process a MongoDB entity that is identified by a UUID. + */ +public class SampleUuidEntityController { + private static final UrlBuilder LOCATION_BUILDER = new DefaultUrlBuilder(); + private SampleUuidEntityService service; + + public SampleUuidEntityController(SampleUuidEntityService sampleService) { + super(); + this.service = sampleService; + } + + public SampleUuidEntity create(Request request, Response response) { + SampleUuidEntity entity = request.getBodyAs(SampleUuidEntity.class, "Resource details not provided"); + SampleUuidEntity saved = service.create(entity); + + // Construct the response for create... + response.setResponseCreated(); + + // Include the Location header... + String locationPattern = request.getNamedUrl(HttpMethod.GET, Constants.Routes.SINGLE_UUID_SAMPLE); + response.addLocationHeader(LOCATION_BUILDER.build(locationPattern, new DefaultTokenResolver())); + + // Return the newly-created resource... + return saved; + } + + public SampleUuidEntity read(Request request, Response response) { + String id = request.getHeader(Constants.Url.SAMPLE_ID, "No resource ID supplied"); + SampleUuidEntity entity = service.read(Identifiers.UUID.parse(id)); + return entity; + } + + public List readAll(Request request, Response response) { + QueryFilter filter = QueryFilters.parseFrom(request); + QueryOrder order = QueryOrders.parseFrom(request); + QueryRange range = QueryRanges.parseFrom(request, 20); + List entities = service.readAll(filter, range, order); + long count = service.count(filter); + response.setCollectionResponse(range, entities.size(), count); + return entities; + } + + public void update(Request request, Response response) { + String id = request.getHeader(Constants.Url.SAMPLE_ID, "No resource ID supplied"); + SampleUuidEntity entity = request.getBodyAs(SampleUuidEntity.class, "Resource details not provided"); + entity.setId(Identifiers.UUID.parse(id)); + service.update(entity); + response.setResponseNoContent(); + } + + public void delete(Request request, Response response) { + String id = request.getHeader(Constants.Url.SAMPLE_ID, "No resource ID supplied"); + service.delete(Identifiers.UUID.parse(id)); + response.setResponseNoContent(); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/uuid/SampleUuidEntityRepository.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/uuid/SampleUuidEntityRepository.java new file mode 100644 index 0000000000..0b5eef1ea6 --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/uuid/SampleUuidEntityRepository.java @@ -0,0 +1,12 @@ +package com.baeldung.restexpress.uuid; + +import com.mongodb.MongoClient; +import com.strategicgains.repoexpress.mongodb.MongodbUuidEntityRepository; + +public class SampleUuidEntityRepository + extends MongodbUuidEntityRepository { + @SuppressWarnings("unchecked") + public SampleUuidEntityRepository(MongoClient mongo, String dbName) { + super(mongo, dbName, SampleUuidEntity.class); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/uuid/SampleUuidEntityService.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/uuid/SampleUuidEntityService.java new file mode 100644 index 0000000000..57a1c18d05 --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/uuid/SampleUuidEntityService.java @@ -0,0 +1,48 @@ +package com.baeldung.restexpress.uuid; + +import com.strategicgains.repoexpress.domain.Identifier; +import com.strategicgains.syntaxe.ValidationEngine; +import org.restexpress.common.query.QueryFilter; +import org.restexpress.common.query.QueryOrder; +import org.restexpress.common.query.QueryRange; + +import java.util.List; + +/** + * This is the 'service' or 'business logic' layer, where business logic, syntactic and semantic + * domain validation occurs, along with calls to the persistence layer. + */ +public class SampleUuidEntityService { + private SampleUuidEntityRepository samples; + + public SampleUuidEntityService(SampleUuidEntityRepository samplesRepository) { + super(); + this.samples = samplesRepository; + } + + public SampleUuidEntity create(SampleUuidEntity entity) { + ValidationEngine.validateAndThrow(entity); + return samples.create(entity); + } + + public SampleUuidEntity read(Identifier id) { + return samples.read(id); + } + + public void update(SampleUuidEntity entity) { + ValidationEngine.validateAndThrow(entity); + samples.update(entity); + } + + public void delete(Identifier id) { + samples.delete(id); + } + + public List readAll(QueryFilter filter, QueryRange range, QueryOrder order) { + return samples.readAll(filter, range, order); + } + + public long count(QueryFilter filter) { + return samples.count(filter); + } +} diff --git a/microservices-modules/rest-express/src/main/resources/config/dev/environment.properties b/microservices-modules/rest-express/src/main/resources/config/dev/environment.properties new file mode 100644 index 0000000000..b81f9a84cb --- /dev/null +++ b/microservices-modules/rest-express/src/main/resources/config/dev/environment.properties @@ -0,0 +1,22 @@ +# Default is 8081 +port = 8081 + +# The size of the executor thread pool (that can handle blocking back-end processing). +executor.threadPool.size = 20 + +# A MongoDB URI/Connection string +# see: http://docs.mongodb.org/manual/reference/connection-string/ +mongodb.uri = mongodb://localhost:27017/scaffolding_mongodb + +# The base URL, used as a prefix for links returned in data +# default is http://localhost: +#base.url = http://localhost:8081 + +#Configuration for the MetricsPlugin/Graphite +metrics.isEnabled = true +#metrics.machineName = +metrics.prefix = web1.example.com +metrics.graphite.isEnabled = false +metrics.graphite.host = graphite.example.com +metrics.graphite.port = 2003 +metrics.graphite.publishSeconds = 60 \ No newline at end of file From 7a202296a73440b1078c2af8d991dc41bff0772b Mon Sep 17 00:00:00 2001 From: Abhinav Pandey Date: Wed, 11 Jan 2023 22:44:58 +0530 Subject: [PATCH 254/592] Bael 5884 - correction (#13276) * BAEL-5884 - URI encoding with Rest Template * BAEL-5884 - URI encoding with Rest Template - indentation corrected * BAEL-5884 - code correction for rest template config --- .../java/com/baeldung/encoding/config/RestTemplateConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateConfig.java b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateConfig.java index a39ba55ccc..a820a3d4cb 100644 --- a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateConfig.java +++ b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/encoding/config/RestTemplateConfig.java @@ -13,7 +13,7 @@ public class RestTemplateConfig { RestTemplate restTemplate = new RestTemplate(); DefaultUriBuilderFactory defaultUriBuilderFactory = new DefaultUriBuilderFactory(); defaultUriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY); - restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory()); + restTemplate.setUriTemplateHandler(defaultUriBuilderFactory); return restTemplate; } } \ No newline at end of file From f396ff0341117d7020234541840bda3a599e3f8e Mon Sep 17 00:00:00 2001 From: cesarevalenti90 <50798547+cesarevalenti90@users.noreply.github.com> Date: Wed, 11 Jan 2023 22:25:43 +0100 Subject: [PATCH 255/592] BAEL-6057 - Implementing Retry In Kafka Consumer (#13274) * BAEL-6057 - Implementing Retry In Kafka Consumer (moved code example to new module) * BAEL-6057 - Implementing Retry In Kafka Consumer (fix on README.md) Co-authored-by: Cesare --- spring-kafka-2/README.md | 7 + spring-kafka-2/pom.xml | 70 ++++++++ .../com/baeldung/spring/kafka/Farewell.java | 37 +++++ .../com/baeldung/spring/kafka/Greeting.java | 37 +++++ .../spring/kafka/KafkaConsumerConfig.java | 152 ++++++++++++++++++ .../spring/kafka/KafkaProducerConfig.java | 67 ++++++++ .../spring/kafka/KafkaTopicConfig.java | 77 +++++++++ .../spring/kafka/MultiTypeKafkaListener.java | 32 ++++ .../kafka/RetryableApplicationKafkaApp.java | 0 .../src/main/resources/application.properties | 20 +++ spring-kafka-2/src/main/resources/logback.xml | 13 ++ .../kafka/KafkaRetryableIntegrationTest.java | 0 .../src/test/resources/application.yml | 14 ++ .../src/test/resources/logback-test.xml | 19 +++ .../spring/kafka/KafkaConsumerConfig.java | 35 +--- .../spring/kafka/MultiTypeKafkaListener.java | 6 - .../src/main/resources/application.properties | 3 - 17 files changed, 548 insertions(+), 41 deletions(-) create mode 100644 spring-kafka-2/README.md create mode 100644 spring-kafka-2/pom.xml create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/Farewell.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/Greeting.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaProducerConfig.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaTopicConfig.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java rename {spring-kafka => spring-kafka-2}/src/main/java/com/baeldung/spring/kafka/RetryableApplicationKafkaApp.java (100%) create mode 100644 spring-kafka-2/src/main/resources/application.properties create mode 100644 spring-kafka-2/src/main/resources/logback.xml rename {spring-kafka => spring-kafka-2}/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java (100%) create mode 100644 spring-kafka-2/src/test/resources/application.yml create mode 100644 spring-kafka-2/src/test/resources/logback-test.xml diff --git a/spring-kafka-2/README.md b/spring-kafka-2/README.md new file mode 100644 index 0000000000..76c090342d --- /dev/null +++ b/spring-kafka-2/README.md @@ -0,0 +1,7 @@ +## Spring Kafka 2 + +This module contains articles about Spring with Kafka + +### Relevant articles + +- [Implementing Retry In Kafka Consumer] diff --git a/spring-kafka-2/pom.xml b/spring-kafka-2/pom.xml new file mode 100644 index 0000000000..d51c2e300f --- /dev/null +++ b/spring-kafka-2/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + spring-kafka + spring-kafka + Intro to Kafka with Spring + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.kafka + spring-kafka + + + org.apache.kafka + kafka-streams + + + com.fasterxml.jackson.core + jackson-databind + + + org.projectlombok + lombok + + + org.springframework.kafka + spring-kafka-test + test + + + org.testcontainers + kafka + ${testcontainers-kafka.version} + test + + + org.testcontainers + junit-jupiter + ${testcontainers-kafka.version} + test + + + org.awaitility + awaitility + test + + + + + 1.16.2 + + + \ No newline at end of file diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/Farewell.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/Farewell.java new file mode 100644 index 0000000000..bbff315ad2 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/Farewell.java @@ -0,0 +1,37 @@ +package com.baeldung.spring.kafka; + +public class Farewell { + + private String message; + private Integer remainingMinutes; + + public Farewell() { + } + + public Farewell(String message, Integer remainingMinutes) { + this.message = message; + this.remainingMinutes = remainingMinutes; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getRemainingMinutes() { + return remainingMinutes; + } + + public void setRemainingMinutes(Integer remainingMinutes) { + this.remainingMinutes = remainingMinutes; + } + + @Override + public String toString() { + return message + ". In " + remainingMinutes + "!"; + } + +} diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/Greeting.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/Greeting.java new file mode 100644 index 0000000000..b4633e802a --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/Greeting.java @@ -0,0 +1,37 @@ +package com.baeldung.spring.kafka; + +public class Greeting { + + private String msg; + private String name; + + public Greeting() { + + } + + public Greeting(String msg, String name) { + this.msg = msg; + this.name = name; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return msg + ", " + name + "!"; + } +} diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java new file mode 100644 index 0000000000..463d3209ea --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java @@ -0,0 +1,152 @@ +package com.baeldung.spring.kafka; + +import java.net.SocketTimeoutException; +import java.util.HashMap; +import java.util.Map; + +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.context.annotation.Primary; +import org.springframework.kafka.annotation.EnableKafka; +import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; +import org.springframework.kafka.core.ConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaConsumerFactory; +import org.springframework.kafka.listener.ContainerProperties; +import org.springframework.kafka.listener.DefaultErrorHandler; +import org.springframework.kafka.support.converter.RecordMessageConverter; +import org.springframework.kafka.support.converter.StringJsonMessageConverter; +import org.springframework.kafka.support.mapping.DefaultJackson2JavaTypeMapper; +import org.springframework.kafka.support.mapping.Jackson2JavaTypeMapper; +import org.springframework.kafka.support.serializer.JsonDeserializer; +import org.springframework.util.backoff.BackOff; +import org.springframework.util.backoff.FixedBackOff; + +@EnableKafka +@Configuration +public class KafkaConsumerConfig { + + @Value(value = "${spring.kafka.bootstrap-servers}") + private String bootstrapAddress; + + @Value(value = "${kafka.backoff.interval}") + private Long interval; + + @Value(value = "${kafka.backoff.max_failure}") + private Long maxAttempts; + + public ConsumerFactory consumerFactory(String groupId) { + Map props = new HashMap<>(); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); + props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + props.put(ConsumerConfig.MAX_PARTITION_FETCH_BYTES_CONFIG, "20971520"); + props.put(ConsumerConfig.FETCH_MAX_BYTES_CONFIG, "20971520"); + return new DefaultKafkaConsumerFactory<>(props); + } + + public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory(String groupId) { + ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(consumerFactory(groupId)); + return factory; + } + + @Bean + public ConcurrentKafkaListenerContainerFactory fooKafkaListenerContainerFactory() { + return kafkaListenerContainerFactory("foo"); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory barKafkaListenerContainerFactory() { + return kafkaListenerContainerFactory("bar"); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory headersKafkaListenerContainerFactory() { + return kafkaListenerContainerFactory("headers"); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory partitionsKafkaListenerContainerFactory() { + return kafkaListenerContainerFactory("partitions"); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory longMessageKafkaListenerContainerFactory() { + return kafkaListenerContainerFactory("longMessage"); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory filterKafkaListenerContainerFactory() { + ConcurrentKafkaListenerContainerFactory factory = kafkaListenerContainerFactory("filter"); + factory.setRecordFilterStrategy(record -> record.value() + .contains("World")); + return factory; + } + + public ConsumerFactory greetingConsumerFactory() { + Map props = new HashMap<>(); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); + props.put(ConsumerConfig.GROUP_ID_CONFIG, "greeting"); + return new DefaultKafkaConsumerFactory<>(props, new StringDeserializer(), new JsonDeserializer<>(Greeting.class)); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory() { + ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(greetingConsumerFactory()); + return factory; + } + + @Bean + public RecordMessageConverter multiTypeConverter() { + StringJsonMessageConverter converter = new StringJsonMessageConverter(); + DefaultJackson2JavaTypeMapper typeMapper = new DefaultJackson2JavaTypeMapper(); + typeMapper.setTypePrecedence(Jackson2JavaTypeMapper.TypePrecedence.TYPE_ID); + typeMapper.addTrustedPackages("com.baeldung.spring.kafka"); + Map> mappings = new HashMap<>(); + mappings.put("greeting", Greeting.class); + mappings.put("farewell", Farewell.class); + typeMapper.setIdClassMapping(mappings); + converter.setTypeMapper(typeMapper); + return converter; + } + + @Bean + public ConsumerFactory multiTypeConsumerFactory() { + HashMap 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, JsonDeserializer.class); + props.put(ConsumerConfig.GROUP_ID_CONFIG, "group_id_test"); + return new DefaultKafkaConsumerFactory<>(props); + } + + @Bean + @Primary + public ConcurrentKafkaListenerContainerFactory greetingKafkaListenerContainerFactory() { + ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(multiTypeConsumerFactory()); + factory.setMessageConverter(multiTypeConverter()); + factory.setCommonErrorHandler(errorHandler()); + factory.getContainerProperties() + .setAckMode(ContainerProperties.AckMode.RECORD); + return factory; + } + + @Bean + public DefaultErrorHandler errorHandler() { + BackOff fixedBackOff = new FixedBackOff(interval, maxAttempts); + DefaultErrorHandler errorHandler = new DefaultErrorHandler((consumerRecord, e) -> { + System.out.println(String.format("consumed record %s because this exception was thrown",consumerRecord.toString(),e.getClass().getName())); + }, fixedBackOff); + //Commented because of the test + //errorHandler.addRetryableExceptions(SocketTimeoutException.class,RuntimeException.class); + errorHandler.addNotRetryableExceptions(NullPointerException.class); + return errorHandler; + } + +} diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaProducerConfig.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaProducerConfig.java new file mode 100644 index 0000000000..da8b2bd1a6 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaProducerConfig.java @@ -0,0 +1,67 @@ +package com.baeldung.spring.kafka; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.kafka.clients.producer.ProducerConfig; +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 org.springframework.kafka.support.serializer.JsonSerializer; + +@Configuration +public class KafkaProducerConfig { + + @Value(value = "${spring.kafka.bootstrap-servers}") + private String bootstrapAddress; + + @Bean + public ProducerFactory producerFactory() { + 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, StringSerializer.class); + configProps.put(ProducerConfig.MAX_REQUEST_SIZE_CONFIG, "20971520"); + + return new DefaultKafkaProducerFactory<>(configProps); + } + + @Bean + public KafkaTemplate kafkaTemplate() { + return new KafkaTemplate<>(producerFactory()); + } + + @Bean + public ProducerFactory greetingProducerFactory() { + 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, JsonSerializer.class); + return new DefaultKafkaProducerFactory<>(configProps); + } + + @Bean + public KafkaTemplate greetingKafkaTemplate() { + return new KafkaTemplate<>(greetingProducerFactory()); + } + + @Bean + public ProducerFactory multiTypeProducerFactory() { + 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, JsonSerializer.class); + configProps.put(JsonSerializer.TYPE_MAPPINGS, "greeting:com.baeldung.spring.kafka.Greeting, farewell:com.baeldung.spring.kafka.Farewell"); + return new DefaultKafkaProducerFactory<>(configProps); + } + + @Bean + public KafkaTemplate multiTypeKafkaTemplate() { + return new KafkaTemplate<>(multiTypeProducerFactory()); + } + +} diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaTopicConfig.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaTopicConfig.java new file mode 100644 index 0000000000..6a20915699 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaTopicConfig.java @@ -0,0 +1,77 @@ +package com.baeldung.spring.kafka; + +import java.util.HashMap; +import java.util.Map; + +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.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.core.KafkaAdmin; + +@Configuration +public class KafkaTopicConfig { + + @Value(value = "${spring.kafka.bootstrap-servers}") + private String bootstrapAddress; + + @Value(value = "${message.topic.name}") + private String topicName; + + @Value(value = "${long.message.topic.name}") + private String longMsgTopicName; + + @Value(value = "${partitioned.topic.name}") + private String partitionedTopicName; + + @Value(value = "${filtered.topic.name}") + private String filteredTopicName; + + @Value(value = "${greeting.topic.name}") + private String greetingTopicName; + + @Value(value = "${multi.type.topic.name}") + private String multiTypeTopicName; + + @Bean + public KafkaAdmin kafkaAdmin() { + Map configs = new HashMap<>(); + configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); + return new KafkaAdmin(configs); + } + + @Bean + public NewTopic topic1() { + return new NewTopic(topicName, 1, (short) 1); + } + + @Bean + public NewTopic topic2() { + return new NewTopic(partitionedTopicName, 6, (short) 1); + } + + @Bean + public NewTopic topic3() { + return new NewTopic(filteredTopicName, 1, (short) 1); + } + + @Bean + public NewTopic topic4() { + return new NewTopic(greetingTopicName, 1, (short) 1); + } + + @Bean + public NewTopic topic5() { + NewTopic newTopic = new NewTopic(longMsgTopicName, 1, (short) 1); + Map configs = new HashMap<>(); + configs.put("max.message.bytes", "20971520"); + newTopic.configs(configs); + return newTopic; + } + + @Bean + public NewTopic multiTypeTopic() { + return new NewTopic(multiTypeTopicName, 1, (short) 1); + } +} diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java new file mode 100644 index 0000000000..6c4d78171b --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java @@ -0,0 +1,32 @@ +package com.baeldung.spring.kafka; + +import org.springframework.kafka.annotation.KafkaHandler; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.messaging.MessagingException; +import org.springframework.stereotype.Component; + +@Component +@KafkaListener(id = "multiGroup", topics = "multitype") +public class MultiTypeKafkaListener { + + @KafkaHandler + //@RetryableTopic(backoff = @Backoff(value = 3000L), attempts = "5", autoCreateTopics = "false",include = SocketTimeoutException.class, exclude = NullPointerException.class) + public void handleGreeting(Greeting greeting) { + if (greeting.getName() + .equalsIgnoreCase("test")) { + throw new MessagingException("test not allowed"); + } + System.out.println("Greeting received: " + greeting); + } + + @KafkaHandler + public void handleF(Farewell farewell) { + System.out.println("Farewell received: " + farewell); + } + + @KafkaHandler(isDefault = true) + public void unknown(Object object) { + System.out.println("Unkown type received: " + object); + } + +} diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/RetryableApplicationKafkaApp.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/RetryableApplicationKafkaApp.java similarity index 100% rename from spring-kafka/src/main/java/com/baeldung/spring/kafka/RetryableApplicationKafkaApp.java rename to spring-kafka-2/src/main/java/com/baeldung/spring/kafka/RetryableApplicationKafkaApp.java diff --git a/spring-kafka-2/src/main/resources/application.properties b/spring-kafka-2/src/main/resources/application.properties new file mode 100644 index 0000000000..691b6f55b7 --- /dev/null +++ b/spring-kafka-2/src/main/resources/application.properties @@ -0,0 +1,20 @@ +spring.kafka.bootstrap-servers=localhost:9092 +message.topic.name=baeldung +long.message.topic.name=longMessage +greeting.topic.name=greeting +filtered.topic.name=filtered +partitioned.topic.name=partitioned +multi.type.topic.name=multitype +# monitoring - lag analysis +monitor.kafka.bootstrap.config=localhost:9092 +monitor.kafka.consumer.groupid=baeldungGrp +monitor.topic.name=baeldung +# monitoring - simulation +monitor.producer.simulate=true +monitor.consumer.simulate=true +monitor.kafka.consumer.groupid.simulate=baeldungGrpSimulate +test.topic=testtopic1 +kafka.backoff.interval=9000 +kafka.backoff.max_failure=5 + + diff --git a/spring-kafka-2/src/main/resources/logback.xml b/spring-kafka-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/spring-kafka-2/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/spring-kafka/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java similarity index 100% rename from spring-kafka/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java rename to spring-kafka-2/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java diff --git a/spring-kafka-2/src/test/resources/application.yml b/spring-kafka-2/src/test/resources/application.yml new file mode 100644 index 0000000000..8b245f08b1 --- /dev/null +++ b/spring-kafka-2/src/test/resources/application.yml @@ -0,0 +1,14 @@ +spring: + kafka: + consumer: + auto-offset-reset: earliest + group-id: baeldung +test: + topic: embedded-test-topic + +monitor: + kafka: + bootstrap: + config: "PLAINTEXT://localhost:9085" + consumer: + groupid: "baeldungGrp" diff --git a/spring-kafka-2/src/test/resources/logback-test.xml b/spring-kafka-2/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..74f126ebc1 --- /dev/null +++ b/spring-kafka-2/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-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java index 463d3209ea..e8aa63a88d 100644 --- a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java +++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java @@ -1,6 +1,5 @@ package com.baeldung.spring.kafka; -import java.net.SocketTimeoutException; import java.util.HashMap; import java.util.Map; @@ -9,20 +8,15 @@ 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.context.annotation.Primary; import org.springframework.kafka.annotation.EnableKafka; import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; import org.springframework.kafka.core.ConsumerFactory; import org.springframework.kafka.core.DefaultKafkaConsumerFactory; -import org.springframework.kafka.listener.ContainerProperties; -import org.springframework.kafka.listener.DefaultErrorHandler; import org.springframework.kafka.support.converter.RecordMessageConverter; import org.springframework.kafka.support.converter.StringJsonMessageConverter; import org.springframework.kafka.support.mapping.DefaultJackson2JavaTypeMapper; import org.springframework.kafka.support.mapping.Jackson2JavaTypeMapper; import org.springframework.kafka.support.serializer.JsonDeserializer; -import org.springframework.util.backoff.BackOff; -import org.springframework.util.backoff.FixedBackOff; @EnableKafka @Configuration @@ -31,12 +25,6 @@ public class KafkaConsumerConfig { @Value(value = "${spring.kafka.bootstrap-servers}") private String bootstrapAddress; - @Value(value = "${kafka.backoff.interval}") - private Long interval; - - @Value(value = "${kafka.backoff.max_failure}") - private Long maxAttempts; - public ConsumerFactory consumerFactory(String groupId) { Map props = new HashMap<>(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); @@ -83,7 +71,7 @@ public class KafkaConsumerConfig { public ConcurrentKafkaListenerContainerFactory filterKafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory factory = kafkaListenerContainerFactory("filter"); factory.setRecordFilterStrategy(record -> record.value() - .contains("World")); + .contains("World")); return factory; } @@ -95,7 +83,7 @@ public class KafkaConsumerConfig { } @Bean - public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory() { + public ConcurrentKafkaListenerContainerFactory greetingKafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); factory.setConsumerFactory(greetingConsumerFactory()); return factory; @@ -121,32 +109,15 @@ public class KafkaConsumerConfig { props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class); - props.put(ConsumerConfig.GROUP_ID_CONFIG, "group_id_test"); return new DefaultKafkaConsumerFactory<>(props); } @Bean - @Primary - public ConcurrentKafkaListenerContainerFactory greetingKafkaListenerContainerFactory() { + public ConcurrentKafkaListenerContainerFactory multiTypeKafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); factory.setConsumerFactory(multiTypeConsumerFactory()); factory.setMessageConverter(multiTypeConverter()); - factory.setCommonErrorHandler(errorHandler()); - factory.getContainerProperties() - .setAckMode(ContainerProperties.AckMode.RECORD); return factory; } - @Bean - public DefaultErrorHandler errorHandler() { - BackOff fixedBackOff = new FixedBackOff(interval, maxAttempts); - DefaultErrorHandler errorHandler = new DefaultErrorHandler((consumerRecord, e) -> { - System.out.println(String.format("consumed record %s because this exception was thrown",consumerRecord.toString(),e.getClass().getName())); - }, fixedBackOff); - //Commented because of the test - //errorHandler.addRetryableExceptions(SocketTimeoutException.class,RuntimeException.class); - errorHandler.addNotRetryableExceptions(NullPointerException.class); - return errorHandler; - } - } diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java index 4b43c84f15..9afb5ff0b6 100644 --- a/spring-kafka/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java +++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java @@ -2,7 +2,6 @@ package com.baeldung.spring.kafka; import org.springframework.kafka.annotation.KafkaHandler; import org.springframework.kafka.annotation.KafkaListener; -import org.springframework.messaging.MessagingException; import org.springframework.stereotype.Component; @Component @@ -10,12 +9,7 @@ import org.springframework.stereotype.Component; public class MultiTypeKafkaListener { @KafkaHandler - //@RetryableTopic(backoff = @Backoff(value = 3000L), attempts = "5", autoCreateTopics = "false",include = SocketTimeoutException.class, exclude = NullPointerException.class) public void handleGreeting(Greeting greeting) { - if (greeting.getName() - .equalsIgnoreCase("test")) { - throw new MessagingException("test not allowed"); - } System.out.println("Greeting received: " + greeting); } diff --git a/spring-kafka/src/main/resources/application.properties b/spring-kafka/src/main/resources/application.properties index 691b6f55b7..c57537e2af 100644 --- a/spring-kafka/src/main/resources/application.properties +++ b/spring-kafka/src/main/resources/application.properties @@ -14,7 +14,4 @@ monitor.producer.simulate=true monitor.consumer.simulate=true monitor.kafka.consumer.groupid.simulate=baeldungGrpSimulate test.topic=testtopic1 -kafka.backoff.interval=9000 -kafka.backoff.max_failure=5 - From dc5641200e4e60282bf604baf485bfae718689e3 Mon Sep 17 00:00:00 2001 From: Kapil Khandelwal Date: Thu, 12 Jan 2023 03:04:34 +0530 Subject: [PATCH 256/592] How to stop a zombie job on Jenkins without restarting the server (#13277) --- .../jenkins-jobs/zombie-job/pipeline-zombie-job | 15 +++++++++++++++ .../jenkins-jobs/zombie-job/zombie-finish-script | 3 +++ .../zombie-job/zombie-interrupt-script | 6 ++++++ .../jenkins-jobs/zombie-job/zombie-stop-script | 6 ++++++ 4 files changed, 30 insertions(+) create mode 100644 jenkins-modules/jenkins-jobs/zombie-job/pipeline-zombie-job create mode 100644 jenkins-modules/jenkins-jobs/zombie-job/zombie-finish-script create mode 100644 jenkins-modules/jenkins-jobs/zombie-job/zombie-interrupt-script create mode 100644 jenkins-modules/jenkins-jobs/zombie-job/zombie-stop-script diff --git a/jenkins-modules/jenkins-jobs/zombie-job/pipeline-zombie-job b/jenkins-modules/jenkins-jobs/zombie-job/pipeline-zombie-job new file mode 100644 index 0000000000..8c21ada8c6 --- /dev/null +++ b/jenkins-modules/jenkins-jobs/zombie-job/pipeline-zombie-job @@ -0,0 +1,15 @@ +pipeline { + agent any + stages { + stage('Infinite Loop') { + steps { + script { + while (true) { + println 'This is an infinite loop!' + Thread.sleep(10000) + } + } + } + } + } +} diff --git a/jenkins-modules/jenkins-jobs/zombie-job/zombie-finish-script b/jenkins-modules/jenkins-jobs/zombie-job/zombie-finish-script new file mode 100644 index 0000000000..41090599ee --- /dev/null +++ b/jenkins-modules/jenkins-jobs/zombie-job/zombie-finish-script @@ -0,0 +1,3 @@ +Jenkins.instance.getItemByFullName("sampleZombieJob") + .getBuildByNumber(17) + .finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build")); diff --git a/jenkins-modules/jenkins-jobs/zombie-job/zombie-interrupt-script b/jenkins-modules/jenkins-jobs/zombie-job/zombie-interrupt-script new file mode 100644 index 0000000000..bf79f50ab9 --- /dev/null +++ b/jenkins-modules/jenkins-jobs/zombie-job/zombie-interrupt-script @@ -0,0 +1,6 @@ +Thread.getAllStackTraces().keySet().each() { + if (it.name.contains('sampleZombieJob')) { + println "Stopping $it.name" + it.interrupt() + } +} diff --git a/jenkins-modules/jenkins-jobs/zombie-job/zombie-stop-script b/jenkins-modules/jenkins-jobs/zombie-job/zombie-stop-script new file mode 100644 index 0000000000..40edcf3ff6 --- /dev/null +++ b/jenkins-modules/jenkins-jobs/zombie-job/zombie-stop-script @@ -0,0 +1,6 @@ +Thread.getAllStackTraces().keySet().each() { + if (it.name.contains('sampleZombieJob')) { + println "Stopping $it.name" + it.stop() + } +} From 02b56bf78377140c6bc1ab5fc0fa498b7e3a35a8 Mon Sep 17 00:00:00 2001 From: apeterlic Date: Thu, 12 Jan 2023 14:20:58 +0100 Subject: [PATCH 257/592] BAEL-6032 - @JsonIgnore vs @Transient (#13254) * BAEL-6032 - @JsonIgnore vs @Transient * Rename test methods --- jackson-modules/jackson-annotations/pom.xml | 23 +++++++ .../jsonignorevstransient/Application.java | 13 ++++ .../jackson/jsonignorevstransient/Person.java | 34 ++++++++++ .../jackson/jsonignorevstransient/User.java | 64 +++++++++++++++++++ .../jsonignorevstransient/UserRepository.java | 8 +++ .../jsonignorevstransient/PersonUnitTest.java | 23 +++++++ .../jsonignorevstransient/UserUnitTest.java | 39 +++++++++++ .../src/test/resources/application.properties | 5 ++ 8 files changed, 209 insertions(+) create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonignorevstransient/Application.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonignorevstransient/Person.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonignorevstransient/User.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonignorevstransient/UserRepository.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/jsonignorevstransient/PersonUnitTest.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/jsonignorevstransient/UserUnitTest.java create mode 100644 jackson-modules/jackson-annotations/src/test/resources/application.properties diff --git a/jackson-modules/jackson-annotations/pom.xml b/jackson-modules/jackson-annotations/pom.xml index 56fd6cf2fa..4bb9341e43 100644 --- a/jackson-modules/jackson-annotations/pom.xml +++ b/jackson-modules/jackson-annotations/pom.xml @@ -25,6 +25,27 @@ ${rest-assured.version} test + + org.springframework.boot + spring-boot-starter-data-jpa + ${spring-boot.version} + + + org.springframework.boot + spring-boot-starter-data-jdbc + ${spring-boot.version} + + + com.h2database + h2 + ${h2.version} + + + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + test + @@ -38,7 +59,9 @@ + 2.1.214 3.1.1 + 2.5.0 \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonignorevstransient/Application.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonignorevstransient/Application.java new file mode 100644 index 0000000000..ad4ef9e9ac --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonignorevstransient/Application.java @@ -0,0 +1,13 @@ +package com.baeldung.jackson.jsonignorevstransient; + +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/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonignorevstransient/Person.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonignorevstransient/Person.java new file mode 100644 index 0000000000..982d0e6440 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonignorevstransient/Person.java @@ -0,0 +1,34 @@ +package com.baeldung.jackson.jsonignorevstransient; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import java.io.Serializable; + +class Person implements Serializable { + + @JsonIgnore + private final Long id; + + private final String firstName; + + private final String lastName; + + public Person(Long id, String firstName, String lastName) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + } + + public Long getId() { + return id; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonignorevstransient/User.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonignorevstransient/User.java new file mode 100644 index 0000000000..c12e5225db --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonignorevstransient/User.java @@ -0,0 +1,64 @@ +package com.baeldung.jackson.jsonignorevstransient; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; +import java.io.Serializable; + +@Entity +@Table(name = "Users") +class User implements Serializable { + + @Id + private Long id; + + private String username; + + private String password; + + @Transient + private String repeatedPassword; + + public User() { + } + + public User(Long id, String username, String password, String repeatedPassword) { + this.id = id; + this.username = username; + this.password = password; + this.repeatedPassword = repeatedPassword; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getRepeatedPassword() { + return repeatedPassword; + } + + public void setRepeatedPassword(String repeatedPassword) { + this.repeatedPassword = repeatedPassword; + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonignorevstransient/UserRepository.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonignorevstransient/UserRepository.java new file mode 100644 index 0000000000..ca6428ca3e --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonignorevstransient/UserRepository.java @@ -0,0 +1,8 @@ +package com.baeldung.jackson.jsonignorevstransient; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserRepository extends JpaRepository { +} diff --git a/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/jsonignorevstransient/PersonUnitTest.java b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/jsonignorevstransient/PersonUnitTest.java new file mode 100644 index 0000000000..0595fc240c --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/jsonignorevstransient/PersonUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.jackson.jsonignorevstransient; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; + +class PersonUnitTest { + + @Test + void givenPerson_whenSerializing_thenIdFieldIgnored() throws JsonProcessingException { + + Person person = new Person(1L, "My First Name", "My Last Name"); + String result = new ObjectMapper().writeValueAsString(person); + + assertThat(result, containsString("firstName")); + assertThat(result, containsString("lastName")); + assertThat(result, not(containsString("id"))); + } +} \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/jsonignorevstransient/UserUnitTest.java b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/jsonignorevstransient/UserUnitTest.java new file mode 100644 index 0000000000..bc57b6f550 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/jsonignorevstransient/UserUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.jackson.jsonignorevstransient; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +@SpringBootTest +class UserUnitTest { + + @Autowired + UserRepository userRepository; + + @Test + void givenUser_whenSave_thenSkipTransientFields() { + User user = new User(1L, "user", "newPassword123", "newPassword123"); + User savedUser = userRepository.save(user); + + assertNotNull(savedUser); + assertNotNull(savedUser.getPassword()); + assertNull(savedUser.getRepeatedPassword()); + } + + @Test + void givenUser_whenSerializing_thenTransientFieldNotIgnored() throws JsonProcessingException { + User user = new User(1L, "user", "newPassword123", "newPassword123"); + String result = new ObjectMapper().writeValueAsString(user); + + assertThat(result, containsString("user")); + assertThat(result, containsString("repeatedPassword")); + } + +} \ No newline at end of file diff --git a/jackson-modules/jackson-annotations/src/test/resources/application.properties b/jackson-modules/jackson-annotations/src/test/resources/application.properties new file mode 100644 index 0000000000..d0f6dd95ef --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/resources/application.properties @@ -0,0 +1,5 @@ +hibernate.hbm2ddl.auto=create-drop + +spring.datasource.jdbcUrl=jdbc:h2:mem:testDb;DB_CLOSE_DELAY=-1 +spring.datasource.username=sa +spring.datasource.password=sa \ No newline at end of file From b83c8d765dc668639b1785f1532bd0be5faea6ea Mon Sep 17 00:00:00 2001 From: jsgrah-spring Date: Thu, 12 Jan 2023 17:36:14 +0100 Subject: [PATCH 258/592] JAVA-16938, Fix gcp-firebase module. (#13284) Co-authored-by: jogra --- .../publisher/controller/FirebasePublisherController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/controller/FirebasePublisherController.java b/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/controller/FirebasePublisherController.java index ca7467531e..f926c0ef88 100644 --- a/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/controller/FirebasePublisherController.java +++ b/gcp-firebase/src/main/java/com/baeldung/gcp/firebase/publisher/controller/FirebasePublisherController.java @@ -2,6 +2,7 @@ package com.baeldung.gcp.firebase.publisher.controller; import java.util.List; +import java.util.Arrays; import java.util.stream.Collectors; import org.springframework.http.HttpStatus; @@ -103,7 +104,7 @@ public class FirebasePublisherController { @DeleteMapping("/subscriptions/{topic}/{registrationToken}") public ResponseEntity deleteSubscription(@PathVariable String topic, @PathVariable String registrationToken) throws FirebaseMessagingException { - fcm.subscribeToTopic(List.of(registrationToken), topic); + fcm.subscribeToTopic(Arrays.asList(registrationToken), topic); return ResponseEntity.ok().build(); } } From dcc489edfa0de1cab7e9eda13f24f62690349c34 Mon Sep 17 00:00:00 2001 From: jsgrah-spring Date: Thu, 12 Jan 2023 18:27:34 +0100 Subject: [PATCH 259/592] JAVA-16687. Update MapStruct version. (#13270) Co-authored-by: jogra --- mapstruct/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mapstruct/pom.xml b/mapstruct/pom.xml index 4696a46abb..cdcbc798a4 100644 --- a/mapstruct/pom.xml +++ b/mapstruct/pom.xml @@ -76,7 +76,7 @@ - 1.4.2.Final + 1.5.3.Final 4.3.4.RELEASE 1.8 1.8 From 10644de954bcf7946bd691ec51d71aba880418f0 Mon Sep 17 00:00:00 2001 From: jsgrah-spring Date: Thu, 12 Jan 2023 18:55:18 +0100 Subject: [PATCH 260/592] JAVA-14459, GitHub Issue: Reactive WebSocket App example no longer works. (#13272) Co-authored-by: jogra --- .../spring-5-reactive/pom.xml | 10 ++++- .../reactive/Spring5ReactiveApplication.java | 3 +- .../ReactiveWebSocketApplication.java | 16 +++++++- .../ReactiveWebSocketConfiguration.java | 34 ++++++++++++++-- .../websocket/WebSocketController.java | 40 +++++++++++++++++++ .../src/main/resources/application.properties | 3 +- 6 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/WebSocketController.java diff --git a/spring-reactive-modules/spring-5-reactive/pom.xml b/spring-reactive-modules/spring-5-reactive/pom.xml index 5eb98eb106..212281b6f9 100644 --- a/spring-reactive-modules/spring-5-reactive/pom.xml +++ b/spring-reactive-modules/spring-5-reactive/pom.xml @@ -26,7 +26,11 @@ org.springframework.boot - spring-boot-starter-webflux + spring-boot-starter-integration + + + org.springframework.boot + spring-boot-starter-websocket javax.json.bind @@ -111,6 +115,10 @@ org.apache.httpcomponents httpclient + + io.netty + netty-all + diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java b/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java index a8cd18c470..ef862dd957 100644 --- a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java +++ b/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java @@ -2,8 +2,9 @@ package com.baeldung.reactive; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -@SpringBootApplication +@SpringBootApplication(exclude = { RedisAutoConfiguration.class }) public class Spring5ReactiveApplication{ public static void main(String[] args) { diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/ReactiveWebSocketApplication.java b/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/ReactiveWebSocketApplication.java index 0e71673df6..148dd07510 100644 --- a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/ReactiveWebSocketApplication.java +++ b/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/ReactiveWebSocketApplication.java @@ -2,8 +2,22 @@ package com.baeldung.websocket; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; +import org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration; +import org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration; +import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration; +import org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration; +import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -@SpringBootApplication +@SpringBootApplication(exclude = { + SecurityAutoConfiguration.class, + UserDetailsServiceAutoConfiguration.class, + ReactiveSecurityAutoConfiguration.class, + ReactiveUserDetailsServiceAutoConfiguration.class, + ReactiveOAuth2ClientAutoConfiguration.class, + WebMvcAutoConfiguration.class, + RedisAutoConfiguration.class}) public class ReactiveWebSocketApplication { public static void main(String[] args) { SpringApplication.run(ReactiveWebSocketApplication.class, args); diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/ReactiveWebSocketConfiguration.java b/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/ReactiveWebSocketConfiguration.java index 43a98d068d..8ebd6118b2 100644 --- a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/ReactiveWebSocketConfiguration.java +++ b/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/ReactiveWebSocketConfiguration.java @@ -10,19 +10,25 @@ import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.HandlerMapping; import org.springframework.web.reactive.handler.SimpleUrlHandlerMapping; import org.springframework.web.reactive.socket.WebSocketHandler; +import org.springframework.web.reactive.socket.server.WebSocketService; +import org.springframework.web.reactive.socket.server.support.HandshakeWebSocketService; +import org.springframework.web.reactive.socket.server.upgrade.TomcatRequestUpgradeStrategy; +import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.reactive.socket.server.support.WebSocketHandlerAdapter; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration +@EnableWebSocket public class ReactiveWebSocketConfiguration { @Autowired @Qualifier("ReactiveWebSocketHandler") - private WebSocketHandler webSocketHandler; + private ReactiveWebSocketHandler reactiveWebSocketHandler; @Bean - public HandlerMapping webSocketHandlerMapping() { + public HandlerMapping reactiveWebSocketHandlerMapping() { Map map = new HashMap<>(); - map.put("/event-emitter", webSocketHandler); + map.put("/event-emitter", reactiveWebSocketHandler); SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping(); handlerMapping.setOrder(1); @@ -32,6 +38,26 @@ public class ReactiveWebSocketConfiguration { @Bean public WebSocketHandlerAdapter handlerAdapter() { - return new WebSocketHandlerAdapter(); + return new WebSocketHandlerAdapter(webSocketService()); + } + + @Bean + public WebSocketService webSocketService() { + TomcatRequestUpgradeStrategy tomcatRequestUpgradeStrategy = new TomcatRequestUpgradeStrategy(); + tomcatRequestUpgradeStrategy.setMaxSessionIdleTimeout(10000L); + tomcatRequestUpgradeStrategy.setAsyncSendTimeout(10000L); + return new HandshakeWebSocketService(tomcatRequestUpgradeStrategy); + } + + @Bean + public ServerEndpointExporter serverEndpointExporter() { + ServerEndpointExporter serverEndpointExporter = new ServerEndpointExporter(); + + /** + * Add one or more classes annotated with `@ServerEndpoint`. + */ + serverEndpointExporter.setAnnotatedEndpointClasses(WebSocketController.class); + + return serverEndpointExporter; } } \ No newline at end of file diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/WebSocketController.java b/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/WebSocketController.java new file mode 100644 index 0000000000..bf4a463ae6 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/WebSocketController.java @@ -0,0 +1,40 @@ +package com.baeldung.websocket; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.websocket.*; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +@ServerEndpoint("/event-emitter") +public class WebSocketController { + + private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketController.class); + @OnOpen + public void onOpen(Session session, EndpointConfig endpointConfig) throws IOException { + // Get session and WebSocket connection + session.setMaxIdleTimeout(0); + LOGGER.info("Get session and WebSocket connection"); + } + + @OnMessage + public void onMessage(String message, Session session) throws IOException { + // Handle new messages + LOGGER.info("Handle new messages -> {}", message ); + } + + @OnClose + public void onClose(Session session) throws IOException { + // WebSocket connection closes + LOGGER.info("WebSocket connection closes"); + } + + @OnError + public void onError(Session session, Throwable throwable) { + // Do error handling here + LOGGER.info("Do error handling here"); + } +} 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 index 4b49e8e8a2..dfe4a4d994 100644 --- a/spring-reactive-modules/spring-5-reactive/src/main/resources/application.properties +++ b/spring-reactive-modules/spring-5-reactive/src/main/resources/application.properties @@ -1 +1,2 @@ -logging.level.root=INFO \ No newline at end of file +logging.level.root=INFO +server.tomcat.max-keep-alive-requests=1 \ No newline at end of file From 3c12edb5f640ed5eaf6a8a1c57f2707addc6da01 Mon Sep 17 00:00:00 2001 From: Thiago dos Santos Hora Date: Fri, 13 Jan 2023 03:23:34 +0100 Subject: [PATCH 261/592] BAEL-5959: Monad in Java (#13278) * BAEL-5959: Monad in Java * Fix test name --- .../java/com/baeldung/monad/MonadSamples.java | 113 ++++++++++++++++++ .../baeldung/monad/MonadSampleUnitTest.java | 39 ++++++ 2 files changed, 152 insertions(+) create mode 100644 core-java-modules/core-java-8/src/main/java/com/baeldung/monad/MonadSamples.java create mode 100644 core-java-modules/core-java-8/src/test/java/com/baeldung/monad/MonadSampleUnitTest.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/monad/MonadSamples.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/monad/MonadSamples.java new file mode 100644 index 0000000000..3ccbac2a3c --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/baeldung/monad/MonadSamples.java @@ -0,0 +1,113 @@ +package com.baeldung.monad; + +import java.util.Optional; +import java.util.function.Function; + +class MonadBaseExample { + + public double multiplyBy2(double n) { + return n * 2; + } + + public double divideBy2(double n) { + return n / 2; + } + + public double add3(double n) { + return n + 3; + } + + public double subtract1(double n) { + return n - 1; + } + +} + +class MonadSample1 extends MonadBaseExample { + + public double apply(double n) { + return subtract1(add3(divideBy2(multiplyBy2(multiplyBy2(2))))); + } + + public static void main(String[] args) { + final MonadSample1 test = new MonadSample1(); + System.out.println(test.apply(2)); + //6.0 + } + +} + +class MonadSample2 extends MonadBaseExample { + public double apply(double n) { + final double n1 = multiplyBy2(n); + final double n2 = multiplyBy2(n1); + final double n3 = divideBy2(n2); + final double n4 = add3(n3); + return subtract1(n4); + } + + public static void main(String[] args) { + final MonadSample2 test = new MonadSample2(); + System.out.println(test.apply(2)); + //6.0 + } + +} + +class MonadSample3 extends MonadBaseExample { + + public double apply(double n) { + return Optional.of(n) + .flatMap(value -> Optional.of(multiplyBy2(value))) + .flatMap(value -> Optional.of(multiplyBy2(value))) + .flatMap(value -> Optional.of(divideBy2(value))) + .flatMap(value -> Optional.of(add3(value))) + .flatMap(value -> Optional.of(subtract1(value))) + .get(); + } + + public static void main(String[] args) { + final MonadSample3 test = new MonadSample3(); + System.out.println(test.apply(2)); + //6.0 + } +} + + class MonadSample4 extends MonadBaseExample { + public boolean leftIdentity() { + Function> mapping = value -> Optional.of(value + 1); + return Optional.of(3).flatMap(mapping).equals(mapping.apply(3)); + } + + public boolean rightIdentity() { + return Optional.of(3).flatMap(Optional::of).equals(Optional.of(3)); + } + + public boolean associativity() { + Function> mapping = value -> Optional.of(value + 1); + Optional leftSide = Optional.of(3).flatMap(mapping).flatMap(Optional::of); + Optional rightSide = Optional.of(3).flatMap(v -> mapping.apply(v).flatMap(Optional::of)); + return leftSide.equals(rightSide); + } + + public static void main(String[] args) { + final MonadSample4 test = new MonadSample4(); + + System.out.println(test.leftIdentity()); //true + System.out.println(test.rightIdentity()); //true + System.out.println(test.associativity()); //true + } + } + +class MonadSample5 extends MonadBaseExample { + public boolean fail() { + Function> mapping = value -> Optional.of(value == null ? -1 : value + 1); + return Optional.ofNullable((Integer) null).flatMap(mapping).equals(mapping.apply(null)); + } + + public static void main(String[] args) { + final MonadSample5 test = new MonadSample5(); + System.out.println(test.fail()); + } +} + diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/monad/MonadSampleUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/baeldung/monad/MonadSampleUnitTest.java new file mode 100644 index 0000000000..c851f5f750 --- /dev/null +++ b/core-java-modules/core-java-8/src/test/java/com/baeldung/monad/MonadSampleUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.monad; + +import org.junit.Assert; +import org.junit.Test; + +public class MonadSampleUnitTest { + + @Test + public void whenNotUsingMonad_shouldBeOk() { + MonadSample1 test = new MonadSample1(); + Assert.assertEquals(6.0, test.apply(2), 0.000); + } + + @Test + public void whenNotUsingMonadButUsingTempVars_shouldBeOk() { + MonadSample2 test = new MonadSample2(); + Assert.assertEquals(6.0, test.apply(2), 0.000); + } + + @Test + public void whenUsingMonad_shouldBeOk() { + MonadSample3 test = new MonadSample3(); + Assert.assertEquals(6.0, test.apply(2), 0.000); + } + + @Test + public void whenTestingMonadProperties_shouldBeOk() { + MonadSample4 test = new MonadSample4(); + Assert.assertEquals(true, test.leftIdentity()); + Assert.assertEquals(true, test.rightIdentity()); + Assert.assertEquals(true, test.associativity()); + } + + @Test + public void whenBreakingMonadProperties_shouldBeFalse() { + MonadSample5 test = new MonadSample5(); + Assert.assertEquals(false, test.fail()); + } +} From f6f63673a90aa7869bb1f10c17b923be11bb8c0c Mon Sep 17 00:00:00 2001 From: pedrolopes Date: Thu, 12 Jan 2023 23:28:36 -0300 Subject: [PATCH 262/592] BAEL-5873: Check If All the Variables of a Class Are Null (#13285) * model classes. unit tests. apache lang3 dependency. * fix PR build --- .../core-java-lang-oop-others/pom.xml | 8 ++++ .../java/com/baeldung/nullchecking/Car.java | 30 +++++++++++++ .../baeldung/nullchecking/NullChecker.java | 25 +++++++++++ .../nullchecking/NullCheckUnitTest.java | 45 +++++++++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/nullchecking/Car.java create mode 100644 core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/nullchecking/NullChecker.java create mode 100644 core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/nullchecking/NullCheckUnitTest.java diff --git a/core-java-modules/core-java-lang-oop-others/pom.xml b/core-java-modules/core-java-lang-oop-others/pom.xml index d9d147f34a..dea92067f2 100644 --- a/core-java-modules/core-java-lang-oop-others/pom.xml +++ b/core-java-modules/core-java-lang-oop-others/pom.xml @@ -13,4 +13,12 @@ 0.0.1-SNAPSHOT + + + org.apache.commons + commons-lang3 + 3.12.0 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/nullchecking/Car.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/nullchecking/Car.java new file mode 100644 index 0000000000..975006d8df --- /dev/null +++ b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/nullchecking/Car.java @@ -0,0 +1,30 @@ +package com.baeldung.nullchecking; + +import java.util.Objects; +import java.util.stream.Stream; + +public class Car { + + Integer power; + + Integer year; + + public boolean allNull() { + + if (power != null) { + return false; + } + + if (year != null) { + return false; + } + + return true; + } + + public boolean allNullV2() { + + return Stream.of(power, year) + .allMatch(Objects::isNull); + } +} diff --git a/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/nullchecking/NullChecker.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/nullchecking/NullChecker.java new file mode 100644 index 0000000000..5630577cdf --- /dev/null +++ b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/nullchecking/NullChecker.java @@ -0,0 +1,25 @@ +package com.baeldung.nullchecking; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Objects; + +public class NullChecker { + + public static boolean allNull(Object target) { + + return Arrays.stream(target.getClass() + .getDeclaredFields()) + .peek(f -> f.setAccessible(true)) + .map(f -> getFieldValue(f, target)) + .allMatch(Objects::isNull); + } + + private static Object getFieldValue(Field field, Object target) { + try { + return field.get(target); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } +} diff --git a/core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/nullchecking/NullCheckUnitTest.java b/core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/nullchecking/NullCheckUnitTest.java new file mode 100644 index 0000000000..db8aab8193 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/nullchecking/NullCheckUnitTest.java @@ -0,0 +1,45 @@ +package com.baeldung.nullchecking; + +import org.apache.commons.lang3.ObjectUtils; +import org.junit.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class NullCheckUnitTest { + + @Test + public void givenNullFields_whenCheckForNullsUsingIfs_thenReturnCorrectValue(){ + Car car = new Car(); + + boolean result = car.allNull(); + + assertTrue(result); + } + + @Test + public void givenNullFields_whenCheckForNullsUsingStreams_thenReturnCorrectValue(){ + Car car = new Car(); + + boolean result = car.allNullV2(); + + assertTrue(result); + } + + @Test + public void givenNullFields_whenCheckForNullsUsingApacheCommons_thenReturnCorrectValue(){ + Car car = new Car(); + + boolean result = ObjectUtils.allNull(car.power, car.year); + + assertTrue(result); + } + + @Test + public void givenNullFields_whenCheckForNullsUsingReflection_thenReturnCorrectValue(){ + Car car = new Car(); + + boolean result = NullChecker.allNull(car); + + assertTrue(result); + } +} From 1f987c4bb3d11caa856c5c32c732b52e8186ac5b Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Fri, 13 Jan 2023 04:53:50 -0300 Subject: [PATCH 263/592] BAEL-6046 - MongoDB - Field Level Encryption (#13266) --- .../spring-boot-persistence-mongodb-3/pom.xml | 9 ++ .../boot/csfle/MongoDbCsfleApplication.java | 12 ++ .../boot/csfle/config/EncryptionConfig.java | 59 +++++++++ .../boot/csfle/config/LocalKmsUtils.java | 55 ++++++++ .../boot/csfle/config/MongoClientConfig.java | 122 ++++++++++++++++++ .../config/converter/IntegerConverter.java | 27 ++++ .../config/converter/StringConverter.java | 27 ++++ .../com/baeldung/boot/csfle/data/Citizen.java | 47 +++++++ .../boot/csfle/data/EncryptedCitizen.java | 48 +++++++ .../boot/csfle/service/CitizenService.java | 63 +++++++++ .../boot/csfle/web/CitizenController.java | 38 ++++++ .../boot/csfle/CitizenServiceLiveTest.java | 73 +++++++++++ .../src/test/resources/embedded.properties | 11 +- 13 files changed, 590 insertions(+), 1 deletion(-) create mode 100644 persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/MongoDbCsfleApplication.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/EncryptionConfig.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/LocalKmsUtils.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/MongoClientConfig.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/IntegerConverter.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/StringConverter.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/Citizen.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/EncryptedCitizen.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/web/CitizenController.java create mode 100644 persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/csfle/CitizenServiceLiveTest.java diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/pom.xml b/persistence-modules/spring-boot-persistence-mongodb-3/pom.xml index efb988d0a0..b9a47aa703 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/pom.xml +++ b/persistence-modules/spring-boot-persistence-mongodb-3/pom.xml @@ -24,6 +24,11 @@ org.springframework.boot spring-boot-starter-data-mongodb + + org.mongodb + mongodb-crypt + ${mongodb-crypt.version} + de.flapdoodle.embed de.flapdoodle.embed.mongo @@ -31,4 +36,8 @@ + + 1.6.1 + + diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/MongoDbCsfleApplication.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/MongoDbCsfleApplication.java new file mode 100644 index 0000000000..fac296a208 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/MongoDbCsfleApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.boot.csfle; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class MongoDbCsfleApplication { + + public static void main(String... args) { + SpringApplication.run(MongoDbCsfleApplication.class, args); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/EncryptionConfig.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/EncryptionConfig.java new file mode 100644 index 0000000000..1495822bc0 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/EncryptionConfig.java @@ -0,0 +1,59 @@ +package com.baeldung.boot.csfle.config; + +import org.bson.BsonBinary; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +import com.mongodb.client.vault.ClientEncryption; + +@Configuration +public class EncryptionConfig { + + @Value("${com.baeldung.csfle.master-key-path}") + private String masterKeyPath; + + @Value("${com.baeldung.csfle.key-vault.namespace}") + private String keyVaultNamespace; + + @Value("${com.baeldung.csfle.key-vault.alias}") + private String keyVaultAlias; + + @Value("${com.baeldung.csfle.auto-decryption:false}") + private Boolean autoDecryption; + + private ClientEncryption encryption; + + private BsonBinary dataKeyId; + + public void setEncryption(ClientEncryption encryption) { + this.encryption = encryption; + } + + public ClientEncryption getEncryption() { + return encryption; + } + + public void setDataKeyId(BsonBinary dataKeyId) { + this.dataKeyId = dataKeyId; + } + + public BsonBinary getDataKeyId() { + return dataKeyId; + } + + public String getKeyVaultNamespace() { + return keyVaultNamespace; + } + + public String getKeyVaultAlias() { + return keyVaultAlias; + } + + public String getMasterKeyPath() { + return masterKeyPath; + } + + public Boolean getAutoDecryption() { + return autoDecryption; + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/LocalKmsUtils.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/LocalKmsUtils.java new file mode 100644 index 0000000000..e5daf781f0 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/LocalKmsUtils.java @@ -0,0 +1,55 @@ +package com.baeldung.boot.csfle.config; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.security.SecureRandom; +import java.util.HashMap; +import java.util.Map; + +public class LocalKmsUtils { + + private static final int KEY_SIZE = 96; + + private LocalKmsUtils() { + } + + public static byte[] createMasterKey(String path) throws FileNotFoundException, IOException { + byte[] masterKey = new byte[KEY_SIZE]; + new SecureRandom().nextBytes(masterKey); + + try (FileOutputStream stream = new FileOutputStream(path)) { + stream.write(masterKey); + } + + return masterKey; + } + + public static byte[] readMasterKey(String path) throws FileNotFoundException, IOException { + byte[] masterKey = new byte[KEY_SIZE]; + + try (FileInputStream stream = new FileInputStream(path)) { + stream.read(masterKey, 0, KEY_SIZE); + } + + return masterKey; + } + + public static Map> providersMap(String masterKeyPath) throws FileNotFoundException, IOException { + if (masterKeyPath == null) + throw new IllegalArgumentException("master key path cannot be null"); + + File masterKeyFile = new File(masterKeyPath); + byte[] masterKey = masterKeyFile.isFile() + ? readMasterKey(masterKeyPath) + : createMasterKey(masterKeyPath); + + Map masterKeyMap = new HashMap<>(); + masterKeyMap.put("key", masterKey); + Map> providersMap = new HashMap<>(); + providersMap.put("local", masterKeyMap); + return providersMap; + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/MongoClientConfig.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/MongoClientConfig.java new file mode 100644 index 0000000000..29076f4e61 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/MongoClientConfig.java @@ -0,0 +1,122 @@ +package com.baeldung.boot.csfle.config; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; +import java.util.Map; + +import org.bson.BsonBinary; +import org.bson.BsonDocument; +import org.bson.Document; +import org.bson.conversions.Bson; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration; +import org.springframework.data.mongodb.core.convert.MongoCustomConversions; + +import com.baeldung.boot.csfle.config.converter.IntegerConverter; +import com.baeldung.boot.csfle.config.converter.StringConverter; +import com.mongodb.AutoEncryptionSettings; +import com.mongodb.ClientEncryptionSettings; +import com.mongodb.ConnectionString; +import com.mongodb.MongoClientSettings; +import com.mongodb.MongoClientSettings.Builder; +import com.mongodb.MongoNamespace; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.model.Filters; +import com.mongodb.client.model.IndexOptions; +import com.mongodb.client.model.Indexes; +import com.mongodb.client.model.vault.DataKeyOptions; +import com.mongodb.client.vault.ClientEncryption; +import com.mongodb.client.vault.ClientEncryptions; + +@Configuration +public class MongoClientConfig extends AbstractMongoClientConfiguration { + + @Value("${spring.data.mongodb.uri}") + private String uri; + + @Value("${spring.data.mongodb.database}") + private String db; + + @Autowired + private EncryptionConfig encryptionConfig; + + @Override + protected String getDatabaseName() { + return db; + } + + @Override + public MongoCustomConversions customConversions() { + return new MongoCustomConversions(Arrays.asList(new StringConverter(encryptionConfig), new IntegerConverter(encryptionConfig))); + } + + @Override + public MongoClient mongoClient() { + MongoClient client; + try { + client = MongoClients.create(clientSettings()); + + ClientEncryption encryption = createClientEncryption(); + encryptionConfig.setDataKeyId(createOrRetrieveDataKey(client, encryption)); + + return client; + } catch (IOException e) { + throw new IllegalStateException("unable to create client", e); + } + } + + private BsonBinary createOrRetrieveDataKey(MongoClient client, ClientEncryption encryption) { + MongoNamespace namespace = new MongoNamespace(encryptionConfig.getKeyVaultNamespace()); + MongoCollection keyVault = client.getDatabase(namespace.getDatabaseName()) + .getCollection(namespace.getCollectionName()); + + Bson query = Filters.in("keyAltNames", encryptionConfig.getKeyVaultAlias()); + BsonDocument key = keyVault.withDocumentClass(BsonDocument.class) + .find(query) + .first(); + + if (key == null) { + keyVault.createIndex(Indexes.ascending("keyAltNames"), new IndexOptions().unique(true) + .partialFilterExpression(Filters.exists("keyAltNames"))); + + DataKeyOptions options = new DataKeyOptions(); + options.keyAltNames(Arrays.asList(encryptionConfig.getKeyVaultAlias())); + return encryption.createDataKey("local", options); + } else { + return (BsonBinary) key.get("_id"); + } + } + + private ClientEncryption createClientEncryption() throws FileNotFoundException, IOException { + Map> kmsProviders = LocalKmsUtils.providersMap(encryptionConfig.getMasterKeyPath()); + + ClientEncryptionSettings encryptionSettings = ClientEncryptionSettings.builder() + .keyVaultMongoClientSettings(clientSettings()) + .keyVaultNamespace(encryptionConfig.getKeyVaultNamespace()) + .kmsProviders(kmsProviders) + .build(); + + encryptionConfig.setEncryption(ClientEncryptions.create(encryptionSettings)); + return encryptionConfig.getEncryption(); + } + + private MongoClientSettings clientSettings() throws FileNotFoundException, IOException { + Builder settings = MongoClientSettings.builder() + .applyConnectionString(new ConnectionString(uri)); + + if (encryptionConfig.getAutoDecryption()) { + settings.autoEncryptionSettings(AutoEncryptionSettings.builder() + .keyVaultNamespace(encryptionConfig.getKeyVaultNamespace()) + .kmsProviders(LocalKmsUtils.providersMap(encryptionConfig.getMasterKeyPath())) + .bypassAutoEncryption(true) + .build()); + } + + return settings.build(); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/IntegerConverter.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/IntegerConverter.java new file mode 100644 index 0000000000..020513ebff --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/IntegerConverter.java @@ -0,0 +1,27 @@ +package com.baeldung.boot.csfle.config.converter; + +import org.bson.BsonBinary; +import org.bson.BsonValue; +import org.bson.types.Binary; +import org.springframework.core.convert.converter.Converter; + +import com.baeldung.boot.csfle.config.EncryptionConfig; + +public class IntegerConverter implements Converter { + + private EncryptionConfig encryptionConfig; + + public IntegerConverter(EncryptionConfig config) { + this.encryptionConfig = config; + } + + @Override + public Integer convert(Binary source) { + BsonBinary bin = new BsonBinary(source.getType(), source.getData()); + BsonValue value = encryptionConfig.getEncryption() + .decrypt(bin); + + return value.asInt32() + .getValue(); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/StringConverter.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/StringConverter.java new file mode 100644 index 0000000000..7f8193ce43 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/StringConverter.java @@ -0,0 +1,27 @@ +package com.baeldung.boot.csfle.config.converter; + +import org.bson.BsonBinary; +import org.bson.BsonValue; +import org.bson.types.Binary; +import org.springframework.core.convert.converter.Converter; + +import com.baeldung.boot.csfle.config.EncryptionConfig; + +public class StringConverter implements Converter { + + private EncryptionConfig encryptionConfig; + + public StringConverter(EncryptionConfig config) { + this.encryptionConfig = config; + } + + @Override + public String convert(Binary source) { + BsonBinary bin = new BsonBinary(source.getType(), source.getData()); + BsonValue value = encryptionConfig.getEncryption() + .decrypt(bin); + + return value.asString() + .getValue(); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/Citizen.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/Citizen.java new file mode 100644 index 0000000000..9d6496a17b --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/Citizen.java @@ -0,0 +1,47 @@ +package com.baeldung.boot.csfle.data; + +import org.springframework.data.mongodb.core.mapping.Document; + +@Document("citizens") +public class Citizen { + + private String name; + private String email; + private Integer birthYear; + + public Citizen() { + } + + public Citizen(EncryptedCitizen encryptedCitizen) { + this.name = encryptedCitizen.getName(); + } + + 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; + } + + public Integer getBirthYear() { + return birthYear; + } + + public void setBirthYear(Integer birthYear) { + this.birthYear = birthYear; + } + + @Override + public String toString() { + return "Citizen [name=" + name + ", email=" + email + ", birthYear=" + birthYear + "]"; + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/EncryptedCitizen.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/EncryptedCitizen.java new file mode 100644 index 0000000000..01c9245fbf --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/EncryptedCitizen.java @@ -0,0 +1,48 @@ +package com.baeldung.boot.csfle.data; + +import org.bson.BsonBinary; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document("citizens") +public class EncryptedCitizen { + + private String name; + private BsonBinary email; + private BsonBinary birthYear; + + public EncryptedCitizen() { + } + + public EncryptedCitizen(Citizen citizen) { + this.name = citizen.getName(); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public BsonBinary getEmail() { + return email; + } + + public void setEmail(BsonBinary email) { + this.email = email; + } + + public BsonBinary getBirthYear() { + return birthYear; + } + + public void setBirthYear(BsonBinary birthYear) { + this.birthYear = birthYear; + } + + @Override + public String toString() { + return "Citizen [name=" + name + ", email=" + email + ", birthYear=" + birthYear + "]"; + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java new file mode 100644 index 0000000000..9cc0753289 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java @@ -0,0 +1,63 @@ +package com.baeldung.boot.csfle.service; + +import java.util.List; + +import org.bson.BsonBinary; +import org.bson.BsonInt32; +import org.bson.BsonString; +import org.bson.BsonValue; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import com.baeldung.boot.csfle.config.EncryptionConfig; +import com.baeldung.boot.csfle.data.Citizen; +import com.baeldung.boot.csfle.data.EncryptedCitizen; +import com.mongodb.client.model.vault.EncryptOptions; + +@Service +public class CitizenService { + + public static final String DETERMINISTIC_ALGORITHM = "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"; + public static final String RANDOM_ALGORITHM = "AEAD_AES_256_CBC_HMAC_SHA_512-Random"; + + @Autowired + private MongoTemplate mongo; + + @Autowired + private EncryptionConfig encryptionConfig; + + public EncryptedCitizen save(Citizen citizen) { + EncryptedCitizen encryptedCitizen = new EncryptedCitizen(citizen); + encryptedCitizen.setEmail(encrypt(citizen.getEmail(), DETERMINISTIC_ALGORITHM)); + encryptedCitizen.setBirthYear(encrypt(citizen.getBirthYear(), RANDOM_ALGORITHM)); + + return mongo.save(encryptedCitizen); + } + + public List findAll() { + return mongo.findAll(Citizen.class); + } + + public Citizen findByEmail(String email) { + Query byEmail = new Query(Criteria.where("email") + .is(encrypt(email, DETERMINISTIC_ALGORITHM))); + return mongo.findOne(byEmail, Citizen.class); + } + + public BsonBinary encrypt(Object value, String algorithm) { + if (value == null) + return null; + + BsonValue bsonValue = value instanceof Integer + ? new BsonInt32((Integer) value) + : new BsonString(value.toString()); + + EncryptOptions options = new EncryptOptions(algorithm); + options.keyId(encryptionConfig.getDataKeyId()); + return encryptionConfig.getEncryption() + .encrypt(bsonValue, options); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/web/CitizenController.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/web/CitizenController.java new file mode 100644 index 0000000000..d17435fb5e --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/web/CitizenController.java @@ -0,0 +1,38 @@ +package com.baeldung.boot.csfle.web; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.boot.csfle.data.Citizen; +import com.baeldung.boot.csfle.data.EncryptedCitizen; +import com.baeldung.boot.csfle.service.CitizenService; + +@RestController +@RequestMapping("/citizen") +public class CitizenController { + + @Autowired + private CitizenService service; + + @GetMapping + public List get() { + return service.findAll(); + } + + @GetMapping("by") + public Citizen getBy(@RequestParam String email) { + return service.findByEmail(email); + } + + @PostMapping + public EncryptedCitizen post(@RequestBody Citizen citizen) { + return service.save(citizen); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/csfle/CitizenServiceLiveTest.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/csfle/CitizenServiceLiveTest.java new file mode 100644 index 0000000000..5d0a931bb9 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/csfle/CitizenServiceLiveTest.java @@ -0,0 +1,73 @@ +package com.baeldung.boot.csfle; + +import static org.junit.jupiter.api.Assertions.*; + +import org.bson.BsonBinary; +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.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.boot.csfle.data.Citizen; +import com.baeldung.boot.csfle.data.EncryptedCitizen; +import com.baeldung.boot.csfle.service.CitizenService; + +@DirtiesContext +@RunWith(SpringRunner.class) +@TestPropertySource("/embedded.properties") +@SpringBootTest(classes = MongoDbCsfleApplication.class) +public class CitizenServiceLiveTest { + + @Autowired + private MongoTemplate mongo; + + @Autowired + private CitizenService service; + + @Test + public void givenCitizen_whenEncryptingEmail_thenEncryptedCitizenEmailMatches() { + final Citizen citizen = new Citizen(); + citizen.setName("Foo"); + citizen.setEmail("foo@citizen.com"); + + BsonBinary encryptedEmail = service.encrypt(citizen.getEmail(), CitizenService.DETERMINISTIC_ALGORITHM); + + EncryptedCitizen saved = service.save(citizen); + assertEquals(encryptedEmail, saved.getEmail()); + } + + @Test + public void givenRandomEncryptedField_whenFilteringByField_thenDocumentNotFound() { + Citizen john = new Citizen(); + john.setName("Jane Doe"); + john.setEmail("jane.doe@citizen.com"); + john.setBirthYear(1852); + + service.save(john); + + Query byBirthYear = new Query(Criteria.where("birthYear") + .is(service.encrypt(john.getBirthYear(), CitizenService.RANDOM_ALGORITHM))); + Citizen result = mongo.findOne(byBirthYear, Citizen.class); + + assertNull(result); + } + + @Test + public void givenDeterministicallyEncryptedField_whenFilteringByField_thenDocumentFound() { + Citizen jane = new Citizen(); + jane.setName("Jane Doe"); + jane.setEmail("jane.doe@citizen.com"); + jane.setBirthYear(1952); + + service.save(jane); + Citizen result = service.findByEmail(jane.getEmail()); + + assertNotNull(result); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/test/resources/embedded.properties b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/resources/embedded.properties index a5b5fb9804..5325354e55 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/test/resources/embedded.properties +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/resources/embedded.properties @@ -1 +1,10 @@ -spring.mongodb.embedded.version=4.4.9 \ No newline at end of file +spring.mongodb.embedded.version=4.4.9 + +spring.data.mongodb.uri=changeit +spring.data.mongodb.database=changeit + +com.baeldung.csfle.kms-provider=local +com.baeldung.csfle.key-vault.namespace=encryption._keyVault +com.baeldung.csfle.key-vault.alias=master.key +com.baeldung.csfle.master-key-path=/tmp/master.key +com.baeldung.csfle.auto-decryption=false From 58882b371c6a7942a9292406de12e85fd5d62d81 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 13 Jan 2023 14:30:06 +0000 Subject: [PATCH 264/592] Java 15029 (#13257) * [JAVA-15029] Formatting * [JAVA-15029] Clean up Co-authored-by: panagiotiskakos --- .../sec/HttpClientCookieLiveTest.java | 31 +++++++------------ 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/sec/HttpClientCookieLiveTest.java b/httpclient-simple/src/test/java/com/baeldung/httpclient/sec/HttpClientCookieLiveTest.java index 82a2d8e9d6..90376acf02 100644 --- a/httpclient-simple/src/test/java/com/baeldung/httpclient/sec/HttpClientCookieLiveTest.java +++ b/httpclient-simple/src/test/java/com/baeldung/httpclient/sec/HttpClientCookieLiveTest.java @@ -26,24 +26,10 @@ class HttpClientCookieLiveTest { final void whenSettingCookiesOnARequest_thenCorrect() throws IOException { final HttpGet request = new HttpGet("http://www.github.com"); request.setHeader("Cookie", "JSESSIONID=1234"); - try (CloseableHttpClient client = HttpClients.createDefault(); CloseableHttpResponse response = (CloseableHttpResponse) client.execute(request, new CustomHttpClientResponseHandler());) { - assertThat(response.getCode(), equalTo(200)); - } - } - - @Test - final void givenUsingDeprecatedApi_whenSettingCookiesOnTheHttpClient_thenCorrect() throws IOException { - final BasicCookieStore cookieStore = new BasicCookieStore(); - final BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234"); - cookie.setDomain(".github.com"); - cookie.setAttribute("domain", "true"); - cookie.setPath("/"); - cookieStore.addCookie(cookie); - final HttpGet request = new HttpGet("https://www.github.com"); - try (CloseableHttpClient client = HttpClientBuilder.create() - .setDefaultCookieStore(cookieStore) - .build(); CloseableHttpResponse response = (CloseableHttpResponse) client.execute(request, new CustomHttpClientResponseHandler())) { + try (CloseableHttpClient client = HttpClients.createDefault(); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(request, new CustomHttpClientResponseHandler())) { assertThat(response.getCode(), equalTo(200)); } } @@ -58,9 +44,12 @@ class HttpClientCookieLiveTest { cookieStore.addCookie(cookie); final HttpGet request = new HttpGet("http://www.github.com"); - try (CloseableHttpClient client = HttpClientBuilder.create().setDefaultCookieStore(cookieStore).build(); - CloseableHttpResponse response = (CloseableHttpResponse) client.execute(request, new CustomHttpClientResponseHandler())) { + try (CloseableHttpClient client = HttpClientBuilder.create() + .setDefaultCookieStore(cookieStore) + .build(); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(request, new CustomHttpClientResponseHandler())) { assertThat(response.getCode(), equalTo(200)); } @@ -79,7 +68,9 @@ class HttpClientCookieLiveTest { // localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); // before 4.3 try (CloseableHttpClient client = HttpClientBuilder.create().build(); - CloseableHttpResponse response = (CloseableHttpResponse) client.execute(request, localContext, new CustomHttpClientResponseHandler())) { + + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(request, localContext, new CustomHttpClientResponseHandler())) { assertThat(response.getCode(), equalTo(200)); } } From 4723349f37c52bde212e6a953177ef47e70f1bcc Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 13 Jan 2023 14:33:05 +0000 Subject: [PATCH 265/592] Java 15030 (#13253) * [JAVA-15030] Upgrade to http client 5 * [JAVA-15030] Fixed MimeType test Co-authored-by: panagiotiskakos --- .../base/HttpClientBasicLiveTest.java | 99 ++++++++++--------- 1 file changed, 52 insertions(+), 47 deletions(-) diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/base/HttpClientBasicLiveTest.java b/httpclient-simple/src/test/java/com/baeldung/httpclient/base/HttpClientBasicLiveTest.java index d1b093394e..e05017ccdd 100644 --- a/httpclient-simple/src/test/java/com/baeldung/httpclient/base/HttpClientBasicLiveTest.java +++ b/httpclient-simple/src/test/java/com/baeldung/httpclient/base/HttpClientBasicLiveTest.java @@ -1,72 +1,77 @@ package com.baeldung.httpclient.base; -import org.apache.http.HttpStatus; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.entity.ContentType; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.util.EntityUtils; -import com.baeldung.httpclient.ResponseUtil; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import com.baeldung.handler.CustomHttpClientResponseHandler; + +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; + +import org.apache.hc.core5.http.ContentType; +import org.apache.hc.core5.http.HttpStatus; +import org.apache.hc.core5.http.ParseException; +import org.junit.jupiter.api.Test; import java.io.IOException; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.notNullValue; -import static org.junit.Assert.assertThat; + public class HttpClientBasicLiveTest { private static final String SAMPLE_URL = "http://www.github.com"; - private CloseableHttpClient instance; - - private CloseableHttpResponse response; - - @Before - public final void before() { - instance = HttpClientBuilder.create().build(); - } - - @After - public final void after() throws IllegalStateException, IOException { - ResponseUtil.closeResponse(response); - } - - // tests - - // simple request - response - @Test - public final void whenExecutingBasicGetRequest_thenNoExceptions() throws ClientProtocolException, IOException { - response = instance.execute(new HttpGet(SAMPLE_URL)); + public final void whenExecutingBasicGetRequest_thenNoExceptions() throws IOException { + final HttpGet request = new HttpGet(SAMPLE_URL); + + try (CloseableHttpClient client = HttpClientBuilder.create().build(); + + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(request, new CustomHttpClientResponseHandler())) { + } } @Test - public final void givenGetRequestExecuted_whenAnalyzingTheResponse_thenCorrectStatusCode() throws ClientProtocolException, IOException { - response = instance.execute(new HttpGet(SAMPLE_URL)); - final int statusCode = response.getStatusLine().getStatusCode(); - assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + public final void givenGetRequestExecuted_whenAnalyzingTheResponse_thenCorrectStatusCode() throws IOException { + final HttpGet request = new HttpGet(SAMPLE_URL); + try (CloseableHttpClient client = HttpClientBuilder.create().build(); + + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(request, new CustomHttpClientResponseHandler())) { + + assertThat(response.getCode(), equalTo(HttpStatus.SC_OK)); + } } - @Test - public final void givenGetRequestExecuted_whenAnalyzingTheResponse_thenCorrectMimeType() throws ClientProtocolException, IOException { - response = instance.execute(new HttpGet(SAMPLE_URL)); - final String contentMimeType = ContentType.getOrDefault(response.getEntity()).getMimeType(); - assertThat(contentMimeType, equalTo(ContentType.TEXT_HTML.getMimeType())); + @Test + public final void givenGetRequestExecuted_whenAnalyzingTheResponse_thenCorrectMimeType() throws IOException { + final HttpGet request = new HttpGet(SAMPLE_URL); + + try (CloseableHttpClient client = HttpClientBuilder.create().build(); + + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(request, new CustomHttpClientResponseHandler())) { + + final String contentMimeType = ContentType.parse(response.getEntity().getContentType()).getMimeType(); + assertThat(contentMimeType, equalTo(ContentType.TEXT_HTML.getMimeType())); + } } - @Test - public final void givenGetRequestExecuted_whenAnalyzingTheResponse_thenCorrectBody() throws ClientProtocolException, IOException { - response = instance.execute(new HttpGet(SAMPLE_URL)); - final String bodyAsString = EntityUtils.toString(response.getEntity()); - assertThat(bodyAsString, notNullValue()); + @Test + public final void givenGetRequestExecuted_whenAnalyzingTheResponse_thenCorrectBody() throws IOException, ParseException { + final HttpGet request = new HttpGet(SAMPLE_URL); + try (CloseableHttpClient client = HttpClientBuilder.create().build(); + + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(request, new CustomHttpClientResponseHandler())) { + + assertThat(response, notNullValue()); + } } } From 13097b458f79f9b4142cc14898747268ee850bd4 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 13 Jan 2023 14:37:27 +0000 Subject: [PATCH 266/592] Java 16961 (#13236) * [JAVA-16961] Moved code for article "Create an Empty Map in Java" * [JAVA-16961] Alter README.md * [JAVA-16961] Moved code for article "Sorting a Hashset in Java" * [JAVA-16961] Added links to README.md files * [JAVA-16961] Revert link changes * [JAVA-16961] Replaced junit4 with junit5 annotations * [JAVA-16961] test build * [JAVA-16961] Added junit annotations * [JAVA-16961] Added links Co-authored-by: panagiotiskakos --- .../core-java-collections-2/README.md | 1 + .../core-java-collections-4/README.md | 3 +-- core-java-modules/core-java-collections-4/pom.xml | 6 ++++++ .../collections/comparation/HashMapUnitTest.java | 2 -- .../comparation/LinkedListUnitTest.java | 2 -- .../sorting/EmployeeSortingByDateUnitTest.java | 2 +- .../sorting/multiple/ComparatorsUnitTest.java | 3 ++- .../stackreversal/StackReversalUnitTest.java | 14 ++++++++------ .../core-java-collections-maps/README.md | 1 + .../core-java-collections-maps/pom.xml | 6 ++++++ .../com/baeldung/map}/EmptyMapInitializer.java | 7 ++++--- .../baeldung/map}/EmptyMapInitializerUnitTest.java | 9 +++++---- .../core-java-collections-set-2/README.md | 2 ++ .../core-java-collections-set-2/pom.xml | 6 ++++++ .../baeldung/hashset}/sorting/HashSetUnitTest.java | 2 +- 15 files changed, 44 insertions(+), 22 deletions(-) rename core-java-modules/{core-java-collections-4/src/main/java/com/baeldung/maps/initialize => core-java-collections-maps/src/main/java/com/baeldung/map}/EmptyMapInitializer.java (97%) rename core-java-modules/{core-java-collections-4/src/test/java/com/baeldung/maps/initialize => core-java-collections-maps/src/test/java/com/baeldung/map}/EmptyMapInitializerUnitTest.java (96%) rename core-java-modules/{core-java-collections-4/src/test/java/com/baeldung/collections => core-java-collections-set-2/src/test/java/com/baeldung/hashset}/sorting/HashSetUnitTest.java (97%) diff --git a/core-java-modules/core-java-collections-2/README.md b/core-java-modules/core-java-collections-2/README.md index d482ed7773..644cc93be7 100644 --- a/core-java-modules/core-java-collections-2/README.md +++ b/core-java-modules/core-java-collections-2/README.md @@ -13,3 +13,4 @@ - [Getting the Size of an Iterable in Java](https://www.baeldung.com/java-iterable-size) - [Java Null-Safe Streams from Collections](https://www.baeldung.com/java-null-safe-streams-from-collections) - [Differences Between Iterator and Iterable and How to Use Them?](https://www.baeldung.com/java-iterator-vs-iterable) +- More articles: [[<-- prev]](/core-java-modules/core-java-collections-1) [[next -->]](/core-java-modules/core-java-collections-3) \ No newline at end of file diff --git a/core-java-modules/core-java-collections-4/README.md b/core-java-modules/core-java-collections-4/README.md index f3a7d87403..460af21179 100644 --- a/core-java-modules/core-java-collections-4/README.md +++ b/core-java-modules/core-java-collections-4/README.md @@ -7,7 +7,6 @@ - [ArrayList vs. LinkedList vs. HashMap in Java](https://www.baeldung.com/java-arraylist-vs-linkedlist-vs-hashmap) - [Java Deque vs. Stack](https://www.baeldung.com/java-deque-vs-stack) - [Collection.toArray(new T[0]) or .toArray(new T[size])](https://www.baeldung.com/java-collection-toarray-methods) -- [Create an Empty Map in Java](https://www.baeldung.com/java-create-empty-map) - [Sorting Objects in a List by Date](https://www.baeldung.com/java-sort-list-by-date) - [Fixed Size Queue Implementations in Java](https://www.baeldung.com/java-fixed-size-queue) - [Difference Between Java Enumeration and Iterator](https://www.baeldung.com/java-enumeration-vs-iterator) @@ -15,4 +14,4 @@ - [Guide to Java PriorityQueue](https://www.baeldung.com/java-priorityqueue) - [Java Generics PECS – Producer Extends Consumer Super](https://www.baeldung.com/java-generics-pecs) - [Reversing a Stack in Java](https://www.baeldung.com/java-reversing-a-stack) -- [Sorting a HashSet in Java](https://www.baeldung.com/java-sort-hashset) +- More articles: [[<-- prev]](/core-java-modules/core-java-collections-3) \ No newline at end of file diff --git a/core-java-modules/core-java-collections-4/pom.xml b/core-java-modules/core-java-collections-4/pom.xml index 9f1439b850..e88d5a6740 100644 --- a/core-java-modules/core-java-collections-4/pom.xml +++ b/core-java-modules/core-java-collections-4/pom.xml @@ -25,6 +25,12 @@ commons-lang3 ${commons-lang3.version} + + org.junit.platform + junit-platform-runner + ${junit-platform.version} + test + diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/comparation/HashMapUnitTest.java b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/comparation/HashMapUnitTest.java index 3b595472e0..7d4ec8249c 100644 --- a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/comparation/HashMapUnitTest.java +++ b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/comparation/HashMapUnitTest.java @@ -2,9 +2,7 @@ package com.baeldung.collections.comparation; import org.junit.jupiter.api.Test; -import java.util.Arrays; import java.util.HashMap; -import java.util.LinkedList; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/comparation/LinkedListUnitTest.java b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/comparation/LinkedListUnitTest.java index aa6b7fa923..00a188737d 100644 --- a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/comparation/LinkedListUnitTest.java +++ b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/comparation/LinkedListUnitTest.java @@ -2,10 +2,8 @@ package com.baeldung.collections.comparation; import org.junit.jupiter.api.Test; -import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; -import java.util.List; import static org.assertj.core.api.Assertions.assertThat; diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/EmployeeSortingByDateUnitTest.java b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/EmployeeSortingByDateUnitTest.java index 250fb7b62b..de2f3d8ca7 100644 --- a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/EmployeeSortingByDateUnitTest.java +++ b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/EmployeeSortingByDateUnitTest.java @@ -10,7 +10,7 @@ import java.util.Date; import java.util.List; import org.apache.commons.lang.time.DateUtils; import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.Test; public class EmployeeSortingByDateUnitTest { diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/multiple/ComparatorsUnitTest.java b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/multiple/ComparatorsUnitTest.java index 4608730567..e1297456be 100644 --- a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/multiple/ComparatorsUnitTest.java +++ b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/multiple/ComparatorsUnitTest.java @@ -5,8 +5,9 @@ import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; -import org.junit.Test; + import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class ComparatorsUnitTest { @Test diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/stackreversal/StackReversalUnitTest.java b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/stackreversal/StackReversalUnitTest.java index 7ad0b71028..ccadc4e7d3 100644 --- a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/stackreversal/StackReversalUnitTest.java +++ b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/stackreversal/StackReversalUnitTest.java @@ -1,10 +1,12 @@ package com.baeldung.stackreversal; +import static org.junit.jupiter.api.Assertions.assertEquals; + import com.baeldung.collections.sorting.Employee; import com.baeldung.collections.stackreversal.ReverseStackUsingQueue; import com.baeldung.collections.stackreversal.ReverseStackUsingRecursion; -import org.junit.Assert; -import org.junit.Test; + +import org.junit.jupiter.api.Test; import java.util.*; import java.util.stream.Collectors; @@ -15,7 +17,7 @@ public class StackReversalUnitTest { ReverseStackUsingQueue reverseStack = new ReverseStackUsingQueue(); Stack originalStack = generateStackFromGivenList(Arrays.stream(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}).boxed().collect(Collectors.toList()), new Stack()); Stack reverseList = generateStackFromGivenList(Arrays.stream(new int[]{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}).boxed().collect(Collectors.toList()), new Stack()); - Assert.assertEquals(reverseStack.reverseIntegerStack(originalStack), reverseList); + assertEquals(reverseStack.reverseIntegerStack(originalStack), reverseList); } @Test @@ -26,7 +28,7 @@ public class StackReversalUnitTest { Collections.reverse(listOfWordsReversed); Stack originalStack = generateStackFromGivenList(listOfWords, new Stack()); Stack reversedStack = generateStackFromGivenList(listOfWordsReversed, new Stack()); - Assert.assertEquals(stackReversal.reverseStringStack(originalStack), reversedStack); + assertEquals(stackReversal.reverseStringStack(originalStack), reversedStack); } @Test @@ -43,7 +45,7 @@ public class StackReversalUnitTest { Collections.reverse(employeeReversed); Stack originalStack = generateStackFromGivenList(employeeList, new Stack()); Stack reverseStack = generateStackFromGivenList(employeeReversed, new Stack()); - Assert.assertEquals(stackReversal.reverseEmployeeStack(originalStack), reverseStack); + assertEquals(stackReversal.reverseEmployeeStack(originalStack), reverseStack); } @Test @@ -51,7 +53,7 @@ public class StackReversalUnitTest { ReverseStackUsingRecursion reverseStack = new ReverseStackUsingRecursion(); Stack originalStack = generateStackFromGivenList(Arrays.stream(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}).boxed().collect(Collectors.toList()), new Stack()); Stack reversedStack = generateStackFromGivenList(Arrays.stream(new int[]{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}).boxed().collect(Collectors.toList()), new Stack()); - Assert.assertEquals(reverseStack.reverseIntegerStack(originalStack), reversedStack); + assertEquals(reverseStack.reverseIntegerStack(originalStack), reversedStack); } private Stack generateStackFromGivenList(List elements, Stack stack){ diff --git a/core-java-modules/core-java-collections-maps/README.md b/core-java-modules/core-java-collections-maps/README.md index 15cb32fbe8..034c71ba9a 100644 --- a/core-java-modules/core-java-collections-maps/README.md +++ b/core-java-modules/core-java-collections-maps/README.md @@ -12,4 +12,5 @@ This module contains articles about Map data structures in Java. - [Immutable Map Implementations in Java](https://www.baeldung.com/java-immutable-maps) - [Guide to Apache Commons MultiValuedMap](https://www.baeldung.com/apache-commons-multi-valued-map) - [The Java HashMap Under the Hood](https://www.baeldung.com/java-hashmap-advanced) +- [Create an Empty Map in Java](https://www.baeldung.com/java-create-empty-map) - More articles: [[next -->]](/core-java-modules/core-java-collections-maps-2) diff --git a/core-java-modules/core-java-collections-maps/pom.xml b/core-java-modules/core-java-collections-maps/pom.xml index 34b878df53..3a1bf0d8a1 100644 --- a/core-java-modules/core-java-collections-maps/pom.xml +++ b/core-java-modules/core-java-collections-maps/pom.xml @@ -20,6 +20,12 @@ commons-collections4 ${commons-collections4.version} + + org.junit.platform + junit-platform-runner + ${junit-platform.version} + test + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/maps/initialize/EmptyMapInitializer.java b/core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/EmptyMapInitializer.java similarity index 97% rename from core-java-modules/core-java-collections-4/src/main/java/com/baeldung/maps/initialize/EmptyMapInitializer.java rename to core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/EmptyMapInitializer.java index 78819cc21e..106de799e7 100644 --- a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/maps/initialize/EmptyMapInitializer.java +++ b/core-java-modules/core-java-collections-maps/src/main/java/com/baeldung/map/EmptyMapInitializer.java @@ -1,7 +1,5 @@ -package com.baeldung.maps.initialize; +package com.baeldung.map; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; @@ -10,6 +8,9 @@ import java.util.NavigableMap; import java.util.SortedMap; import java.util.TreeMap; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; + public class EmptyMapInitializer { public static Map articleMap; diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/maps/initialize/EmptyMapInitializerUnitTest.java b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/EmptyMapInitializerUnitTest.java similarity index 96% rename from core-java-modules/core-java-collections-4/src/test/java/com/baeldung/maps/initialize/EmptyMapInitializerUnitTest.java rename to core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/EmptyMapInitializerUnitTest.java index 57183734cb..94a70cdd5d 100644 --- a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/maps/initialize/EmptyMapInitializerUnitTest.java +++ b/core-java-modules/core-java-collections-maps/src/test/java/com/baeldung/map/EmptyMapInitializerUnitTest.java @@ -1,11 +1,12 @@ -package com.baeldung.maps.initialize; - -import java.util.Map; -import org.junit.Test; +package com.baeldung.map; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.Map; + +import org.junit.Test; + public class EmptyMapInitializerUnitTest { @Test(expected=UnsupportedOperationException.class) diff --git a/core-java-modules/core-java-collections-set-2/README.md b/core-java-modules/core-java-collections-set-2/README.md index 48c70084ca..a11329365a 100644 --- a/core-java-modules/core-java-collections-set-2/README.md +++ b/core-java-modules/core-java-collections-set-2/README.md @@ -2,3 +2,5 @@ - [Using Streams to Collect Into a TreeSet](https://www.baeldung.com/java-stream-collect-into-treeset) - [A Guide to LinkedHashSet in Java](https://www.baeldung.com/java-linkedhashset) +- [Sorting a HashSet in Java](https://www.baeldung.com/java-sort-hashset) +- More articles: [[<-- prev]](/core-java-modules/core-java-collections-set) \ No newline at end of file diff --git a/core-java-modules/core-java-collections-set-2/pom.xml b/core-java-modules/core-java-collections-set-2/pom.xml index d3f54554e0..b1aadb0c22 100644 --- a/core-java-modules/core-java-collections-set-2/pom.xml +++ b/core-java-modules/core-java-collections-set-2/pom.xml @@ -15,6 +15,12 @@ + + org.junit.platform + junit-platform-runner + ${junit-platform.version} + test + diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/HashSetUnitTest.java b/core-java-modules/core-java-collections-set-2/src/test/java/com/baeldung/hashset/sorting/HashSetUnitTest.java similarity index 97% rename from core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/HashSetUnitTest.java rename to core-java-modules/core-java-collections-set-2/src/test/java/com/baeldung/hashset/sorting/HashSetUnitTest.java index de0b084216..ebb400570f 100644 --- a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/HashSetUnitTest.java +++ b/core-java-modules/core-java-collections-set-2/src/test/java/com/baeldung/hashset/sorting/HashSetUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.collections.sorting; +package com.baeldung.hashset.sorting; import static org.assertj.core.api.Assertions.assertThat; From c0157effb048677bc0ab4782c988a01f822c179a Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sat, 14 Jan 2023 03:34:54 +0100 Subject: [PATCH 267/592] [List-CaseInsenContains] Case-Insensitive Searching in ArrayList (#13280) --- .../list/ignorecase/IgnoreCaseSearchUtil.java | 14 ++++++ .../list/ignorecase/IgnoreCaseStringList.java | 29 ++++++++++++ .../IgnoreCaseContainsUnitTest.java | 45 +++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/list/ignorecase/IgnoreCaseSearchUtil.java create mode 100644 core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/list/ignorecase/IgnoreCaseStringList.java create mode 100644 core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/list/ignorecase/IgnoreCaseContainsUnitTest.java diff --git a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/list/ignorecase/IgnoreCaseSearchUtil.java b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/list/ignorecase/IgnoreCaseSearchUtil.java new file mode 100644 index 0000000000..38532ef031 --- /dev/null +++ b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/list/ignorecase/IgnoreCaseSearchUtil.java @@ -0,0 +1,14 @@ +package com.baeldung.list.ignorecase; + +import java.util.List; + +public class IgnoreCaseSearchUtil { + public static boolean ignoreCaseContains(List theList, String searchStr) { + for (String s : theList) { + if (searchStr.equalsIgnoreCase(s)) { + return true; + } + } + return false; + } +} diff --git a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/list/ignorecase/IgnoreCaseStringList.java b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/list/ignorecase/IgnoreCaseStringList.java new file mode 100644 index 0000000000..a27c2650ed --- /dev/null +++ b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/list/ignorecase/IgnoreCaseStringList.java @@ -0,0 +1,29 @@ +package com.baeldung.list.ignorecase; + +import java.util.ArrayList; +import java.util.Collection; + +public class IgnoreCaseStringList extends ArrayList { + + public IgnoreCaseStringList() { + + } + + public IgnoreCaseStringList(Collection c) { + super(c); + } + + @Override + public boolean contains(Object o) { + String searchStr = (String) o; + // Using Stream API: + // return this.stream().anyMatch(searchStr::equalsIgnoreCase); + for (String s : this) { + if (searchStr.equalsIgnoreCase(s)) { + return true; + } + } + return false; + } + +} diff --git a/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/list/ignorecase/IgnoreCaseContainsUnitTest.java b/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/list/ignorecase/IgnoreCaseContainsUnitTest.java new file mode 100644 index 0000000000..5ca9bb1028 --- /dev/null +++ b/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/list/ignorecase/IgnoreCaseContainsUnitTest.java @@ -0,0 +1,45 @@ +package com.baeldung.list.ignorecase; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class IgnoreCaseContainsUnitTest { + private static final List LANGUAGES = Arrays.asList("Java", "Python", "Kotlin", "Ruby", "Javascript", "Go"); + + @Test + void givenStringList_whenCallTheStandardContains_shouldReturnFalse() { + String searchStr = "jAvA"; + boolean result = LANGUAGES.contains(searchStr); + assertFalse(result); + } + + @Test + void givenStringList_whenSearchIgnoreCaseUsingStreamAPI_shouldReturnTrue() { + String searchStr = "koTliN"; + boolean result = LANGUAGES.stream().anyMatch(searchStr::equalsIgnoreCase); + assertTrue(result); + } + + @Test + void givenStringList_whenUsingUtilClass_shouldReturnTrue() { + String searchStr = "ruBY"; + boolean result = IgnoreCaseSearchUtil.ignoreCaseContains(LANGUAGES, searchStr); + assertTrue(result); + } + + @Test + void givenStringList_whenUsingIgnoreCaseStringList_shouldReturnTrue() { + String searchStr = "pYtHoN"; + List ignoreCaseList = new IgnoreCaseStringList(LANGUAGES); + boolean result = ignoreCaseList.contains(searchStr); + assertTrue(result); + + boolean resultContainAll = ignoreCaseList.containsAll(Arrays.asList("pYtHon", "jAvA", "koTliN", "ruBY")); + assertTrue(resultContainAll); + } +} From e80b67b507bb55e88cf91384f14b51cec02eaaf7 Mon Sep 17 00:00:00 2001 From: Abhinav Pandey Date: Sat, 14 Jan 2023 11:37:48 +0530 Subject: [PATCH 268/592] Bael 5436 new (#13283) * BAEL-5777 - Mocking a singleton with Mockito * BAEL-5436 - Root mapping * Revert "BAEL-5777 - Mocking a singleton with Mockito" This reverts commit 358a061997a4b853e3215dea0217a070f0e391e4. * BAEL-5436 - Uncommenting controller --- .../rootmapping/RootMappingApplication.java | 14 ++++++++++++++ .../com/baeldung/rootmapping/config/WebConfig.java | 13 +++++++++++++ .../rootmapping/controller/RootController.java | 12 ++++++++++++ .../src/main/resources/templates/index.html | 10 ++++++++++ 4 files changed, 49 insertions(+) create mode 100644 spring-web-modules/spring-web-url/src/main/java/com/baeldung/rootmapping/RootMappingApplication.java create mode 100644 spring-web-modules/spring-web-url/src/main/java/com/baeldung/rootmapping/config/WebConfig.java create mode 100644 spring-web-modules/spring-web-url/src/main/java/com/baeldung/rootmapping/controller/RootController.java create mode 100644 spring-web-modules/spring-web-url/src/main/resources/templates/index.html diff --git a/spring-web-modules/spring-web-url/src/main/java/com/baeldung/rootmapping/RootMappingApplication.java b/spring-web-modules/spring-web-url/src/main/java/com/baeldung/rootmapping/RootMappingApplication.java new file mode 100644 index 0000000000..f64753fa36 --- /dev/null +++ b/spring-web-modules/spring-web-url/src/main/java/com/baeldung/rootmapping/RootMappingApplication.java @@ -0,0 +1,14 @@ +package com.baeldung.rootmapping; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +@SpringBootApplication +@EnableWebMvc +public class RootMappingApplication { + + public static void main(String[] args) { + SpringApplication.run(RootMappingApplication.class, args); + } +} \ No newline at end of file diff --git a/spring-web-modules/spring-web-url/src/main/java/com/baeldung/rootmapping/config/WebConfig.java b/spring-web-modules/spring-web-url/src/main/java/com/baeldung/rootmapping/config/WebConfig.java new file mode 100644 index 0000000000..ba15bc992c --- /dev/null +++ b/spring-web-modules/spring-web-url/src/main/java/com/baeldung/rootmapping/config/WebConfig.java @@ -0,0 +1,13 @@ +package com.baeldung.rootmapping.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("index"); + } +} diff --git a/spring-web-modules/spring-web-url/src/main/java/com/baeldung/rootmapping/controller/RootController.java b/spring-web-modules/spring-web-url/src/main/java/com/baeldung/rootmapping/controller/RootController.java new file mode 100644 index 0000000000..7724e43e71 --- /dev/null +++ b/spring-web-modules/spring-web-url/src/main/java/com/baeldung/rootmapping/controller/RootController.java @@ -0,0 +1,12 @@ +package com.baeldung.rootmapping.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class RootController { + @GetMapping("/") + public String index() { + return "index"; + } +} \ No newline at end of file diff --git a/spring-web-modules/spring-web-url/src/main/resources/templates/index.html b/spring-web-modules/spring-web-url/src/main/resources/templates/index.html new file mode 100644 index 0000000000..acfb847868 --- /dev/null +++ b/spring-web-modules/spring-web-url/src/main/resources/templates/index.html @@ -0,0 +1,10 @@ + + + + + Index Page + + +

    Hello World!

    + + \ No newline at end of file From abaa0ef7cfb5faad2518f9f3e3ce8e35f18aef6f Mon Sep 17 00:00:00 2001 From: Alex Golub Date: Sat, 14 Jan 2023 18:08:53 +0200 Subject: [PATCH 269/592] Bump to Groovy `3.0.8` --- core-groovy-modules/core-groovy-2/pom.xml | 7 ++++--- core-groovy-modules/core-groovy-collections/pom.xml | 8 +++++--- core-groovy-modules/core-groovy-strings/pom.xml | 7 ++++--- core-groovy-modules/core-groovy/pom.xml | 8 +++++--- core-groovy-modules/pom.xml | 10 +++++----- 5 files changed, 23 insertions(+), 17 deletions(-) diff --git a/core-groovy-modules/core-groovy-2/pom.xml b/core-groovy-modules/core-groovy-2/pom.xml index a177844a15..2b864ec7a1 100644 --- a/core-groovy-modules/core-groovy-2/pom.xml +++ b/core-groovy-modules/core-groovy-2/pom.xml @@ -155,8 +155,9 @@ - central - https://jcenter.bintray.com + maven_central + Maven Central + https://repo.maven.apache.org/maven2/ @@ -167,4 +168,4 @@ 3.3.0-01 - \ No newline at end of file + diff --git a/core-groovy-modules/core-groovy-collections/pom.xml b/core-groovy-modules/core-groovy-collections/pom.xml index 5269121140..6d43ce7d18 100644 --- a/core-groovy-modules/core-groovy-collections/pom.xml +++ b/core-groovy-modules/core-groovy-collections/pom.xml @@ -113,9 +113,11 @@ - central - http://jcenter.bintray.com + maven_central + Maven Central + https://repo.maven.apache.org/maven2/ - \ No newline at end of file + + diff --git a/core-groovy-modules/core-groovy-strings/pom.xml b/core-groovy-modules/core-groovy-strings/pom.xml index e51ebfbd4b..fac0f25219 100644 --- a/core-groovy-modules/core-groovy-strings/pom.xml +++ b/core-groovy-modules/core-groovy-strings/pom.xml @@ -103,9 +103,10 @@ - central - https://jcenter.bintray.com + maven_central + Maven Central + https://repo.maven.apache.org/maven2/ - \ No newline at end of file + diff --git a/core-groovy-modules/core-groovy/pom.xml b/core-groovy-modules/core-groovy/pom.xml index 413fbde106..cf6cca9e18 100644 --- a/core-groovy-modules/core-groovy/pom.xml +++ b/core-groovy-modules/core-groovy/pom.xml @@ -3,6 +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 + core-groovy 1.0-SNAPSHOT core-groovy @@ -103,9 +104,10 @@ - central - https://jcenter.bintray.com + maven_central + Maven Central + https://repo.maven.apache.org/maven2/ - \ No newline at end of file + diff --git a/core-groovy-modules/pom.xml b/core-groovy-modules/pom.xml index e1ff538942..2d1120e435 100644 --- a/core-groovy-modules/pom.xml +++ b/core-groovy-modules/pom.xml @@ -21,12 +21,12 @@ - 2.5.7 - 2.5.6 - 2.5.6 + 3.0.8 + 3.0.8 + 3.0.8 2.4.0 - 1.1-groovy-2.4 + 2.3-groovy-3.0 1.6 - \ No newline at end of file + From 85775f930a01ea452ba39381b07773d854604e16 Mon Sep 17 00:00:00 2001 From: Alex Golub Date: Sat, 14 Jan 2023 18:09:17 +0200 Subject: [PATCH 270/592] SQL queries conventions --- .../com/baeldung/groovy/sql/SqlTest.groovy | 52 +++++++++++-------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/groovy/sql/SqlTest.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/groovy/sql/SqlTest.groovy index ac96a55773..da982744e9 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/groovy/sql/SqlTest.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/groovy/sql/SqlTest.groovy @@ -1,28 +1,29 @@ package com.baeldung.groovy.sql import groovy.sql.GroovyResultSet -import groovy.sql.GroovyRowResult import groovy.sql.Sql -import groovy.transform.CompileStatic -import static org.junit.Assert.* import org.junit.Test +import static org.junit.Assert.* + class SqlTest { - final Map dbConnParams = [url: 'jdbc:hsqldb:mem:testDB', user: 'sa', password: '', driver: 'org.hsqldb.jdbc.JDBCDriver'] + final Map dbConnParams = [url: 'jdbc:hsqldb:mem:testDB', + user: 'sa', + password: '', + driver: 'org.hsqldb.jdbc.JDBCDriver'] @Test void whenNewSqlInstance_thenDbIsAccessed() { def sql = Sql.newInstance(dbConnParams) sql.close() - sql.close() } @Test void whenTableDoesNotExist_thenSelectFails() { try { Sql.withInstance(dbConnParams) { Sql sql -> - sql.eachRow('select * from PROJECT') {} + sql.eachRow('SELECT * FROM PROJECT') {} } fail("An exception should have been thrown") @@ -34,12 +35,12 @@ class SqlTest { @Test void whenTableCreated_thenSelectIsPossible() { Sql.withInstance(dbConnParams) { Sql sql -> - def result = sql.execute 'create table PROJECT_1 (id integer not null, name varchar(50), url varchar(100))' + def result = sql.execute 'CREATE TABLE PROJECT_1 (ID INTEGER NOT NULL, NAME VARCHAR(50), URL VARCHAR(100))' assertEquals(0, sql.updateCount) assertFalse(result) - result = sql.execute('select * from PROJECT_1') + result = sql.execute('SELECT * FROM PROJECT_1') assertTrue(result) } @@ -48,7 +49,7 @@ class SqlTest { @Test void whenIdentityColumn_thenInsertReturnsNewId() { Sql.withInstance(dbConnParams) { Sql sql -> - sql.execute 'create table PROJECT_2 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.execute 'CREATE TABLE PROJECT_2 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' def ids = sql.executeInsert("INSERT INTO PROJECT_2 (NAME, URL) VALUES ('tutorials', 'github.com/eugenp/tutorials')") assertEquals(0, ids[0][0]) @@ -62,9 +63,10 @@ class SqlTest { @Test void whenUpdate_thenNumberOfAffectedRows() { Sql.withInstance(dbConnParams) { Sql sql -> - sql.execute 'create table PROJECT_3 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.execute 'CREATE TABLE PROJECT_3 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' sql.executeInsert("INSERT INTO PROJECT_3 (NAME, URL) VALUES ('tutorials', 'github.com/eugenp/tutorials')") sql.executeInsert("INSERT INTO PROJECT_3 (NAME, URL) VALUES ('REST with Spring', 'github.com/eugenp/REST-With-Spring')") + def count = sql.executeUpdate("UPDATE PROJECT_3 SET URL = 'https://' + URL") assertEquals(2, count) @@ -74,7 +76,7 @@ class SqlTest { @Test void whenEachRow_thenResultSetHasProperties() { Sql.withInstance(dbConnParams) { Sql sql -> - sql.execute 'create table PROJECT_4 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.execute 'CREATE TABLE PROJECT_4 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' sql.executeInsert("INSERT INTO PROJECT_4 (NAME, URL) VALUES ('tutorials', 'https://github.com/eugenp/tutorials')") sql.executeInsert("INSERT INTO PROJECT_4 (NAME, URL) VALUES ('REST with Spring', 'https://github.com/eugenp/REST-With-Spring')") @@ -93,7 +95,7 @@ class SqlTest { @Test void whenPagination_thenSubsetIsReturned() { Sql.withInstance(dbConnParams) { Sql sql -> - sql.execute 'create table PROJECT_5 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.execute 'CREATE TABLE PROJECT_5 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' sql.executeInsert("INSERT INTO PROJECT_5 (NAME, URL) VALUES ('tutorials', 'github.com/eugenp/tutorials')") sql.executeInsert("INSERT INTO PROJECT_5 (NAME, URL) VALUES ('REST with Spring', 'github.com/eugenp/REST-With-Spring')") def rows = sql.rows('SELECT * FROM PROJECT_5 ORDER BY NAME', 1, 1) @@ -106,9 +108,11 @@ class SqlTest { @Test void whenParameters_thenReplacement() { Sql.withInstance(dbConnParams) { Sql sql -> - sql.execute 'create table PROJECT_6 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' - sql.execute('INSERT INTO PROJECT_6 (NAME, URL) VALUES (?, ?)', 'tutorials', 'github.com/eugenp/tutorials') - sql.execute("INSERT INTO PROJECT_6 (NAME, URL) VALUES (:name, :url)", [name: 'REST with Spring', url: 'github.com/eugenp/REST-With-Spring']) + sql.execute 'CREATE TABLE PROJECT_6 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.execute('INSERT INTO PROJECT_6 (NAME, URL) VALUES (?, ?)', + 'tutorials', 'github.com/eugenp/tutorials') + sql.execute("INSERT INTO PROJECT_6 (NAME, URL) VALUES (:name, :url)", + [name: 'REST with Spring', url: 'github.com/eugenp/REST-With-Spring']) def rows = sql.rows("SELECT * FROM PROJECT_6 WHERE NAME = 'tutorials'") @@ -123,7 +127,7 @@ class SqlTest { @Test void whenParametersInGString_thenReplacement() { Sql.withInstance(dbConnParams) { Sql sql -> - sql.execute 'create table PROJECT_7 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.execute 'CREATE TABLE PROJECT_7 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' sql.execute "INSERT INTO PROJECT_7 (NAME, URL) VALUES (${'tutorials'}, ${'github.com/eugenp/tutorials'})" def name = 'REST with Spring' def url = 'github.com/eugenp/REST-With-Spring' @@ -143,7 +147,7 @@ class SqlTest { void whenTransactionRollback_thenNoDataInserted() { Sql.withInstance(dbConnParams) { Sql sql -> sql.withTransaction { - sql.execute 'create table PROJECT_8 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.execute 'CREATE TABLE PROJECT_8 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' sql.executeInsert("INSERT INTO PROJECT_8 (NAME, URL) VALUES ('tutorials', 'https://github.com/eugenp/tutorials')") sql.executeInsert("INSERT INTO PROJECT_8 (NAME, URL) VALUES ('REST with Spring', 'https://github.com/eugenp/REST-With-Spring')") sql.rollback() @@ -159,7 +163,7 @@ class SqlTest { void whenTransactionRollbackThenCommit_thenOnlyLastInserted() { Sql.withInstance(dbConnParams) { Sql sql -> sql.withTransaction { - sql.execute 'create table PROJECT_9 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.execute 'CREATE TABLE PROJECT_9 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' sql.executeInsert("INSERT INTO PROJECT_9 (NAME, URL) VALUES ('tutorials', 'https://github.com/eugenp/tutorials')") sql.rollback() sql.executeInsert("INSERT INTO PROJECT_9 (NAME, URL) VALUES ('REST with Spring', 'https://github.com/eugenp/REST-With-Spring')") @@ -179,11 +183,12 @@ class SqlTest { Sql.withInstance(dbConnParams) { Sql sql -> try { sql.withTransaction { - sql.execute 'create table PROJECT_10 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.execute 'CREATE TABLE PROJECT_10 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' sql.executeInsert("INSERT INTO PROJECT_10 (NAME, URL) VALUES ('tutorials', 'https://github.com/eugenp/tutorials')") throw new Exception('rollback') } - } catch (ignored) {} + } catch (ignored) { + } def rows = sql.rows("SELECT * FROM PROJECT_10") @@ -196,11 +201,12 @@ class SqlTest { Sql.withInstance(dbConnParams) { Sql sql -> try { sql.cacheConnection { - sql.execute 'create table PROJECT_11 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.execute 'CREATE TABLE PROJECT_11 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' sql.executeInsert("INSERT INTO PROJECT_11 (NAME, URL) VALUES ('tutorials', 'https://github.com/eugenp/tutorials')") throw new Exception('This does not rollback') } - } catch (ignored) {} + } catch (ignored) { + } def rows = sql.rows("SELECT * FROM PROJECT_11") @@ -211,7 +217,7 @@ class SqlTest { /*@Test void whenModifyResultSet_thenDataIsChanged() { Sql.withInstance(dbConnParams) { Sql sql -> - sql.execute 'create table PROJECT_5 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.execute 'CREATE TABLE PROJECT_5 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' sql.executeInsert("INSERT INTO PROJECT_5 (NAME, URL) VALUES ('tutorials', 'github.com/eugenp/tutorials')") sql.executeInsert("INSERT INTO PROJECT_5 (NAME, URL) VALUES ('REST with Spring', 'github.com/eugenp/REST-With-Spring')") From ab5c09a958eb9174556f8be8cb8152580e649dac Mon Sep 17 00:00:00 2001 From: Alex Golub Date: Sat, 14 Jan 2023 18:11:19 +0200 Subject: [PATCH 271/592] Test `JsonGenerator` --- .../com/baeldung/json/JsonParserTest.groovy | 58 ++++++++++++++----- 1 file changed, 43 insertions(+), 15 deletions(-) diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/json/JsonParserTest.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/json/JsonParserTest.groovy index e65550a3be..fa7b2fd3c8 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/json/JsonParserTest.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/json/JsonParserTest.groovy @@ -1,5 +1,6 @@ package com.baeldung.json +import groovy.json.JsonGenerator import spock.lang.Specification import java.text.SimpleDateFormat @@ -8,20 +9,42 @@ class JsonParserTest extends Specification { JsonParser jsonParser - void setup () { + void setup() { jsonParser = new JsonParser() } - def 'Should parse to Account given Json String' () { + def 'Should parse to Account given Json String'() { given: - def json = '{"id":"1234","value":15.6}' + def json = '{"id":"1234","value":15.6}' + when: - def account = jsonParser.toObject(json) + def account = jsonParser.toObject(json) + then: - account - account instanceof Account - account.id == '1234' - account.value == 15.6 + account + account instanceof Account + account.id == '1234' + account.value == 15.6 + } + + def 'Should format date and exclude value field'() { + given: + def account = new Account( + id: '123', + value: 15.6, + createdAt: new SimpleDateFormat('MM/dd/yyyy').parse('14/01/2023') + ) + + def jsonGenerator = new JsonGenerator.Options() + .dateFormat('MM/dd/yyyy') + .excludeFieldsByName('value') + .build() + + when: + def accountToJson = jsonGenerator.toJson(account) + + then: + accountToJson == '{"createdAt":"01/31/2024","id":"123"}' } /*def 'Should parse to Account given Json String with date property' () { @@ -52,15 +75,20 @@ class JsonParserTest extends Specification { json == '{"value":15.6,"createdAt":"2018-01-01T00:00:00+0000","id":"123"}' }*/ - def 'Should prettify given a json string' () { + def 'Should prettify given a json string'() { given: - String json = '{"value":15.6,"createdAt":"01/01/2018","id":"123456"}' + String json = '{"value":15.6,"createdAt":"01/01/2018","id":"123456"}' + when: - def jsonPretty = jsonParser.prettyfy(json) + def jsonPretty = jsonParser.prettyfy(json) + then: - jsonPretty - jsonPretty == '{\n "value": 15.6,\n "createdAt": "01/01/2018",\n "id": "123456"\n}' + jsonPretty + jsonPretty == '''\ +{ + "value": 15.6, + "createdAt": "01/01/2018", + "id": "123456" +}''' } - - } From f3a20f71294591544a1283b3da66e67cade6e482 Mon Sep 17 00:00:00 2001 From: Alex Golub Date: Sat, 14 Jan 2023 21:31:29 +0200 Subject: [PATCH 272/592] Align tests with `Spock` testing framework --- .../com/baeldung/strings/Concatenate.groovy | 24 ++- .../baeldung/strings/ConcatenateTest.groovy | 149 ++++++++---------- .../strings/StringMatchingSpec.groovy | 2 +- .../stringtoint/ConvertStringToInt.groovy | 131 ++++++++------- .../stringtypes/CharacterInGroovy.groovy | 17 +- .../stringtypes/DoubleQuotedString.groovy | 63 ++++---- .../stringtypes/SingleQuotedString.groovy | 15 +- .../com/baeldung/stringtypes/Strings.groovy | 21 +-- 8 files changed, 218 insertions(+), 204 deletions(-) diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/strings/Concatenate.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/strings/Concatenate.groovy index b3a0852a0b..4a7c3f8529 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/strings/Concatenate.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/strings/Concatenate.groovy @@ -1,9 +1,10 @@ package com.baeldung.strings; class Concatenate { + String first = 'Hello' String last = 'Groovy' - + String doSimpleConcat() { return 'My name is ' + first + ' ' + last } @@ -23,21 +24,28 @@ class Concatenate { String doConcatUsingLeftShiftOperator() { return 'My name is ' << first << ' ' << last } - + String doConcatUsingArrayJoinMethod() { return ['My name is', first, last].join(' ') } String doConcatUsingArrayInjectMethod() { - return [first,' ', last] - .inject(new StringBuffer('My name is '), { initial, name -> initial.append(name); return initial }).toString() + return [first, ' ', last] + .inject(new StringBuffer('My name is '), { initial, name -> initial.append(name) }) + .toString() } - + String doConcatUsingStringBuilder() { - return new StringBuilder().append('My name is ').append(first).append(' ').append(last) + return new StringBuilder().append('My name is ') + .append(first) + .append(' ') + .append(last) } String doConcatUsingStringBuffer() { - return new StringBuffer().append('My name is ').append(first).append(' ').append(last) + return new StringBuffer().append('My name is ') + .append(first) + .append(' ') + .append(last) } -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/strings/ConcatenateTest.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/strings/ConcatenateTest.groovy index 3ef4a5d460..e4a178a14b 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/strings/ConcatenateTest.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/strings/ConcatenateTest.groovy @@ -1,101 +1,88 @@ -import com.baeldung.strings.Concatenate; +import com.baeldung.strings.Concatenate +import spock.lang.Specification -class ConcatenateTest extends GroovyTestCase { - - void testSimpleConcat() { - def name = new Concatenate() - name.first = 'Joe'; - name.last = 'Smith'; - def expected = 'My name is Joe Smith' - assertToString(name.doSimpleConcat(), expected) - } - - void testConcatUsingGString() { - def name = new Concatenate() - name.first = "Joe"; - name.last = "Smith"; - def expected = "My name is Joe Smith" - assertToString(name.doConcatUsingGString(), expected) - } - - void testConcatUsingGStringClosures() { - def name = new Concatenate() - name.first = "Joe"; - name.last = "Smith"; - def expected = "My name is Joe Smith" - assertToString(name.doConcatUsingGStringClosures(), expected) - } - - void testConcatUsingStringConcatMethod() { - def name = new Concatenate() - name.first = "Joe"; - name.last = "Smith"; - def expected = "My name is Joe Smith" - assertToString(name.doConcatUsingStringConcatMethod(), expected) +class ConcatenateTest extends Specification { + + final Concatenate NAME = new Concatenate(first: 'Joe', last: 'Smith') + final String EXPECTED = "My name is Joe Smith"; + + def "SimpleConcat"() { + expect: + NAME.doSimpleConcat() == EXPECTED } - void testConcatUsingLeftShiftOperator() { - def name = new Concatenate() - name.first = "Joe"; - name.last = "Smith"; - def expected = "My name is Joe Smith" - assertToString(name.doConcatUsingLeftShiftOperator(), expected) + def "ConcatUsingGString"() { + expect: + NAME.doConcatUsingGString() == EXPECTED } - void testConcatUsingArrayJoinMethod() { - def name = new Concatenate() - name.first = "Joe"; - name.last = "Smith"; - def expected = "My name is Joe Smith" - assertToString(name.doConcatUsingArrayJoinMethod(), expected) + def "ConcatUsingGStringClosures"() { + expect: + NAME.doConcatUsingGStringClosures() == EXPECTED } - void testConcatUsingArrayInjectMethod() { - def name = new Concatenate() - name.first = "Joe"; - name.last = "Smith"; - def expected = "My name is Joe Smith" - assertToString(name.doConcatUsingArrayInjectMethod(), expected) + def "ConcatUsingStringConcatMethod"() { + expect: + NAME.doConcatUsingStringConcatMethod() == EXPECTED } - void testConcatUsingStringBuilder() { - def name = new Concatenate() - name.first = "Joe"; - name.last = "Smith"; - def expected = "My name is Joe Smith" - assertToString(name.doConcatUsingStringBuilder(), expected) + def "ConcatUsingLeftShiftOperator"() { + expect: + NAME.doConcatUsingLeftShiftOperator() == EXPECTED } - void testConcatUsingStringBuffer() { - def name = new Concatenate() - name.first = "Joe"; - name.last = "Smith"; - def expected = "My name is Joe Smith" - assertToString(name.doConcatUsingStringBuffer(), expected) + def "ConcatUsingArrayJoinMethod"() { + expect: + NAME.doConcatUsingArrayJoinMethod() == EXPECTED } - void testConcatMultilineUsingStringConcatMethod() { - def name = new Concatenate() - name.first = '''Joe + def "ConcatUsingArrayInjectMethod"() { + expect: + NAME.doConcatUsingArrayInjectMethod() == EXPECTED + } + + def "ConcatUsingStringBuilder"() { + expect: + NAME.doConcatUsingStringBuilder() == EXPECTED + } + + def "ConcatUsingStringBuffer"() { + expect: + NAME.doConcatUsingStringBuffer() == EXPECTED + } + + def "ConcatMultilineUsingStringConcatMethod"() { + when: + NAME.first = '''Joe Smith - '''; - name.last = 'Junior'; + ''' + NAME.last = 'Junior' + + then: def expected = '''My name is Joe Smith - Junior'''; - assertToString(name.doConcatUsingStringConcatMethod(), expected) + Junior''' + NAME.doConcatUsingStringConcatMethod() == expected } - void testGStringvsClosure(){ - def first = "Joe"; - def last = "Smith"; - def eagerGString = "My name is $first $last" - def lazyGString = "My name is ${-> first} ${-> last}" + def "GStringvsClosure"() { + given: + def eagerGString = "My name is $NAME.first $NAME.last" + def lazyGString = "My name is ${-> NAME.first} ${-> NAME.last}" - assert eagerGString == "My name is Joe Smith" - assert lazyGString == "My name is Joe Smith" - first = "David"; - assert eagerGString == "My name is Joe Smith" - assert lazyGString == "My name is David Smith" - } + expect: + eagerGString == "My name is Joe Smith" + lazyGString == "My name is Joe Smith" + } + + def "LazyVsEager"() { + given: + def eagerGString = "My name is $NAME.first $NAME.last" + def lazyGString = "My name is ${-> NAME.first} ${-> NAME.last}" + NAME.first = "David" + + expect: + eagerGString == "My name is Joe Smith" + lazyGString == "My name is David Smith" + } } diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/strings/StringMatchingSpec.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/strings/StringMatchingSpec.groovy index 3865bc73fa..89202d9500 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/strings/StringMatchingSpec.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/strings/StringMatchingSpec.groovy @@ -13,7 +13,7 @@ class StringMatchingSpec extends Specification { expect: p instanceof Pattern - and: "you can use slash strings to avoid escaping of blackslash" + and: "you can use slash strings to avoid escaping of backslash" def digitPattern = ~/\d*/ digitPattern.matcher('4711').matches() } diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtoint/ConvertStringToInt.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtoint/ConvertStringToInt.groovy index 48cf48fa8a..cce6ede989 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtoint/ConvertStringToInt.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtoint/ConvertStringToInt.groovy @@ -1,110 +1,119 @@ package com.baeldung.stringtoint -import org.junit.Test +import spock.lang.Specification import java.text.DecimalFormat -import static org.junit.Assert.assertEquals -import static org.junit.Assert.assertNull +class ConvertStringToInt extends Specification { -class ConvertStringToInt { + final String STRING_NUM = "123" + final int EXPECTED_INT = 123 - @Test - void givenString_whenUsingAsInteger_thenConvertToInteger() { - def stringNum = "123" + def "givenString_whenUsingAsInteger_thenConvertToInteger"() { + given: def invalidString = "123a" - Integer expectedInteger = 123 - Integer integerNum = stringNum as Integer + Integer integerNum = STRING_NUM as Integer + + when: def intNum = invalidString?.isInteger() ? invalidString as Integer : null - assertNull(null, intNum) - assertEquals(integerNum, expectedInteger) + then: + intNum == null + integerNum == EXPECTED_INT } - @Test - void givenString_whenUsingAsInt_thenConvertToInt() { - def stringNum = "123" - int expectedInt = 123 - int intNum = stringNum as int + def "givenString_whenUsingAsInt_thenConvertToInt"() { + given: + int intNum = STRING_NUM as int - assertEquals(intNum, expectedInt) + expect: + intNum == EXPECTED_INT } - @Test - void givenString_whenUsingToInteger_thenConvertToInteger() { - def stringNum = "123" - int expectedInt = 123 - int intNum = stringNum.toInteger() + def "givenString_whenUsingToInteger_thenConvertToInteger"() { + given: + int intNum = STRING_NUM.toInteger() - assertEquals(intNum, expectedInt) + expect: + intNum == EXPECTED_INT } - @Test - void givenString_whenUsingParseInt_thenConvertToInteger() { - def stringNum = "123" - int expectedInt = 123 - int intNum = Integer.parseInt(stringNum) + def "givenString_whenUsingParseInt_thenConvertToInteger"() { + given: + int intNum = Integer.parseInt(STRING_NUM) - assertEquals(intNum, expectedInt) + expect: + intNum == EXPECTED_INT } - @Test - void givenString_whenUsingValueOf_thenConvertToInteger() { - def stringNum = "123" - int expectedInt = 123 - int intNum = Integer.valueOf(stringNum) + def "givenString_whenUsingValueOf_thenConvertToInteger"() { + given: + int intNum = Integer.valueOf(STRING_NUM) - assertEquals(intNum, expectedInt) + expect: + intNum == EXPECTED_INT } - @Test - void givenString_whenUsingIntValue_thenConvertToInteger() { - def stringNum = "123" - int expectedInt = 123 - int intNum = new Integer(stringNum).intValue() + def "givenString_whenUsingIntValue_thenConvertToInteger"() { + given: + int intNum = Integer.valueOf(STRING_NUM).intValue() - assertEquals(intNum, expectedInt) + expect: + intNum == EXPECTED_INT } - @Test - void givenString_whenUsingNewInteger_thenConvertToInteger() { - def stringNum = "123" - int expectedInt = 123 - int intNum = new Integer(stringNum) + def "givenString_whenUsingNewInteger_thenConvertToInteger"() { + given: + Integer intNum = Integer.valueOf(STRING_NUM) - assertEquals(intNum, expectedInt) + expect: + intNum == EXPECTED_INT } - @Test - void givenString_whenUsingDecimalFormat_thenConvertToInteger() { - def stringNum = "123" - int expectedInt = 123 + def "givenString_whenUsingDecimalFormat_thenConvertToInteger"() { + given: DecimalFormat decimalFormat = new DecimalFormat("#") - int intNum = decimalFormat.parse(stringNum).intValue() - assertEquals(intNum, expectedInt) + when: + int intNum = decimalFormat.parse(STRING_NUM).intValue() + + then: + intNum == EXPECTED_INT } - @Test(expected = NumberFormatException.class) - void givenInvalidString_whenUsingAs_thenThrowNumberFormatException() { + def "givenInvalidString_whenUsingAs_thenThrowNumberFormatException"() { + given: def invalidString = "123a" + + when: invalidString as Integer + + then: + thrown(NumberFormatException) } - @Test(expected = NullPointerException.class) - void givenNullString_whenUsingToInteger_thenThrowNullPointerException() { + def "givenNullString_whenUsingToInteger_thenThrowNullPointerException"() { + given: def invalidString = null + + when: invalidString.toInteger() + + then: + thrown(NullPointerException) } - @Test - void givenString_whenUsingIsInteger_thenCheckIfCorrectValue() { + def "givenString_whenUsingIsInteger_thenCheckIfCorrectValue"() { + given: def invalidString = "123a" def validString = "123" + + when: def invalidNum = invalidString?.isInteger() ? invalidString as Integer : false def correctNum = validString?.isInteger() ? validString as Integer : false - assertEquals(false, invalidNum) - assertEquals(123, correctNum) + then: + !invalidNum + correctNum == 123 } } diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/CharacterInGroovy.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/CharacterInGroovy.groovy index c043723d95..30365ec9d7 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/CharacterInGroovy.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/CharacterInGroovy.groovy @@ -1,19 +1,18 @@ package groovy.com.baeldung.stringtypes -import org.junit.Assert -import org.junit.Test +import spock.lang.Specification -class CharacterInGroovy { +class CharacterInGroovy extends Specification { - @Test - void 'character'() { + def 'character'() { + given: char a = 'A' as char char b = 'B' as char char c = (char) 'C' - Assert.assertTrue(a instanceof Character) - Assert.assertTrue(b instanceof Character) - Assert.assertTrue(c instanceof Character) + expect: + a instanceof Character + b instanceof Character + c instanceof Character } - } diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/DoubleQuotedString.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/DoubleQuotedString.groovy index a730244d0a..e1074145f4 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/DoubleQuotedString.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/DoubleQuotedString.groovy @@ -1,67 +1,76 @@ package groovy.com.baeldung.stringtypes -import org.junit.Assert -import org.junit.Test +import spock.lang.Specification -class DoubleQuotedString { +class DoubleQuotedString extends Specification { - @Test - void 'escape double quoted string'() { + def 'escape double quoted string'() { + given: def example = "Hello \"world\"!" - println(example) + expect: + example == 'Hello "world"!' } - @Test - void 'String ang GString'() { + def 'String ang GString'() { + given: def string = "example" def stringWithExpression = "example${2}" - Assert.assertTrue(string instanceof String) - Assert.assertTrue(stringWithExpression instanceof GString) - Assert.assertTrue(stringWithExpression.toString() instanceof String) + expect: + string instanceof String + stringWithExpression instanceof GString + stringWithExpression.toString() instanceof String } - @Test - void 'placeholder with variable'() { + def 'placeholder with variable'() { + given: def name = "John" + + when: def helloName = "Hello $name!".toString() - Assert.assertEquals("Hello John!", helloName) + then: + helloName == "Hello John!" } - @Test - void 'placeholder with expression'() { + def 'placeholder with expression'() { + given: def result = "result is ${2 * 2}".toString() - Assert.assertEquals("result is 4", result) + expect: + result == "result is 4" } - @Test - void 'placeholder with dotted access'() { + def 'placeholder with dotted access'() { + given: def person = [name: 'John'] + when: def myNameIs = "I'm $person.name, and you?".toString() - Assert.assertEquals("I'm John, and you?", myNameIs) + then: + myNameIs == "I'm John, and you?" } - @Test - void 'placeholder with method call'() { + def 'placeholder with method call'() { + given: def name = 'John' + when: def result = "Uppercase name: ${name.toUpperCase()}".toString() - Assert.assertEquals("Uppercase name: JOHN", result) + then: + result == "Uppercase name: JOHN" } - @Test - void 'GString and String hashcode'() { + def 'GString and String hashcode'() { + given: def string = "2+2 is 4" def gstring = "2+2 is ${4}" - Assert.assertTrue(string.hashCode() != gstring.hashCode()) + expect: + string.hashCode() != gstring.hashCode() } - } diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/SingleQuotedString.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/SingleQuotedString.groovy index 569991b788..924515570c 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/SingleQuotedString.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/SingleQuotedString.groovy @@ -1,15 +1,14 @@ package groovy.com.baeldung.stringtypes -import org.junit.Assert -import org.junit.Test +import spock.lang.Specification -class SingleQuotedString { +class SingleQuotedString extends Specification { - @Test - void 'single quoted string'() { - def example = 'Hello world' + def 'single quoted string'() { + given: + def example = 'Hello world!' - Assert.assertEquals('Hello world!', 'Hello' + ' world!') + expect: + example == 'Hello' + ' world!' } - } diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/Strings.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/Strings.groovy index e45f352285..9d29210d81 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/Strings.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/Strings.groovy @@ -1,26 +1,29 @@ package groovy.com.baeldung.stringtypes -import org.junit.Assert -import org.junit.Test +import spock.lang.Specification -class Strings { +class Strings extends Specification { - @Test - void 'string interpolation '() { + def 'string interpolation '() { + given: def name = "Kacper" + when: def result = "Hello ${name}!" - Assert.assertEquals("Hello Kacper!", result.toString()) + then: + result.toString() == "Hello Kacper!" } - @Test - void 'string concatenation'() { + def 'string concatenation'() { + given: def first = "first" def second = "second" + when: def concatenation = first + second - Assert.assertEquals("firstsecond", concatenation) + then: + concatenation == "firstsecond" } } From c34a4ac328d606f223b590f838ed77ad4b81cd70 Mon Sep 17 00:00:00 2001 From: Alex Golub Date: Sat, 14 Jan 2023 19:50:22 +0200 Subject: [PATCH 273/592] Reformat and single liner `read*` methods --- .../groovy/com/baeldung/file/ReadFile.groovy | 62 +++++------- .../com/baeldung/file/ReadFileUnitTest.groovy | 99 ++++++++++--------- 2 files changed, 78 insertions(+), 83 deletions(-) diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/file/ReadFile.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/file/ReadFile.groovy index 4239fa534c..1418947cc7 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/file/ReadFile.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/file/ReadFile.groovy @@ -10,13 +10,14 @@ class ReadFile { int readFileLineByLine(String filePath) { File file = new File(filePath) def line, noOfLines = 0; + file.withReader { reader -> - while ((line = reader.readLine())!=null) - { + while ((line = reader.readLine()) != null) { println "${line}" noOfLines++ } } + return noOfLines } @@ -26,9 +27,7 @@ class ReadFile { * @return */ List readFileInList(String filePath) { - File file = new File(filePath) - def lines = file.readLines() - return lines + return new File(filePath).readLines() } /** @@ -37,9 +36,7 @@ class ReadFile { * @return */ String readFileString(String filePath) { - File file = new File(filePath) - String fileContent = file.text - return fileContent + return new File(filePath).text } /** @@ -48,9 +45,7 @@ class ReadFile { * @return */ String readFileStringWithCharset(String filePath) { - File file = new File(filePath) - String utf8Content = file.getText("UTF-8") - return utf8Content + return new File(filePath).getText("UTF-8") } /** @@ -59,49 +54,44 @@ class ReadFile { * @return */ byte[] readBinaryFile(String filePath) { - File file = new File(filePath) - byte[] binaryContent = file.bytes - return binaryContent + return new File(filePath).bytes } - + /** * More Examples of reading a file * @return */ def moreExamples() { - + //with reader with utf-8 new File("src/main/resources/utf8Content.html").withReader('UTF-8') { reader -> def line - while ((line = reader.readLine())!=null) { + while ((line = reader.readLine()) != null) { println "${line}" } } - - //collect api - def list = new File("src/main/resources/fileContent.txt").collect {it} - - //as operator + + // collect api + def list = new File("src/main/resources/fileContent.txt").collect { it } + + // as operator def array = new File("src/main/resources/fileContent.txt") as String[] - - //eachline - new File("src/main/resources/fileContent.txt").eachLine { line -> - println line - } - + + // eachline + new File("src/main/resources/fileContent.txt").eachLine { println it } + //newInputStream with eachLine - def is = new File("src/main/resources/fileContent.txt").newInputStream() - is.eachLine { - println it + + // try-with-resources automatically closes BufferedInputStream resource + try (def inputStream = new File("src/main/resources/fileContent.txt").newInputStream()) { + inputStream.eachLine { println it } } - is.close() - - //withInputStream + + // withInputStream new File("src/main/resources/fileContent.txt").withInputStream { stream -> stream.eachLine { line -> println line } } } - -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/file/ReadFileUnitTest.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/file/ReadFileUnitTest.groovy index da1dfc10ba..87cfc79761 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/file/ReadFileUnitTest.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/file/ReadFileUnitTest.groovy @@ -1,71 +1,76 @@ package com.baeldung.file import spock.lang.Specification -import spock.lang.Ignore class ReadFileUnitTest extends Specification { ReadFile readFile - void setup () { + void setup() { readFile = new ReadFile() } - def 'Should return number of lines in File using ReadFile.readFileLineByLine given filePath' () { + def 'Should return number of lines in File using ReadFile.readFileLineByLine given filePath'() { given: - def filePath = "src/main/resources/fileContent.txt" + def filePath = "src/main/resources/fileContent.txt" + when: - def noOfLines = readFile.readFileLineByLine(filePath) + def noOfLines = readFile.readFileLineByLine(filePath) + then: - noOfLines - noOfLines instanceof Integer - assert noOfLines, 3 - } - - def 'Should return File Content in list of lines using ReadFile.readFileInList given filePath' () { - given: - def filePath = "src/main/resources/fileContent.txt" - when: - def lines = readFile.readFileInList(filePath) - then: - lines - lines instanceof List - assert lines.size(), 3 - } - - def 'Should return file content in string using ReadFile.readFileString given filePath' () { - given: - def filePath = "src/main/resources/fileContent.txt" - when: - def fileContent = readFile.readFileString(filePath) - then: - fileContent - fileContent instanceof String - fileContent.contains("""Line 1 : Hello World!!! -Line 2 : This is a file content. -Line 3 : String content""") - + noOfLines + noOfLines instanceof Integer + noOfLines == 3 } - def 'Should return UTF-8 encoded file content in string using ReadFile.readFileStringWithCharset given filePath' () { + def 'Should return File Content in list of lines using ReadFile.readFileInList given filePath'() { given: - def filePath = "src/main/resources/utf8Content.html" + def filePath = "src/main/resources/fileContent.txt" + when: - def encodedContent = readFile.readFileStringWithCharset(filePath) + def lines = readFile.readFileInList(filePath) + then: - encodedContent - encodedContent instanceof String + lines + lines instanceof List + lines.size() == 3 } - - def 'Should return binary file content in byte array using ReadFile.readBinaryFile given filePath' () { + + def 'Should return file content in string using ReadFile.readFileString given filePath'() { given: - def filePath = "src/main/resources/sample.png" + def filePath = "src/main/resources/fileContent.txt" + when: - def binaryContent = readFile.readBinaryFile(filePath) + def fileContent = readFile.readFileString(filePath) + then: - binaryContent - binaryContent instanceof byte[] - binaryContent.length == 329 + fileContent + fileContent instanceof String + fileContent.contains(["Line 1 : Hello World!!!", "Line 2 : This is a file content.", "Line 3 : String content"].join("\r\n")) } - -} \ No newline at end of file + + def 'Should return UTF-8 encoded file content in string using ReadFile.readFileStringWithCharset given filePath'() { + given: + def filePath = "src/main/resources/utf8Content.html" + + when: + def encodedContent = readFile.readFileStringWithCharset(filePath) + + then: + encodedContent + encodedContent instanceof String + } + + def 'Should return binary file content in byte array using ReadFile.readBinaryFile given filePath'() { + given: + def filePath = "src/main/resources/sample.png" + + when: + def binaryContent = readFile.readBinaryFile(filePath) + + then: + binaryContent + binaryContent instanceof byte[] + binaryContent.length == 329 + } +} From a53ee3f0cbeee2b23007c66cb7755b0e092182ec Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 15 Jan 2023 14:21:58 +0530 Subject: [PATCH 274/592] JAVA-14471 Update Keycloak articles - deprecated client adapters --- .../spring-boot-keycloak-adapters/README.md | 7 ++ .../spring-boot-keycloak-adapters/pom.xml | 91 +++++++++++++++++++ .../keycloak/CustomUserAttrController.java | 0 .../java/com/baeldung/keycloak/Customer.java | 49 ++++++++++ .../com/baeldung/keycloak/CustomerDAO.java | 7 ++ .../com/baeldung/keycloak/KeycloakConfig.java | 0 .../keycloak/KeycloakLogoutHandler.java | 45 +++++++++ .../com/baeldung/keycloak/SecurityConfig.java | 41 +++++++++ .../com/baeldung/keycloak/SpringBoot.java | 20 ++++ .../com/baeldung/keycloak/WebController.java | 60 ++++++++++++ .../resources/application-embedded.properties | 0 .../src/main/resources/application.properties | 15 +++ .../src/main/resources/logback.xml | 13 +++ .../main/resources/templates/customers.html | 34 +++++++ .../main/resources/templates/external.html | 31 +++++++ .../src/main/resources/templates/layout.html | 18 ++++ .../main/resources/templates/userInfo.html | 0 .../KeycloakConfigurationLiveTest.java | 0 .../spring-boot-keycloak/README.md | 3 +- .../spring-boot-keycloak/pom.xml | 20 +--- .../com/baeldung/keycloak/SecurityConfig.java | 10 ++ .../keycloaksoap/KeycloakSecurityConfig.java | 55 +++-------- .../resources/application-keycloak.properties | 8 +- .../src/main/resources/application.properties | 13 +-- .../KeycloakContextIntegrationTest.java | 18 ++++ .../keycloaksoap/KeycloakSoapLiveTest.java | 2 +- .../resources/application-test.properties | 5 +- 27 files changed, 486 insertions(+), 79 deletions(-) create mode 100644 spring-boot-modules/spring-boot-keycloak-adapters/README.md create mode 100644 spring-boot-modules/spring-boot-keycloak-adapters/pom.xml rename spring-boot-modules/{spring-boot-keycloak => spring-boot-keycloak-adapters}/src/main/java/com/baeldung/keycloak/CustomUserAttrController.java (100%) create mode 100644 spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/Customer.java create mode 100644 spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/CustomerDAO.java rename spring-boot-modules/{spring-boot-keycloak => spring-boot-keycloak-adapters}/src/main/java/com/baeldung/keycloak/KeycloakConfig.java (100%) create mode 100644 spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/KeycloakLogoutHandler.java create mode 100644 spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/SecurityConfig.java create mode 100644 spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/SpringBoot.java create mode 100644 spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/WebController.java rename spring-boot-modules/{spring-boot-keycloak => spring-boot-keycloak-adapters}/src/main/resources/application-embedded.properties (100%) create mode 100644 spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/application.properties create mode 100644 spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/logback.xml create mode 100644 spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/templates/customers.html create mode 100644 spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/templates/external.html create mode 100644 spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/templates/layout.html rename spring-boot-modules/{spring-boot-keycloak => spring-boot-keycloak-adapters}/src/main/resources/templates/userInfo.html (100%) rename spring-boot-modules/{spring-boot-keycloak => spring-boot-keycloak-adapters}/src/test/java/com/baeldung/keycloak/KeycloakConfigurationLiveTest.java (100%) create mode 100644 spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloak/KeycloakContextIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-keycloak-adapters/README.md b/spring-boot-modules/spring-boot-keycloak-adapters/README.md new file mode 100644 index 0000000000..d24d315f50 --- /dev/null +++ b/spring-boot-modules/spring-boot-keycloak-adapters/README.md @@ -0,0 +1,7 @@ +## Spring Boot Keycloak + +This module contains articles about Keycloak in Spring Boot projects. + +## Relevant articles: +- [Custom User Attributes with Keycloak](https://www.baeldung.com/keycloak-custom-user-attributes) +- [Get Keycloak User ID in Spring](https://www.baeldung.com/spring-keycloak-get-user-id) diff --git a/spring-boot-modules/spring-boot-keycloak-adapters/pom.xml b/spring-boot-modules/spring-boot-keycloak-adapters/pom.xml new file mode 100644 index 0000000000..0da8d920d1 --- /dev/null +++ b/spring-boot-modules/spring-boot-keycloak-adapters/pom.xml @@ -0,0 +1,91 @@ + + + 4.0.0 + com.baeldung.keycloak + spring-boot-keycloak-adapters + 0.0.1 + spring-boot-keycloak-adapters + jar + This is a simple application demonstrating integration between Keycloak and Spring Boot. + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + + + org.keycloak.bom + keycloak-adapter-bom + ${keycloak-adapter-bom.version} + pom + import + + + + + + + org.springframework.boot + spring-boot-starter + + + org.keycloak + keycloak-spring-boot-starter + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-oauth2-client + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-web + + + org.hsqldb + hsqldb + runtime + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.security + spring-security-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + 15.0.2 + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/CustomUserAttrController.java b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/CustomUserAttrController.java similarity index 100% rename from spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/CustomUserAttrController.java rename to spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/CustomUserAttrController.java diff --git a/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/Customer.java b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/Customer.java new file mode 100644 index 0000000000..3293446b1d --- /dev/null +++ b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/Customer.java @@ -0,0 +1,49 @@ +package com.baeldung.keycloak; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Customer { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + private String name; + private String serviceRendered; + private String address; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getServiceRendered() { + return serviceRendered; + } + + public void setServiceRendered(String serviceRendered) { + this.serviceRendered = serviceRendered; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + +} diff --git a/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/CustomerDAO.java b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/CustomerDAO.java new file mode 100644 index 0000000000..20d992d335 --- /dev/null +++ b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/CustomerDAO.java @@ -0,0 +1,7 @@ +package com.baeldung.keycloak; + +import org.springframework.data.repository.CrudRepository; + +public interface CustomerDAO extends CrudRepository { + +} diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/KeycloakConfig.java b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/KeycloakConfig.java similarity index 100% rename from spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/KeycloakConfig.java rename to spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/KeycloakConfig.java diff --git a/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/KeycloakLogoutHandler.java b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/KeycloakLogoutHandler.java new file mode 100644 index 0000000000..06c41e9b1d --- /dev/null +++ b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/KeycloakLogoutHandler.java @@ -0,0 +1,45 @@ +package com.baeldung.keycloak; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.oidc.user.OidcUser; +import org.springframework.security.web.authentication.logout.LogoutHandler; +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; + +@Component +public class KeycloakLogoutHandler implements LogoutHandler { + + private static final Logger logger = LoggerFactory.getLogger(KeycloakLogoutHandler.class); + private final RestTemplate restTemplate; + + public KeycloakLogoutHandler(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + @Override + public void logout(HttpServletRequest request, HttpServletResponse response, Authentication auth) { + logoutFromKeycloak((OidcUser) auth.getPrincipal()); + } + + private void logoutFromKeycloak(OidcUser user) { + String endSessionEndpoint = user.getIssuer() + "/protocol/openid-connect/logout"; + UriComponentsBuilder builder = UriComponentsBuilder + .fromUriString(endSessionEndpoint) + .queryParam("id_token_hint", user.getIdToken().getTokenValue()); + + ResponseEntity logoutResponse = restTemplate.getForEntity(builder.toUriString(), String.class); + if (logoutResponse.getStatusCode().is2xxSuccessful()) { + logger.info("Successfulley logged out from Keycloak"); + } else { + logger.error("Could not propagate logout to Keycloak"); + } + } + +} diff --git a/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/SecurityConfig.java b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/SecurityConfig.java new file mode 100644 index 0000000000..c39e37cfaa --- /dev/null +++ b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/SecurityConfig.java @@ -0,0 +1,41 @@ +package com.baeldung.keycloak; + +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.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; + +@Configuration +@EnableWebSecurity +class SecurityConfig { + + private final KeycloakLogoutHandler keycloakLogoutHandler; + + SecurityConfig(KeycloakLogoutHandler keycloakLogoutHandler) { + this.keycloakLogoutHandler = keycloakLogoutHandler; + } + + @Bean + protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { + return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl()); + } + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/customers*", "/users*") + .hasRole("USER") + .anyRequest() + .permitAll(); + http.oauth2Login() + .and() + .logout() + .addLogoutHandler(keycloakLogoutHandler) + .logoutSuccessUrl("/"); + return http.build(); + } +} diff --git a/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/SpringBoot.java b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/SpringBoot.java new file mode 100644 index 0000000000..90d7e774a4 --- /dev/null +++ b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/SpringBoot.java @@ -0,0 +1,20 @@ +package com.baeldung.keycloak; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.web.client.RestTemplate; + +@SpringBootApplication + +public class SpringBoot { + + public static void main(String[] args) { + SpringApplication.run(SpringBoot.class, args); + } + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} diff --git a/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/WebController.java b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/WebController.java new file mode 100644 index 0000000000..bbd96c8135 --- /dev/null +++ b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/java/com/baeldung/keycloak/WebController.java @@ -0,0 +1,60 @@ +package com.baeldung.keycloak; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +import java.security.Principal; + +import org.springframework.beans.factory.annotation.Autowired; + +import javax.servlet.http.HttpServletRequest; + +@Controller +public class WebController { + + @Autowired + private CustomerDAO customerDAO; + + @GetMapping(path = "/") + public String index() { + return "external"; + } + + @GetMapping("/logout") + public String logout(HttpServletRequest request) throws Exception { + request.logout(); + return "redirect:/"; + } + + @GetMapping(path = "/customers") + public String customers(Principal principal, Model model) { + addCustomers(); + Iterable customers = customerDAO.findAll(); + model.addAttribute("customers", customers); + model.addAttribute("username", principal.getName()); + return "customers"; + } + + // add customers for demonstration + public void addCustomers() { + + Customer customer1 = new Customer(); + customer1.setAddress("1111 foo blvd"); + customer1.setName("Foo Industries"); + customer1.setServiceRendered("Important services"); + customerDAO.save(customer1); + + Customer customer2 = new Customer(); + customer2.setAddress("2222 bar street"); + customer2.setName("Bar LLP"); + customer2.setServiceRendered("Important services"); + customerDAO.save(customer2); + + Customer customer3 = new Customer(); + customer3.setAddress("33 main street"); + customer3.setName("Big LLC"); + customer3.setServiceRendered("Important services"); + customerDAO.save(customer3); + } +} diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/resources/application-embedded.properties b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/application-embedded.properties similarity index 100% rename from spring-boot-modules/spring-boot-keycloak/src/main/resources/application-embedded.properties rename to spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/application-embedded.properties diff --git a/spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/application.properties b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/application.properties new file mode 100644 index 0000000000..323617e2ef --- /dev/null +++ b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/application.properties @@ -0,0 +1,15 @@ +### server port +server.port=8081 + +#Keycloak Configuration +keycloak.auth-server-url=http://localhost:8180/auth +keycloak.realm=SpringBootKeycloak +keycloak.resource=login-app +keycloak.public-client=true +keycloak.principal-attribute=preferred_username + +spring.security.oauth2.client.registration.keycloak.client-id=login-app +spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.keycloak.scope=openid +spring.security.oauth2.client.provider.keycloak.issuer-uri=http://localhost:8180/auth/realms/SpringBootKeycloak +spring.security.oauth2.client.provider.keycloak.user-name-attribute=preferred_username \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/logback.xml b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/spring-boot-modules/spring-boot-keycloak-adapters/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/spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/templates/customers.html b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/templates/customers.html new file mode 100644 index 0000000000..de2df93ef1 --- /dev/null +++ b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/templates/customers.html @@ -0,0 +1,34 @@ + + + + + + + + + diff --git a/spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/templates/external.html b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/templates/external.html new file mode 100644 index 0000000000..2f9cc76961 --- /dev/null +++ b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/templates/external.html @@ -0,0 +1,31 @@ + + + + + +
    +
    +

    Customer Portal

    +
    +
    +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam + erat lectus, vehicula feugiat ultricies at, tempus sed ante. Cras + arcu erat, lobortis vitae quam et, mollis pharetra odio. Nullam sit + amet congue ipsum. Nunc dapibus odio ut ligula venenatis porta non + id dui. Duis nec tempor tellus. Suspendisse id blandit ligula, sit + amet varius mauris. Nulla eu eros pharetra, tristique dui quis, + vehicula libero. Aenean a neque sit amet tellus porttitor rutrum nec + at leo.

    + +

    Existing Customers

    +
    + Enter the intranet: customers +
    +
    + +
    + + + + diff --git a/spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/templates/layout.html b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/templates/layout.html new file mode 100644 index 0000000000..bab0c2982b --- /dev/null +++ b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/templates/layout.html @@ -0,0 +1,18 @@ + + + +Customer Portal + + + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/resources/templates/userInfo.html b/spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/templates/userInfo.html similarity index 100% rename from spring-boot-modules/spring-boot-keycloak/src/main/resources/templates/userInfo.html rename to spring-boot-modules/spring-boot-keycloak-adapters/src/main/resources/templates/userInfo.html diff --git a/spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloak/KeycloakConfigurationLiveTest.java b/spring-boot-modules/spring-boot-keycloak-adapters/src/test/java/com/baeldung/keycloak/KeycloakConfigurationLiveTest.java similarity index 100% rename from spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloak/KeycloakConfigurationLiveTest.java rename to spring-boot-modules/spring-boot-keycloak-adapters/src/test/java/com/baeldung/keycloak/KeycloakConfigurationLiveTest.java diff --git a/spring-boot-modules/spring-boot-keycloak/README.md b/spring-boot-modules/spring-boot-keycloak/README.md index e95ada0e05..b4545e121c 100644 --- a/spring-boot-modules/spring-boot-keycloak/README.md +++ b/spring-boot-modules/spring-boot-keycloak/README.md @@ -4,9 +4,8 @@ This module contains articles about Keycloak in Spring Boot projects. ## Relevant articles: - [A Quick Guide to Using Keycloak With Spring Boot](https://www.baeldung.com/spring-boot-keycloak) -- [Custom User Attributes with Keycloak](https://www.baeldung.com/keycloak-custom-user-attributes) - [Customizing the Login Page for Keycloak](https://www.baeldung.com/keycloak-custom-login-page) - [Keycloak User Self-Registration](https://www.baeldung.com/keycloak-user-registration) - [Customizing Themes for Keycloak](https://www.baeldung.com/spring-keycloak-custom-themes) - [Securing SOAP Web Services With Keycloak](https://www.baeldung.com/soap-keycloak) -- [Get Keycloak User ID in Spring](https://www.baeldung.com/spring-keycloak-get-user-id) + diff --git a/spring-boot-modules/spring-boot-keycloak/pom.xml b/spring-boot-modules/spring-boot-keycloak/pom.xml index 4f30d32bec..d13ef22345 100644 --- a/spring-boot-modules/spring-boot-keycloak/pom.xml +++ b/spring-boot-modules/spring-boot-keycloak/pom.xml @@ -17,26 +17,14 @@ ../../parent-boot-2 - - - - org.keycloak.bom - keycloak-adapter-bom - ${keycloak-adapter-bom.version} - pom - import - - - - org.springframework.boot spring-boot-starter - org.keycloak - keycloak-spring-boot-starter + org.springframework.boot + spring-boot-starter-oauth2-resource-server org.springframework.boot @@ -113,8 +101,4 @@ - - 15.0.2 - - \ No newline at end of file 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 c39e37cfaa..c85438952a 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 @@ -2,8 +2,11 @@ package com.baeldung.keycloak; 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.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer; import org.springframework.security.core.session.SessionRegistryImpl; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy; @@ -36,6 +39,13 @@ class SecurityConfig { .logout() .addLogoutHandler(keycloakLogoutHandler) .logoutSuccessUrl("/"); + http.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt); return http.build(); } + + @Bean + public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception { + return http.getSharedObject(AuthenticationManagerBuilder.class) + .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 66a17f4967..e55d307e33 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 @@ -1,54 +1,27 @@ package com.baeldung.keycloaksoap; -import org.keycloak.adapters.KeycloakConfigResolver; -import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver; -import org.keycloak.adapters.springsecurity.KeycloakConfiguration; -import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider; -import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper; -import org.springframework.security.core.session.SessionRegistryImpl; -import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy; -import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer; +import org.springframework.security.web.SecurityFilterChain; -@KeycloakConfiguration +@Configuration +@EnableWebSecurity @ConditionalOnProperty(name = "keycloak.enabled", havingValue = "true") @EnableGlobalMethodSecurity(jsr250Enabled = true) -public class KeycloakSecurityConfig extends KeycloakWebSecurityConfigurerAdapter { - @Override - protected void configure(HttpSecurity http) throws Exception { - super.configure(http); - //@formatter:off - http - .csrf() - .disable() - .authorizeRequests() - .anyRequest() - .permitAll(); - //@formatter:on - } - - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) { - KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider(); - keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper()); - auth.authenticationProvider(keycloakAuthenticationProvider); - } +public class KeycloakSecurityConfig { @Bean - @Override - protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { - return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl()); + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.csrf() + .disable() + .authorizeHttpRequests(auth -> auth.anyRequest() + .authenticated()) + .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt); + return http.build(); } - - @Bean - public KeycloakConfigResolver keycloakSpringBootConfigResolver() { - return new KeycloakSpringBootConfigResolver(); - } - } diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/resources/application-keycloak.properties b/spring-boot-modules/spring-boot-keycloak/src/main/resources/application-keycloak.properties index 0a28b7ac48..474e671ce3 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/main/resources/application-keycloak.properties +++ b/spring-boot-modules/spring-boot-keycloak/src/main/resources/application-keycloak.properties @@ -1,14 +1,8 @@ server.port=18080 keycloak.enabled=true -keycloak.realm=baeldung-soap-services -keycloak.auth-server-url=http://localhost:8080/auth -keycloak.bearer-only=true -keycloak.credentials.secret=14da6f9e-261f-489a-9bf0-1441e4a9ddc4 -keycloak.ssl-required=external -keycloak.resource=baeldung-soap-services -keycloak.use-resource-role-mappings=true +spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:8080/realms/baeldung-soap-services # Custom properties begin here ws.api.path=/ws/api/v1/* diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/resources/application.properties b/spring-boot-modules/spring-boot-keycloak/src/main/resources/application.properties index 323617e2ef..df2fadabae 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot-keycloak/src/main/resources/application.properties @@ -1,15 +1,10 @@ ### server port server.port=8081 -#Keycloak Configuration -keycloak.auth-server-url=http://localhost:8180/auth -keycloak.realm=SpringBootKeycloak -keycloak.resource=login-app -keycloak.public-client=true -keycloak.principal-attribute=preferred_username - spring.security.oauth2.client.registration.keycloak.client-id=login-app spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code spring.security.oauth2.client.registration.keycloak.scope=openid -spring.security.oauth2.client.provider.keycloak.issuer-uri=http://localhost:8180/auth/realms/SpringBootKeycloak -spring.security.oauth2.client.provider.keycloak.user-name-attribute=preferred_username \ No newline at end of file +spring.security.oauth2.client.provider.keycloak.issuer-uri=http://localhost:8080/realms/SpringBootKeycloak +spring.security.oauth2.client.provider.keycloak.user-name-attribute=preferred_username + +spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:8080/realms/SpringBootKeycloak \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloak/KeycloakContextIntegrationTest.java b/spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloak/KeycloakContextIntegrationTest.java new file mode 100644 index 0000000000..336c8364aa --- /dev/null +++ b/spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloak/KeycloakContextIntegrationTest.java @@ -0,0 +1,18 @@ +package com.baeldung.keycloak; + +import org.junit.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import com.baeldung.keycloak.SpringBoot; + +@ExtendWith(SpringExtension.class) +@SpringBootTest(classes = { SpringBoot.class }) +public class KeycloakContextIntegrationTest { + + @Test + public void whenLoadApplication_thenSuccess() { + + } + +} 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 0327915399..171c7bf330 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 @@ -105,7 +105,7 @@ class KeycloakSoapLiveTest { void givenAccessToken_whenDeleteProduct_thenReturnSuccess() { HttpHeaders headers = new HttpHeaders(); headers.set("content-type", "text/xml"); - headers.set("Authorization", "Bearer " + generateToken("jhondoe", "password")); + headers.set("Authorization", "Bearer " + generateToken("johndoe", "password")); HttpEntity request = new HttpEntity<>(Utility.getDeleteProductsRequest(), headers); ResponseEntity responseEntity = restTemplate.postForEntity("http://localhost:" + port + "/ws/api/v1/", request, String.class); diff --git a/spring-boot-modules/spring-boot-keycloak/src/test/resources/application-test.properties b/spring-boot-modules/spring-boot-keycloak/src/test/resources/application-test.properties index a818b5be7a..609d59b4bf 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/test/resources/application-test.properties +++ b/spring-boot-modules/spring-boot-keycloak/src/test/resources/application-test.properties @@ -1,4 +1,7 @@ grant.type=password client.id=baeldung-soap-services client.secret=d2ba7af8-f7d2-4c97-b4a5-3c88b59920ae -url=http://localhost:8080/auth/realms/baeldung-soap-services/protocol/openid-connect/token +url=http://localhost:8080/realms/baeldung-soap-services/protocol/openid-connect/token + +keycloak.enabled=true +spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:8080/realms/baeldung-soap-services From f2c9fbde810b3708557553c83bc5dda902a87059 Mon Sep 17 00:00:00 2001 From: Alex Golub Date: Sun, 15 Jan 2023 22:13:35 +0200 Subject: [PATCH 275/592] Minor fixes for Trait subject --- .../com/baeldung/traits/AnimalTrait.groovy | 4 +- .../groovy/com/baeldung/traits/Dog.groovy | 5 +- .../com/baeldung/traits/Employee.groovy | 6 +- .../groovy/com/baeldung/traits/Human.groovy | 4 +- .../com/baeldung/traits/SpeakingTrait.groovy | 7 +- .../com/baeldung/traits/UserTrait.groovy | 25 ++- .../com/baeldung/traits/VehicleTrait.groovy | 8 +- .../com/baeldung/traits/WalkingTrait.groovy | 8 +- .../com/baeldung/traits/WheelTrait.groovy | 5 +- .../com/baeldung/traits/TraitsUnitTest.groovy | 145 +++++++++--------- 10 files changed, 109 insertions(+), 108 deletions(-) diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/AnimalTrait.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/AnimalTrait.groovy index 6ec5cda571..a3fed81c8b 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/AnimalTrait.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/AnimalTrait.groovy @@ -1,8 +1,8 @@ package com.baeldung.traits trait AnimalTrait { - + String basicBehavior() { return "Animalistic!!" } -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Dog.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Dog.groovy index 3e0677ba18..fc53b1bef9 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Dog.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Dog.groovy @@ -1,9 +1,8 @@ package com.baeldung.traits class Dog implements WalkingTrait, SpeakingTrait { - + String speakAndWalk() { WalkingTrait.super.speakAndWalk() } - -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Employee.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Employee.groovy index b3e4285476..16f1fab984 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Employee.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Employee.groovy @@ -1,12 +1,14 @@ package com.baeldung.traits class Employee implements UserTrait { - + + @Override String name() { return 'Bob' } + @Override String lastName() { return "Marley" } -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Human.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Human.groovy index e78d59bbfd..5417334269 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Human.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Human.groovy @@ -1,6 +1,6 @@ package com.baeldung.traits interface Human { - + String lastName() -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/SpeakingTrait.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/SpeakingTrait.groovy index f437a94bd9..969982e8e0 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/SpeakingTrait.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/SpeakingTrait.groovy @@ -1,13 +1,12 @@ package com.baeldung.traits trait SpeakingTrait { - + String basicAbility() { return "Speaking!!" } - + String speakAndWalk() { return "Speak and walk!!" } - -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/UserTrait.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/UserTrait.groovy index 0d395bffcd..1d1d188460 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/UserTrait.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/UserTrait.groovy @@ -1,36 +1,35 @@ package com.baeldung.traits trait UserTrait implements Human { - + + String email + String address + + abstract String name() + String sayHello() { return "Hello!" } - - abstract String name() - + String showName() { - return "Hello, ${name()}!" + return "Hello, ${name()}!" } private String greetingMessage() { return 'Hello, from a private method!' } - + String greet() { def msg = greetingMessage() println msg msg } - + def self() { - return this + return this } - + String showLastName() { return "Hello, ${lastName()}!" } - - String email - String address } - \ No newline at end of file diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/VehicleTrait.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/VehicleTrait.groovy index f5ae8fab30..e29561157c 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/VehicleTrait.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/VehicleTrait.groovy @@ -1,9 +1,9 @@ package com.baeldung trait VehicleTrait extends WheelTrait { - + String showWheels() { - return "Num of Wheels $noOfWheels" + return "Num of Wheels $noOfWheels" } - -} \ No newline at end of file + +} diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/WalkingTrait.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/WalkingTrait.groovy index 66cff8809f..84be49ec25 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/WalkingTrait.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/WalkingTrait.groovy @@ -1,13 +1,13 @@ package com.baeldung.traits trait WalkingTrait { - + String basicAbility() { return "Walking!!" } - + String speakAndWalk() { return "Walk and speak!!" } - -} \ No newline at end of file + +} diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/WheelTrait.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/WheelTrait.groovy index 364d5b883e..7f2448e185 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/WheelTrait.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/WheelTrait.groovy @@ -1,7 +1,6 @@ package com.baeldung trait WheelTrait { - + int noOfWheels - -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/traits/TraitsUnitTest.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/traits/TraitsUnitTest.groovy index 85130e8f07..b47cba6437 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/traits/TraitsUnitTest.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/traits/TraitsUnitTest.groovy @@ -7,108 +7,111 @@ class TraitsUnitTest extends Specification { Employee employee Dog dog - void setup () { + void setup() { employee = new Employee() dog = new Dog() } - def 'Should return msg string when using Employee.sayHello method provided by UserTrait' () { + def 'Should return msg string when using Employee.sayHello method provided by UserTrait'() { when: - def msg = employee.sayHello() + def msg = employee.sayHello() + then: - msg - msg instanceof String - assert msg == "Hello!" + msg + msg instanceof String + msg == "Hello!" } - - def 'Should return displayMsg string when using Employee.showName method' () { + + def 'Should return displayMsg string when using Employee.showName method'() { when: - def displayMsg = employee.showName() + def displayMsg = employee.showName() + then: - displayMsg - displayMsg instanceof String - assert displayMsg == "Hello, Bob!" + displayMsg + displayMsg instanceof String + displayMsg == "Hello, Bob!" } - - def 'Should return greetMsg string when using Employee.greet method' () { + + def 'Should return greetMsg string when using Employee.greet method'() { when: - def greetMsg = employee.greet() + def greetMsg = employee.greet() + then: - greetMsg - greetMsg instanceof String - assert greetMsg == "Hello, from a private method!" + greetMsg + greetMsg instanceof String + greetMsg == "Hello, from a private method!" } - - def 'Should return MissingMethodException when using Employee.greetingMessage method' () { + + def 'Should return MissingMethodException when using Employee.greetingMessage method'() { when: - def exception - try { - employee.greetingMessage() - }catch(Exception e) { - exception = e - } - + employee.greetingMessage() + then: - exception - exception instanceof groovy.lang.MissingMethodException - assert exception.message == "No signature of method: com.baeldung.traits.Employee.greetingMessage()"+ - " is applicable for argument types: () values: []" + thrown(MissingMethodException) + specificationContext.thrownException.message == + "No signature of method: com.baeldung.traits.Employee.greetingMessage() is applicable for argument types: () values: []" } - - def 'Should return employee instance when using Employee.whoAmI method' () { + + def 'Should return employee instance when using Employee.whoAmI method'() { when: - def emp = employee.self() + def emp = employee.self() + then: - emp - emp instanceof Employee - assert emp.is(employee) + emp + emp instanceof Employee + emp.is(employee) } - - def 'Should display lastName when using Employee.showLastName method' () { + + def 'Should display lastName when using Employee.showLastName method'() { when: - def lastNameMsg = employee.showLastName() + def lastNameMsg = employee.showLastName() + then: - lastNameMsg - lastNameMsg instanceof String - assert lastNameMsg == "Hello, Marley!" + lastNameMsg + lastNameMsg instanceof String + lastNameMsg == "Hello, Marley!" } - - def 'Should be able to define properties of UserTrait in Employee instance' () { + + def 'Should be able to define properties of UserTrait in Employee instance'() { when: - employee = new Employee(email: "a@e.com", address: "baeldung.com") + employee = new Employee(email: "a@e.com", address: "baeldung.com") + then: - employee - employee instanceof Employee - assert employee.email == "a@e.com" - assert employee.address == "baeldung.com" + employee + employee instanceof Employee + employee.email == "a@e.com" + employee.address == "baeldung.com" } - - def 'Should execute basicAbility method from SpeakingTrait and return msg string' () { + + def 'Should execute basicAbility method from SpeakingTrait and return msg string'() { when: - def speakMsg = dog.basicAbility() + def speakMsg = dog.basicAbility() + then: - speakMsg - speakMsg instanceof String - assert speakMsg == "Speaking!!" + speakMsg + speakMsg instanceof String + speakMsg == "Speaking!!" } - - def 'Should verify multiple inheritance with traits and execute overridden traits method' () { + + def 'Should verify multiple inheritance with traits and execute overridden traits method'() { when: - def walkSpeakMsg = dog.speakAndWalk() - println walkSpeakMsg + def walkSpeakMsg = dog.speakAndWalk() + println walkSpeakMsg + then: - walkSpeakMsg - walkSpeakMsg instanceof String - assert walkSpeakMsg == "Walk and speak!!" + walkSpeakMsg + walkSpeakMsg instanceof String + walkSpeakMsg == "Walk and speak!!" } - - def 'Should implement AnimalTrait at runtime and access basicBehavior method' () { + + def 'Should implement AnimalTrait at runtime and access basicBehavior method'() { when: - def dogInstance = new Dog() as AnimalTrait - def basicBehaviorMsg = dogInstance.basicBehavior() + def dogInstance = new Dog() as AnimalTrait + def basicBehaviorMsg = dogInstance.basicBehavior() + then: - basicBehaviorMsg - basicBehaviorMsg instanceof String - assert basicBehaviorMsg == "Animalistic!!" + basicBehaviorMsg + basicBehaviorMsg instanceof String + basicBehaviorMsg == "Animalistic!!" } -} \ No newline at end of file +} From c16ec71a13693f799fb1a868b610e7e60cddaaa3 Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis Date: Mon, 16 Jan 2023 10:26:20 +0200 Subject: [PATCH 276/592] JAVA-15609 Changed to IntegrationTest to reproduce issue on Jenkins --- ...nualTest.java => ApiControllerDocTesterIntegrationTest.java} | 2 +- ...ockManualTest.java => ApiControllerMockIntegrationTest.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename web-modules/ninja/src/test/java/controllers/{ApiControllerDocTesterManualTest.java => ApiControllerDocTesterIntegrationTest.java} (91%) rename web-modules/ninja/src/test/java/controllers/{ApiControllerMockManualTest.java => ApiControllerMockIntegrationTest.java} (94%) diff --git a/web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterManualTest.java b/web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterIntegrationTest.java similarity index 91% rename from web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterManualTest.java rename to web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterIntegrationTest.java index b77901c8e2..a075497dc8 100644 --- a/web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterManualTest.java +++ b/web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterIntegrationTest.java @@ -7,7 +7,7 @@ import org.doctester.testbrowser.Response; import org.junit.Test; import ninja.NinjaDocTester; -public class ApiControllerDocTesterManualTest extends NinjaDocTester { +public class ApiControllerDocTesterIntegrationTest extends NinjaDocTester { String URL_INDEX = "/"; String URL_HELLO = "/hello"; diff --git a/web-modules/ninja/src/test/java/controllers/ApiControllerMockManualTest.java b/web-modules/ninja/src/test/java/controllers/ApiControllerMockIntegrationTest.java similarity index 94% rename from web-modules/ninja/src/test/java/controllers/ApiControllerMockManualTest.java rename to web-modules/ninja/src/test/java/controllers/ApiControllerMockIntegrationTest.java index 2fa76bca4e..53a760aadc 100644 --- a/web-modules/ninja/src/test/java/controllers/ApiControllerMockManualTest.java +++ b/web-modules/ninja/src/test/java/controllers/ApiControllerMockIntegrationTest.java @@ -10,7 +10,7 @@ import ninja.Result; import services.UserService; @RunWith(NinjaRunner.class) -public class ApiControllerMockManualTest { +public class ApiControllerMockIntegrationTest { @Inject private UserService userService; From 227fa031429cb967d4009bac64ae2eba04336461 Mon Sep 17 00:00:00 2001 From: Thiago dos Santos Hora Date: Mon, 16 Jan 2023 17:30:08 +0100 Subject: [PATCH 277/592] BAEL-5959: Adjust code style (#13299) * BAEL-5959: Monad in Java * Fix test name * Fix code style --- .../java/com/baeldung/monad/MonadSamples.java | 39 ++----------------- 1 file changed, 4 insertions(+), 35 deletions(-) diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/monad/MonadSamples.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/monad/MonadSamples.java index 3ccbac2a3c..87b7fe697e 100644 --- a/core-java-modules/core-java-8/src/main/java/com/baeldung/monad/MonadSamples.java +++ b/core-java-modules/core-java-8/src/main/java/com/baeldung/monad/MonadSamples.java @@ -28,30 +28,16 @@ class MonadSample1 extends MonadBaseExample { public double apply(double n) { return subtract1(add3(divideBy2(multiplyBy2(multiplyBy2(2))))); } - - public static void main(String[] args) { - final MonadSample1 test = new MonadSample1(); - System.out.println(test.apply(2)); - //6.0 - } - } class MonadSample2 extends MonadBaseExample { public double apply(double n) { - final double n1 = multiplyBy2(n); - final double n2 = multiplyBy2(n1); - final double n3 = divideBy2(n2); - final double n4 = add3(n3); + double n1 = multiplyBy2(n); + double n2 = multiplyBy2(n1); + double n3 = divideBy2(n2); + double n4 = add3(n3); return subtract1(n4); } - - public static void main(String[] args) { - final MonadSample2 test = new MonadSample2(); - System.out.println(test.apply(2)); - //6.0 - } - } class MonadSample3 extends MonadBaseExample { @@ -66,11 +52,6 @@ class MonadSample3 extends MonadBaseExample { .get(); } - public static void main(String[] args) { - final MonadSample3 test = new MonadSample3(); - System.out.println(test.apply(2)); - //6.0 - } } class MonadSample4 extends MonadBaseExample { @@ -90,13 +71,6 @@ class MonadSample3 extends MonadBaseExample { return leftSide.equals(rightSide); } - public static void main(String[] args) { - final MonadSample4 test = new MonadSample4(); - - System.out.println(test.leftIdentity()); //true - System.out.println(test.rightIdentity()); //true - System.out.println(test.associativity()); //true - } } class MonadSample5 extends MonadBaseExample { @@ -104,10 +78,5 @@ class MonadSample5 extends MonadBaseExample { Function> mapping = value -> Optional.of(value == null ? -1 : value + 1); return Optional.ofNullable((Integer) null).flatMap(mapping).equals(mapping.apply(null)); } - - public static void main(String[] args) { - final MonadSample5 test = new MonadSample5(); - System.out.println(test.fail()); - } } From 3d36abe4f8d573b35ba6e6d4f024f69c8bb52745 Mon Sep 17 00:00:00 2001 From: Alex Golub Date: Sat, 14 Jan 2023 21:31:29 +0200 Subject: [PATCH 278/592] Align tests with `Spock` testing framework --- .../TemplateEnginesUnitTest.groovy | 115 ++++++++------ .../com/baeldung/strings/Concatenate.groovy | 24 ++- .../baeldung/strings/ConcatenateTest.groovy | 149 ++++++++---------- .../strings/StringMatchingSpec.groovy | 2 +- .../stringtoint/ConvertStringToInt.groovy | 131 ++++++++------- .../stringtypes/CharacterInGroovy.groovy | 17 +- .../stringtypes/DoubleQuotedString.groovy | 63 ++++---- .../stringtypes/SingleQuotedString.groovy | 15 +- .../com/baeldung/stringtypes/Strings.groovy | 21 +-- 9 files changed, 288 insertions(+), 249 deletions(-) diff --git a/core-groovy-modules/core-groovy-2/src/test/groovy/com/baeldung/templateengine/TemplateEnginesUnitTest.groovy b/core-groovy-modules/core-groovy-2/src/test/groovy/com/baeldung/templateengine/TemplateEnginesUnitTest.groovy index 1846ae664c..800f3b119e 100644 --- a/core-groovy-modules/core-groovy-2/src/test/groovy/com/baeldung/templateengine/TemplateEnginesUnitTest.groovy +++ b/core-groovy-modules/core-groovy-2/src/test/groovy/com/baeldung/templateengine/TemplateEnginesUnitTest.groovy @@ -1,48 +1,62 @@ package com.baeldung.templateengine +import groovy.text.GStringTemplateEngine import groovy.text.SimpleTemplateEngine import groovy.text.StreamingTemplateEngine -import groovy.text.GStringTemplateEngine -import groovy.text.XmlTemplateEngine import groovy.text.XmlTemplateEngine import groovy.text.markup.MarkupTemplateEngine import groovy.text.markup.TemplateConfiguration +import spock.lang.Specification -class TemplateEnginesUnitTest extends GroovyTestCase { - - def bindMap = [user: "Norman", signature: "Baeldung"] - - void testSimpleTemplateEngine() { +class TemplateEnginesUnitTest extends Specification { + + final Map BIND_MAP = [user: "Norman", signature: "Baeldung"] + + def "testSimpleTemplateEngine"() { + given: def smsTemplate = 'Dear <% print user %>, Thanks for reading our Article. ${signature}' - def smsText = new SimpleTemplateEngine().createTemplate(smsTemplate).make(bindMap) - assert smsText.toString() == "Dear Norman, Thanks for reading our Article. Baeldung" + when: + def smsText = new SimpleTemplateEngine().createTemplate(smsTemplate).make(BIND_MAP) + + then: + smsText.toString() == "Dear Norman, Thanks for reading our Article. Baeldung" } - - void testStreamingTemplateEngine() { + + def "testStreamingTemplateEngine"() { + given: def articleEmailTemplate = new File('src/main/resources/articleEmail.template') - bindMap.articleText = """1. Overview -This is a tutorial article on Template Engines""" //can be a string larger than 64k - - def articleEmailText = new StreamingTemplateEngine().createTemplate(articleEmailTemplate).make(bindMap) - - assert articleEmailText.toString() == """Dear Norman, -Please read the requested article below. -1. Overview -This is a tutorial article on Template Engines -From, -Baeldung""" - + //can be a string larger than 64k + BIND_MAP.articleText = """|1. Overview + |This is a tutorial article on Template Engines""".stripMargin() + + when: + def articleEmailText = new StreamingTemplateEngine().createTemplate(articleEmailTemplate).make(BIND_MAP) + + then: + articleEmailText.toString() == """|Dear Norman, + |Please read the requested article below. + |1. Overview + |This is a tutorial article on Template Engines + |From, + |Baeldung""".stripMargin() } - - void testGStringTemplateEngine() { + + def "testGStringTemplateEngine"() { + given: def emailTemplate = new File('src/main/resources/email.template') - def emailText = new GStringTemplateEngine().createTemplate(emailTemplate).make(bindMap) - - assert emailText.toString() == "Dear Norman,\nThanks for subscribing our services.\nBaeldung" + + when: + def emailText = new GStringTemplateEngine().createTemplate(emailTemplate).make(BIND_MAP) + + then: + emailText.toString() == """|Dear Norman, + |Thanks for subscribing our services. + |Baeldung""".stripMargin() } - - void testXmlTemplateEngine() { + + def "testXmlTemplateEngine"() { + given: def emailXmlTemplate = ''' def emailContent = "Thanks for subscribing our services." @@ -51,11 +65,16 @@ Baeldung""" ${signature} ''' - def emailXml = new XmlTemplateEngine().createTemplate(emailXmlTemplate).make(bindMap) + + when: + def emailXml = new XmlTemplateEngine().createTemplate(emailXmlTemplate).make(BIND_MAP) + + then: println emailXml.toString() } - - void testMarkupTemplateEngineHtml() { + + def "testMarkupTemplateEngineHtml"() { + given: def emailHtmlTemplate = """html { head { title('Service Subscription Email') @@ -66,14 +85,16 @@ Baeldung""" p('Baeldung') } }""" - - + + when: def emailHtml = new MarkupTemplateEngine().createTemplate(emailHtmlTemplate).make() + + then: println emailHtml.toString() - } - - void testMarkupTemplateEngineXml() { + + def "testMarkupTemplateEngineXml"() { + given: def emailXmlTemplate = """xmlDeclaration() xs{ email { @@ -83,14 +104,18 @@ Baeldung""" } } """ - TemplateConfiguration config = new TemplateConfiguration() - config.autoIndent = true - config.autoEscape = true - config.autoNewLine = true + TemplateConfiguration config = new TemplateConfiguration().with { + autoIndent = true + autoEscape = true + autoNewLine = true + return it + } + + when: def emailXml = new MarkupTemplateEngine(config).createTemplate(emailXmlTemplate).make() - + + then: println emailXml.toString() } - -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/strings/Concatenate.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/strings/Concatenate.groovy index b3a0852a0b..4a7c3f8529 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/strings/Concatenate.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/strings/Concatenate.groovy @@ -1,9 +1,10 @@ package com.baeldung.strings; class Concatenate { + String first = 'Hello' String last = 'Groovy' - + String doSimpleConcat() { return 'My name is ' + first + ' ' + last } @@ -23,21 +24,28 @@ class Concatenate { String doConcatUsingLeftShiftOperator() { return 'My name is ' << first << ' ' << last } - + String doConcatUsingArrayJoinMethod() { return ['My name is', first, last].join(' ') } String doConcatUsingArrayInjectMethod() { - return [first,' ', last] - .inject(new StringBuffer('My name is '), { initial, name -> initial.append(name); return initial }).toString() + return [first, ' ', last] + .inject(new StringBuffer('My name is '), { initial, name -> initial.append(name) }) + .toString() } - + String doConcatUsingStringBuilder() { - return new StringBuilder().append('My name is ').append(first).append(' ').append(last) + return new StringBuilder().append('My name is ') + .append(first) + .append(' ') + .append(last) } String doConcatUsingStringBuffer() { - return new StringBuffer().append('My name is ').append(first).append(' ').append(last) + return new StringBuffer().append('My name is ') + .append(first) + .append(' ') + .append(last) } -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/strings/ConcatenateTest.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/strings/ConcatenateTest.groovy index 3ef4a5d460..e4a178a14b 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/strings/ConcatenateTest.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/strings/ConcatenateTest.groovy @@ -1,101 +1,88 @@ -import com.baeldung.strings.Concatenate; +import com.baeldung.strings.Concatenate +import spock.lang.Specification -class ConcatenateTest extends GroovyTestCase { - - void testSimpleConcat() { - def name = new Concatenate() - name.first = 'Joe'; - name.last = 'Smith'; - def expected = 'My name is Joe Smith' - assertToString(name.doSimpleConcat(), expected) - } - - void testConcatUsingGString() { - def name = new Concatenate() - name.first = "Joe"; - name.last = "Smith"; - def expected = "My name is Joe Smith" - assertToString(name.doConcatUsingGString(), expected) - } - - void testConcatUsingGStringClosures() { - def name = new Concatenate() - name.first = "Joe"; - name.last = "Smith"; - def expected = "My name is Joe Smith" - assertToString(name.doConcatUsingGStringClosures(), expected) - } - - void testConcatUsingStringConcatMethod() { - def name = new Concatenate() - name.first = "Joe"; - name.last = "Smith"; - def expected = "My name is Joe Smith" - assertToString(name.doConcatUsingStringConcatMethod(), expected) +class ConcatenateTest extends Specification { + + final Concatenate NAME = new Concatenate(first: 'Joe', last: 'Smith') + final String EXPECTED = "My name is Joe Smith"; + + def "SimpleConcat"() { + expect: + NAME.doSimpleConcat() == EXPECTED } - void testConcatUsingLeftShiftOperator() { - def name = new Concatenate() - name.first = "Joe"; - name.last = "Smith"; - def expected = "My name is Joe Smith" - assertToString(name.doConcatUsingLeftShiftOperator(), expected) + def "ConcatUsingGString"() { + expect: + NAME.doConcatUsingGString() == EXPECTED } - void testConcatUsingArrayJoinMethod() { - def name = new Concatenate() - name.first = "Joe"; - name.last = "Smith"; - def expected = "My name is Joe Smith" - assertToString(name.doConcatUsingArrayJoinMethod(), expected) + def "ConcatUsingGStringClosures"() { + expect: + NAME.doConcatUsingGStringClosures() == EXPECTED } - void testConcatUsingArrayInjectMethod() { - def name = new Concatenate() - name.first = "Joe"; - name.last = "Smith"; - def expected = "My name is Joe Smith" - assertToString(name.doConcatUsingArrayInjectMethod(), expected) + def "ConcatUsingStringConcatMethod"() { + expect: + NAME.doConcatUsingStringConcatMethod() == EXPECTED } - void testConcatUsingStringBuilder() { - def name = new Concatenate() - name.first = "Joe"; - name.last = "Smith"; - def expected = "My name is Joe Smith" - assertToString(name.doConcatUsingStringBuilder(), expected) + def "ConcatUsingLeftShiftOperator"() { + expect: + NAME.doConcatUsingLeftShiftOperator() == EXPECTED } - void testConcatUsingStringBuffer() { - def name = new Concatenate() - name.first = "Joe"; - name.last = "Smith"; - def expected = "My name is Joe Smith" - assertToString(name.doConcatUsingStringBuffer(), expected) + def "ConcatUsingArrayJoinMethod"() { + expect: + NAME.doConcatUsingArrayJoinMethod() == EXPECTED } - void testConcatMultilineUsingStringConcatMethod() { - def name = new Concatenate() - name.first = '''Joe + def "ConcatUsingArrayInjectMethod"() { + expect: + NAME.doConcatUsingArrayInjectMethod() == EXPECTED + } + + def "ConcatUsingStringBuilder"() { + expect: + NAME.doConcatUsingStringBuilder() == EXPECTED + } + + def "ConcatUsingStringBuffer"() { + expect: + NAME.doConcatUsingStringBuffer() == EXPECTED + } + + def "ConcatMultilineUsingStringConcatMethod"() { + when: + NAME.first = '''Joe Smith - '''; - name.last = 'Junior'; + ''' + NAME.last = 'Junior' + + then: def expected = '''My name is Joe Smith - Junior'''; - assertToString(name.doConcatUsingStringConcatMethod(), expected) + Junior''' + NAME.doConcatUsingStringConcatMethod() == expected } - void testGStringvsClosure(){ - def first = "Joe"; - def last = "Smith"; - def eagerGString = "My name is $first $last" - def lazyGString = "My name is ${-> first} ${-> last}" + def "GStringvsClosure"() { + given: + def eagerGString = "My name is $NAME.first $NAME.last" + def lazyGString = "My name is ${-> NAME.first} ${-> NAME.last}" - assert eagerGString == "My name is Joe Smith" - assert lazyGString == "My name is Joe Smith" - first = "David"; - assert eagerGString == "My name is Joe Smith" - assert lazyGString == "My name is David Smith" - } + expect: + eagerGString == "My name is Joe Smith" + lazyGString == "My name is Joe Smith" + } + + def "LazyVsEager"() { + given: + def eagerGString = "My name is $NAME.first $NAME.last" + def lazyGString = "My name is ${-> NAME.first} ${-> NAME.last}" + NAME.first = "David" + + expect: + eagerGString == "My name is Joe Smith" + lazyGString == "My name is David Smith" + } } diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/strings/StringMatchingSpec.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/strings/StringMatchingSpec.groovy index 3865bc73fa..89202d9500 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/strings/StringMatchingSpec.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/strings/StringMatchingSpec.groovy @@ -13,7 +13,7 @@ class StringMatchingSpec extends Specification { expect: p instanceof Pattern - and: "you can use slash strings to avoid escaping of blackslash" + and: "you can use slash strings to avoid escaping of backslash" def digitPattern = ~/\d*/ digitPattern.matcher('4711').matches() } diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtoint/ConvertStringToInt.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtoint/ConvertStringToInt.groovy index 48cf48fa8a..cce6ede989 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtoint/ConvertStringToInt.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtoint/ConvertStringToInt.groovy @@ -1,110 +1,119 @@ package com.baeldung.stringtoint -import org.junit.Test +import spock.lang.Specification import java.text.DecimalFormat -import static org.junit.Assert.assertEquals -import static org.junit.Assert.assertNull +class ConvertStringToInt extends Specification { -class ConvertStringToInt { + final String STRING_NUM = "123" + final int EXPECTED_INT = 123 - @Test - void givenString_whenUsingAsInteger_thenConvertToInteger() { - def stringNum = "123" + def "givenString_whenUsingAsInteger_thenConvertToInteger"() { + given: def invalidString = "123a" - Integer expectedInteger = 123 - Integer integerNum = stringNum as Integer + Integer integerNum = STRING_NUM as Integer + + when: def intNum = invalidString?.isInteger() ? invalidString as Integer : null - assertNull(null, intNum) - assertEquals(integerNum, expectedInteger) + then: + intNum == null + integerNum == EXPECTED_INT } - @Test - void givenString_whenUsingAsInt_thenConvertToInt() { - def stringNum = "123" - int expectedInt = 123 - int intNum = stringNum as int + def "givenString_whenUsingAsInt_thenConvertToInt"() { + given: + int intNum = STRING_NUM as int - assertEquals(intNum, expectedInt) + expect: + intNum == EXPECTED_INT } - @Test - void givenString_whenUsingToInteger_thenConvertToInteger() { - def stringNum = "123" - int expectedInt = 123 - int intNum = stringNum.toInteger() + def "givenString_whenUsingToInteger_thenConvertToInteger"() { + given: + int intNum = STRING_NUM.toInteger() - assertEquals(intNum, expectedInt) + expect: + intNum == EXPECTED_INT } - @Test - void givenString_whenUsingParseInt_thenConvertToInteger() { - def stringNum = "123" - int expectedInt = 123 - int intNum = Integer.parseInt(stringNum) + def "givenString_whenUsingParseInt_thenConvertToInteger"() { + given: + int intNum = Integer.parseInt(STRING_NUM) - assertEquals(intNum, expectedInt) + expect: + intNum == EXPECTED_INT } - @Test - void givenString_whenUsingValueOf_thenConvertToInteger() { - def stringNum = "123" - int expectedInt = 123 - int intNum = Integer.valueOf(stringNum) + def "givenString_whenUsingValueOf_thenConvertToInteger"() { + given: + int intNum = Integer.valueOf(STRING_NUM) - assertEquals(intNum, expectedInt) + expect: + intNum == EXPECTED_INT } - @Test - void givenString_whenUsingIntValue_thenConvertToInteger() { - def stringNum = "123" - int expectedInt = 123 - int intNum = new Integer(stringNum).intValue() + def "givenString_whenUsingIntValue_thenConvertToInteger"() { + given: + int intNum = Integer.valueOf(STRING_NUM).intValue() - assertEquals(intNum, expectedInt) + expect: + intNum == EXPECTED_INT } - @Test - void givenString_whenUsingNewInteger_thenConvertToInteger() { - def stringNum = "123" - int expectedInt = 123 - int intNum = new Integer(stringNum) + def "givenString_whenUsingNewInteger_thenConvertToInteger"() { + given: + Integer intNum = Integer.valueOf(STRING_NUM) - assertEquals(intNum, expectedInt) + expect: + intNum == EXPECTED_INT } - @Test - void givenString_whenUsingDecimalFormat_thenConvertToInteger() { - def stringNum = "123" - int expectedInt = 123 + def "givenString_whenUsingDecimalFormat_thenConvertToInteger"() { + given: DecimalFormat decimalFormat = new DecimalFormat("#") - int intNum = decimalFormat.parse(stringNum).intValue() - assertEquals(intNum, expectedInt) + when: + int intNum = decimalFormat.parse(STRING_NUM).intValue() + + then: + intNum == EXPECTED_INT } - @Test(expected = NumberFormatException.class) - void givenInvalidString_whenUsingAs_thenThrowNumberFormatException() { + def "givenInvalidString_whenUsingAs_thenThrowNumberFormatException"() { + given: def invalidString = "123a" + + when: invalidString as Integer + + then: + thrown(NumberFormatException) } - @Test(expected = NullPointerException.class) - void givenNullString_whenUsingToInteger_thenThrowNullPointerException() { + def "givenNullString_whenUsingToInteger_thenThrowNullPointerException"() { + given: def invalidString = null + + when: invalidString.toInteger() + + then: + thrown(NullPointerException) } - @Test - void givenString_whenUsingIsInteger_thenCheckIfCorrectValue() { + def "givenString_whenUsingIsInteger_thenCheckIfCorrectValue"() { + given: def invalidString = "123a" def validString = "123" + + when: def invalidNum = invalidString?.isInteger() ? invalidString as Integer : false def correctNum = validString?.isInteger() ? validString as Integer : false - assertEquals(false, invalidNum) - assertEquals(123, correctNum) + then: + !invalidNum + correctNum == 123 } } diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/CharacterInGroovy.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/CharacterInGroovy.groovy index c043723d95..30365ec9d7 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/CharacterInGroovy.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/CharacterInGroovy.groovy @@ -1,19 +1,18 @@ package groovy.com.baeldung.stringtypes -import org.junit.Assert -import org.junit.Test +import spock.lang.Specification -class CharacterInGroovy { +class CharacterInGroovy extends Specification { - @Test - void 'character'() { + def 'character'() { + given: char a = 'A' as char char b = 'B' as char char c = (char) 'C' - Assert.assertTrue(a instanceof Character) - Assert.assertTrue(b instanceof Character) - Assert.assertTrue(c instanceof Character) + expect: + a instanceof Character + b instanceof Character + c instanceof Character } - } diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/DoubleQuotedString.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/DoubleQuotedString.groovy index a730244d0a..e1074145f4 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/DoubleQuotedString.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/DoubleQuotedString.groovy @@ -1,67 +1,76 @@ package groovy.com.baeldung.stringtypes -import org.junit.Assert -import org.junit.Test +import spock.lang.Specification -class DoubleQuotedString { +class DoubleQuotedString extends Specification { - @Test - void 'escape double quoted string'() { + def 'escape double quoted string'() { + given: def example = "Hello \"world\"!" - println(example) + expect: + example == 'Hello "world"!' } - @Test - void 'String ang GString'() { + def 'String ang GString'() { + given: def string = "example" def stringWithExpression = "example${2}" - Assert.assertTrue(string instanceof String) - Assert.assertTrue(stringWithExpression instanceof GString) - Assert.assertTrue(stringWithExpression.toString() instanceof String) + expect: + string instanceof String + stringWithExpression instanceof GString + stringWithExpression.toString() instanceof String } - @Test - void 'placeholder with variable'() { + def 'placeholder with variable'() { + given: def name = "John" + + when: def helloName = "Hello $name!".toString() - Assert.assertEquals("Hello John!", helloName) + then: + helloName == "Hello John!" } - @Test - void 'placeholder with expression'() { + def 'placeholder with expression'() { + given: def result = "result is ${2 * 2}".toString() - Assert.assertEquals("result is 4", result) + expect: + result == "result is 4" } - @Test - void 'placeholder with dotted access'() { + def 'placeholder with dotted access'() { + given: def person = [name: 'John'] + when: def myNameIs = "I'm $person.name, and you?".toString() - Assert.assertEquals("I'm John, and you?", myNameIs) + then: + myNameIs == "I'm John, and you?" } - @Test - void 'placeholder with method call'() { + def 'placeholder with method call'() { + given: def name = 'John' + when: def result = "Uppercase name: ${name.toUpperCase()}".toString() - Assert.assertEquals("Uppercase name: JOHN", result) + then: + result == "Uppercase name: JOHN" } - @Test - void 'GString and String hashcode'() { + def 'GString and String hashcode'() { + given: def string = "2+2 is 4" def gstring = "2+2 is ${4}" - Assert.assertTrue(string.hashCode() != gstring.hashCode()) + expect: + string.hashCode() != gstring.hashCode() } - } diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/SingleQuotedString.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/SingleQuotedString.groovy index 569991b788..924515570c 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/SingleQuotedString.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/SingleQuotedString.groovy @@ -1,15 +1,14 @@ package groovy.com.baeldung.stringtypes -import org.junit.Assert -import org.junit.Test +import spock.lang.Specification -class SingleQuotedString { +class SingleQuotedString extends Specification { - @Test - void 'single quoted string'() { - def example = 'Hello world' + def 'single quoted string'() { + given: + def example = 'Hello world!' - Assert.assertEquals('Hello world!', 'Hello' + ' world!') + expect: + example == 'Hello' + ' world!' } - } diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/Strings.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/Strings.groovy index e45f352285..9d29210d81 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/Strings.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/stringtypes/Strings.groovy @@ -1,26 +1,29 @@ package groovy.com.baeldung.stringtypes -import org.junit.Assert -import org.junit.Test +import spock.lang.Specification -class Strings { +class Strings extends Specification { - @Test - void 'string interpolation '() { + def 'string interpolation '() { + given: def name = "Kacper" + when: def result = "Hello ${name}!" - Assert.assertEquals("Hello Kacper!", result.toString()) + then: + result.toString() == "Hello Kacper!" } - @Test - void 'string concatenation'() { + def 'string concatenation'() { + given: def first = "first" def second = "second" + when: def concatenation = first + second - Assert.assertEquals("firstsecond", concatenation) + then: + concatenation == "firstsecond" } } From d2eb17077fb30cd5123cd243e95b73e5b5d06b88 Mon Sep 17 00:00:00 2001 From: Alex Golub Date: Sun, 15 Jan 2023 22:13:35 +0200 Subject: [PATCH 279/592] Minor fixes for Trait subject --- .../com/baeldung/traits/AnimalTrait.groovy | 4 +- .../groovy/com/baeldung/traits/Dog.groovy | 5 +- .../com/baeldung/traits/Employee.groovy | 6 +- .../groovy/com/baeldung/traits/Human.groovy | 4 +- .../com/baeldung/traits/SpeakingTrait.groovy | 7 +- .../com/baeldung/traits/UserTrait.groovy | 25 ++- .../com/baeldung/traits/VehicleTrait.groovy | 8 +- .../com/baeldung/traits/WalkingTrait.groovy | 8 +- .../com/baeldung/traits/WheelTrait.groovy | 5 +- .../com/baeldung/traits/TraitsUnitTest.groovy | 145 +++++++++--------- 10 files changed, 109 insertions(+), 108 deletions(-) diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/AnimalTrait.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/AnimalTrait.groovy index 6ec5cda571..a3fed81c8b 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/AnimalTrait.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/AnimalTrait.groovy @@ -1,8 +1,8 @@ package com.baeldung.traits trait AnimalTrait { - + String basicBehavior() { return "Animalistic!!" } -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Dog.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Dog.groovy index 3e0677ba18..fc53b1bef9 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Dog.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Dog.groovy @@ -1,9 +1,8 @@ package com.baeldung.traits class Dog implements WalkingTrait, SpeakingTrait { - + String speakAndWalk() { WalkingTrait.super.speakAndWalk() } - -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Employee.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Employee.groovy index b3e4285476..16f1fab984 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Employee.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Employee.groovy @@ -1,12 +1,14 @@ package com.baeldung.traits class Employee implements UserTrait { - + + @Override String name() { return 'Bob' } + @Override String lastName() { return "Marley" } -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Human.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Human.groovy index e78d59bbfd..5417334269 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Human.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/Human.groovy @@ -1,6 +1,6 @@ package com.baeldung.traits interface Human { - + String lastName() -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/SpeakingTrait.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/SpeakingTrait.groovy index f437a94bd9..969982e8e0 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/SpeakingTrait.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/SpeakingTrait.groovy @@ -1,13 +1,12 @@ package com.baeldung.traits trait SpeakingTrait { - + String basicAbility() { return "Speaking!!" } - + String speakAndWalk() { return "Speak and walk!!" } - -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/UserTrait.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/UserTrait.groovy index 0d395bffcd..1d1d188460 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/UserTrait.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/UserTrait.groovy @@ -1,36 +1,35 @@ package com.baeldung.traits trait UserTrait implements Human { - + + String email + String address + + abstract String name() + String sayHello() { return "Hello!" } - - abstract String name() - + String showName() { - return "Hello, ${name()}!" + return "Hello, ${name()}!" } private String greetingMessage() { return 'Hello, from a private method!' } - + String greet() { def msg = greetingMessage() println msg msg } - + def self() { - return this + return this } - + String showLastName() { return "Hello, ${lastName()}!" } - - String email - String address } - \ No newline at end of file diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/VehicleTrait.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/VehicleTrait.groovy index f5ae8fab30..e29561157c 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/VehicleTrait.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/VehicleTrait.groovy @@ -1,9 +1,9 @@ package com.baeldung trait VehicleTrait extends WheelTrait { - + String showWheels() { - return "Num of Wheels $noOfWheels" + return "Num of Wheels $noOfWheels" } - -} \ No newline at end of file + +} diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/WalkingTrait.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/WalkingTrait.groovy index 66cff8809f..84be49ec25 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/WalkingTrait.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/WalkingTrait.groovy @@ -1,13 +1,13 @@ package com.baeldung.traits trait WalkingTrait { - + String basicAbility() { return "Walking!!" } - + String speakAndWalk() { return "Walk and speak!!" } - -} \ No newline at end of file + +} diff --git a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/WheelTrait.groovy b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/WheelTrait.groovy index 364d5b883e..7f2448e185 100644 --- a/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/WheelTrait.groovy +++ b/core-groovy-modules/core-groovy/src/main/groovy/com/baeldung/traits/WheelTrait.groovy @@ -1,7 +1,6 @@ package com.baeldung trait WheelTrait { - + int noOfWheels - -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/traits/TraitsUnitTest.groovy b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/traits/TraitsUnitTest.groovy index 85130e8f07..b47cba6437 100644 --- a/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/traits/TraitsUnitTest.groovy +++ b/core-groovy-modules/core-groovy/src/test/groovy/com/baeldung/traits/TraitsUnitTest.groovy @@ -7,108 +7,111 @@ class TraitsUnitTest extends Specification { Employee employee Dog dog - void setup () { + void setup() { employee = new Employee() dog = new Dog() } - def 'Should return msg string when using Employee.sayHello method provided by UserTrait' () { + def 'Should return msg string when using Employee.sayHello method provided by UserTrait'() { when: - def msg = employee.sayHello() + def msg = employee.sayHello() + then: - msg - msg instanceof String - assert msg == "Hello!" + msg + msg instanceof String + msg == "Hello!" } - - def 'Should return displayMsg string when using Employee.showName method' () { + + def 'Should return displayMsg string when using Employee.showName method'() { when: - def displayMsg = employee.showName() + def displayMsg = employee.showName() + then: - displayMsg - displayMsg instanceof String - assert displayMsg == "Hello, Bob!" + displayMsg + displayMsg instanceof String + displayMsg == "Hello, Bob!" } - - def 'Should return greetMsg string when using Employee.greet method' () { + + def 'Should return greetMsg string when using Employee.greet method'() { when: - def greetMsg = employee.greet() + def greetMsg = employee.greet() + then: - greetMsg - greetMsg instanceof String - assert greetMsg == "Hello, from a private method!" + greetMsg + greetMsg instanceof String + greetMsg == "Hello, from a private method!" } - - def 'Should return MissingMethodException when using Employee.greetingMessage method' () { + + def 'Should return MissingMethodException when using Employee.greetingMessage method'() { when: - def exception - try { - employee.greetingMessage() - }catch(Exception e) { - exception = e - } - + employee.greetingMessage() + then: - exception - exception instanceof groovy.lang.MissingMethodException - assert exception.message == "No signature of method: com.baeldung.traits.Employee.greetingMessage()"+ - " is applicable for argument types: () values: []" + thrown(MissingMethodException) + specificationContext.thrownException.message == + "No signature of method: com.baeldung.traits.Employee.greetingMessage() is applicable for argument types: () values: []" } - - def 'Should return employee instance when using Employee.whoAmI method' () { + + def 'Should return employee instance when using Employee.whoAmI method'() { when: - def emp = employee.self() + def emp = employee.self() + then: - emp - emp instanceof Employee - assert emp.is(employee) + emp + emp instanceof Employee + emp.is(employee) } - - def 'Should display lastName when using Employee.showLastName method' () { + + def 'Should display lastName when using Employee.showLastName method'() { when: - def lastNameMsg = employee.showLastName() + def lastNameMsg = employee.showLastName() + then: - lastNameMsg - lastNameMsg instanceof String - assert lastNameMsg == "Hello, Marley!" + lastNameMsg + lastNameMsg instanceof String + lastNameMsg == "Hello, Marley!" } - - def 'Should be able to define properties of UserTrait in Employee instance' () { + + def 'Should be able to define properties of UserTrait in Employee instance'() { when: - employee = new Employee(email: "a@e.com", address: "baeldung.com") + employee = new Employee(email: "a@e.com", address: "baeldung.com") + then: - employee - employee instanceof Employee - assert employee.email == "a@e.com" - assert employee.address == "baeldung.com" + employee + employee instanceof Employee + employee.email == "a@e.com" + employee.address == "baeldung.com" } - - def 'Should execute basicAbility method from SpeakingTrait and return msg string' () { + + def 'Should execute basicAbility method from SpeakingTrait and return msg string'() { when: - def speakMsg = dog.basicAbility() + def speakMsg = dog.basicAbility() + then: - speakMsg - speakMsg instanceof String - assert speakMsg == "Speaking!!" + speakMsg + speakMsg instanceof String + speakMsg == "Speaking!!" } - - def 'Should verify multiple inheritance with traits and execute overridden traits method' () { + + def 'Should verify multiple inheritance with traits and execute overridden traits method'() { when: - def walkSpeakMsg = dog.speakAndWalk() - println walkSpeakMsg + def walkSpeakMsg = dog.speakAndWalk() + println walkSpeakMsg + then: - walkSpeakMsg - walkSpeakMsg instanceof String - assert walkSpeakMsg == "Walk and speak!!" + walkSpeakMsg + walkSpeakMsg instanceof String + walkSpeakMsg == "Walk and speak!!" } - - def 'Should implement AnimalTrait at runtime and access basicBehavior method' () { + + def 'Should implement AnimalTrait at runtime and access basicBehavior method'() { when: - def dogInstance = new Dog() as AnimalTrait - def basicBehaviorMsg = dogInstance.basicBehavior() + def dogInstance = new Dog() as AnimalTrait + def basicBehaviorMsg = dogInstance.basicBehavior() + then: - basicBehaviorMsg - basicBehaviorMsg instanceof String - assert basicBehaviorMsg == "Animalistic!!" + basicBehaviorMsg + basicBehaviorMsg instanceof String + basicBehaviorMsg == "Animalistic!!" } -} \ No newline at end of file +} From 18787b33c5884555a69c2a75b3794ee0218d8c7a Mon Sep 17 00:00:00 2001 From: jsgrah-spring Date: Mon, 16 Jan 2023 18:31:13 +0100 Subject: [PATCH 280/592] JAVA-16085, Potential issue in "A Guide to SAML with Spring Security" article (#13279) * JAVA-16085, Potential issue in "A Guide to SAML with Spring Security" article. * JAVA-16085, Cleanup unnecessary resources samlKeystore.jks and library maven-war-plugin. Co-authored-by: jogra --- .../src/main/resources/application.properties | 8 ++++---- .../src/main/resources/saml/saml-keystore.jks | Bin 0 -> 2784 bytes .../src/main/resources/saml/samlKeystore.jks | Bin 2244 -> 0 bytes 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 spring-security-modules/spring-security-saml/src/main/resources/saml/saml-keystore.jks delete mode 100644 spring-security-modules/spring-security-saml/src/main/resources/saml/samlKeystore.jks diff --git a/spring-security-modules/spring-security-saml/src/main/resources/application.properties b/spring-security-modules/spring-security-saml/src/main/resources/application.properties index fd7798dda9..332278225c 100644 --- a/spring-security-modules/spring-security-saml/src/main/resources/application.properties +++ b/spring-security-modules/spring-security-saml/src/main/resources/application.properties @@ -1,9 +1,9 @@ -saml.keystore.location=classpath:/saml/saml-keystore +saml.keystore.location=classpath:/saml/saml-keystore.jks # Password for Java keystore and item therein -saml.keystore.password= -saml.keystore.alias= +saml.keystore.password=baeldungsamlokta +saml.keystore.alias=baeldungspringsaml # SAML Entity ID extracted from top of SAML metadata file -saml.idp= +saml.idp=http://www.okta.com/exk26fxqrz8LLk9dV4x7 saml.sp=http://localhost:8080/saml/metadata spring.main.allow-circular-references=true \ No newline at end of file diff --git a/spring-security-modules/spring-security-saml/src/main/resources/saml/saml-keystore.jks b/spring-security-modules/spring-security-saml/src/main/resources/saml/saml-keystore.jks new file mode 100644 index 0000000000000000000000000000000000000000..535c6111809dbf409b56ee85a6a7d0fb680fa703 GIT binary patch literal 2784 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 HUzYSwll%Zc literal 0 HcmV?d00001 diff --git a/spring-security-modules/spring-security-saml/src/main/resources/saml/samlKeystore.jks b/spring-security-modules/spring-security-saml/src/main/resources/saml/samlKeystore.jks deleted file mode 100644 index 7f3a5850d9c79eb1bbe47eae6c1ae21e2e2d3529..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2244 zcmchYdpHw{AI5hxx7mmk#d0lkX>Jjnxg>YmBA1cNrdSwCY+Vo=#b}8fmk<`RP%dXg z2uF#qLLy@2QmJfmY0}T{Jip(0&hzyD`Q!cL{rvTP-sgSZ@8;s>A^-pYZ3+07#3DkY z1J4GAhi!qgG_&?506+wQPK0cr;ZO-}C=dcffnz2L)YR3+PuxCxl~nO-JFFkrMX{EEBwc(iN9$0L2Z2jc29s*-Zk9reBt% zKil-vtg$owD=&YZqP2n?NVfJ2)rnW9N*!$nwl1jk4H#)+Pm{KFposK|@tK zl#y!WV^eWaC9QY!B5Gv2WEsyJQ3M4nO|p&JOF{(8U|>Y z2b4TdF=A);s7ky!+FI5%vpz}}=YPoL<-R)@{qjL|xz_A#@qXxKA~nE66Xp?f`nqSr zYZB_cj_0^PfdF;CJQrUu8hXXw8eI1NK0|jGL%mk&6~u6JVy_Z@bHVKdPaC=ODegSs zp`!Ai+doG1ZHJ0g!BuWL2Eu|@3lC3WL*Yu(Cpq}cM~QQ^T8(}I_sp5m#kMEy&Bxo- zmzS+8K!!t^@r~FTR75O443Wh|(rpe6WhQ6ybBsLFT;=h0j}6Q)>ez1liputV%kz)m z?ap%{Hh3C$`l@B`wqd>_?J`q%Kiy+o9`Kg#!K}LNS8SS+q#RSXqJkstsu(YdO)d0u zX=!6zYP9ZFHjU}eALbb>46AZ$9Ikrv%cuqDIG=WFzJDvML}U);v*36gfh|X*MV{Z_=jk~(*B}0efq7y7RPI11xH5Cl9!8eeg~B}QnK9Kv9RDK&76(h zRH+I5drgkgT6J_*kZ}O}wWwWr0r3rEP`S~`J&r9T4oV7OPtJ?JqY5NF*EmMJ2+3pJ zc*vlSPy+Vwl?K`LR!ZtM&6x&I20^{%RaAvYYH(L(nI@@|9vp63tU5@F7-R*ksKZUvk z_p+_csB$6r9{ncaoMz z+Qvi#yOy=z${@xYP{Z0!8Phu);DCN}Ck2FUFxCE82-xTV1<5j-g8p|CT$h^G}8Kr}K-bAZMI%B(JOfJW0oKo}EoW!2I z+8LauH)1B25Vb7hqmmyk?|?{fqS{$Fr?IC>UmX7KrW|zJq{0w%`T82~&*5lEhr9b4 zU{kAhRqxTIU(8n3&`e=}}=3v#j9UOv|JG_7brnbnn++zYf? zkgN&7Tm8hX1FfCXk69?ukR^rwB5m856W=gZ>D{28+6rfG|Fw)FUV6spg8%^d0y+^K zi%taj7lT1S5C|f5vG){O3M!6DwohJ_0s#@S0#*MR$JVa^Cjt>$ zPXs6dN(2G{bw5w)@>3Zhq1^HsvBFcDvXV;&EfrpRY%<@OMCEm^DZl~BS-j7d=)0Wz zCvtGZ=2=G!=EWH{pj;h0@xU=)H)>$B>*p7ik&|>$cgVnt%^Lf&F^BHaBLn&*eM>4n zdaUr4%SX$NbzHWaSWrlx+c-fLf_QDn3x}Dc<)JXLjOudz#ZhyHhAaI0<2ZWc?%X>A zOt8p}C37jCR{O)3x}<%t>KqJ{16VyvPz0H$`jho6^eGLTl*vFcSYNFNdZE2w*XPQV z8xPMldTg6LL$Af+5{?+}nRj7x{vf^?h~3v$;x}ZLq<%xF{S0S8m}7m}@Dnh__9fF4 zdKHAnL0}*NSgL|XqLsE9q6CM?L*)FHz~b6JqId(^bykuG@$Mg#TPOY*;#Q}&LIeWL zN79`m?x*G^yXsxaatG2OC|Nwn)!FP_r^~scA#Q@)EY^-sX=ZuH>{wGl)~2H&T8iH+FOxDXFm;e ztji3w^d6CXNmLWl80Ww>(gE`sDWgeV)582XPH-Uk4ed!4P8^ZFObH9eyjdnB$vKq} zkbAvgrwZ=R_}N6TLaUIBgzLI6`6OPl>NzzPjO-QJ_Luyn2wFf7vN+?F4V6HcOzT+x T_;Wn+`Mka2bNFxOdj|dk==RY4 From c217f7e95c90b8d78631c8fce1c036b41ee9b5d9 Mon Sep 17 00:00:00 2001 From: jsgrah-spring Date: Mon, 16 Jan 2023 18:37:14 +0100 Subject: [PATCH 281/592] JAVA-15621, Potential issue in "Guide to UUID in Java" article. (#13271) * JAVA-15621, Potential issue in "Guide to UUID in Java" article. * JAVA-15621, Keep the raw strings in the article to make it easy for users to understand. * JAVA-15621, Keep the raw strings in the article to make it easy for users to understand. Co-authored-by: jogra --- .../main/java/com/baeldung/uuid/UUIDGenerator.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDGenerator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDGenerator.java index 2170a72644..68ff9ce1d4 100644 --- a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDGenerator.java +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDGenerator.java @@ -27,17 +27,17 @@ public final class UUIDGenerator { private static long get64LeastSignificantBitsForVersion1() { final long random63BitLong = new Random().nextLong() & 0x3FFFFFFFFFFFFFFFL; - final long variant3BitFlag = 0x8000000000000000L; - return random63BitLong + variant3BitFlag; + long variant3BitFlag = 0x8000000000000000L; + return random63BitLong | variant3BitFlag; } private static long get64MostSignificantBitsForVersion1() { - final long timeForUuidIn100Nanos = System.currentTimeMillis(); - final long time_low = (timeForUuidIn100Nanos & 0x0000_0000_FFFF_FFFFL) << 32; - final long time_mid = ((timeForUuidIn100Nanos >> 32) & 0xFFFF) << 16; + final long currentTimeMillis = System.currentTimeMillis(); + final long time_low = (currentTimeMillis & 0x0000_0000_FFFF_FFFFL) << 32; + final long time_mid = ((currentTimeMillis >> 32) & 0xFFFF) << 16; final long version = 1 << 12; - final long time_hi = ((timeForUuidIn100Nanos >> 48) & 0x0FFF); - return time_low + time_mid + version + time_hi; + final long time_high = ((currentTimeMillis >> 48) & 0x0FFF); + return time_low | time_mid | version | time_high; } /** From b90386e8d4d74fd499cd10ed621e5f33f8871374 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 16 Jan 2023 17:48:20 +0000 Subject: [PATCH 282/592] [JAVA-17295] Create and initialize ThreadPoolTaskExecutor (#13249) Co-authored-by: panagiotiskakos --- .../java/com/baeldung/async/config/SpringAsyncConfig.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spring-scheduling/src/main/java/com/baeldung/async/config/SpringAsyncConfig.java b/spring-scheduling/src/main/java/com/baeldung/async/config/SpringAsyncConfig.java index 56fa643017..872f59ebb6 100644 --- a/spring-scheduling/src/main/java/com/baeldung/async/config/SpringAsyncConfig.java +++ b/spring-scheduling/src/main/java/com/baeldung/async/config/SpringAsyncConfig.java @@ -24,7 +24,9 @@ public class SpringAsyncConfig implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { - return new SimpleAsyncTaskExecutor(); + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; } @Override From dcc35801e77167f8add6d0dfc0ed29f315a4f43b Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 17 Jan 2023 03:40:44 +0000 Subject: [PATCH 283/592] [JAVA-15025] Upgraded to apache http 5 (#13296) * [JAVA-15025] Upgraded to apache http 5 * [JAVA-15025] Clean up Co-authored-by: panagiotiskakos --- .../sec/HttpClientAuthLiveTest.java | 139 +++++++++--------- 1 file changed, 70 insertions(+), 69 deletions(-) diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/sec/HttpClientAuthLiveTest.java b/httpclient-simple/src/test/java/com/baeldung/httpclient/sec/HttpClientAuthLiveTest.java index 0f7018a9ac..35af84679b 100644 --- a/httpclient-simple/src/test/java/com/baeldung/httpclient/sec/HttpClientAuthLiveTest.java +++ b/httpclient-simple/src/test/java/com/baeldung/httpclient/sec/HttpClientAuthLiveTest.java @@ -1,118 +1,119 @@ package com.baeldung.httpclient.sec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + import org.apache.commons.codec.binary.Base64; -import org.apache.http.HttpHeaders; -import org.apache.http.HttpHost; -import org.apache.http.HttpStatus; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.AuthCache; -import org.apache.http.client.CredentialsProvider; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.protocol.HttpClientContext; -import org.apache.http.impl.auth.BasicScheme; -import org.apache.http.impl.client.BasicAuthCache; -import org.apache.http.impl.client.BasicCredentialsProvider; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.protocol.HttpContext; -import com.baeldung.httpclient.ResponseUtil; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; + +import com.baeldung.handler.CustomHttpClientResponseHandler; + +import org.apache.hc.client5.http.auth.AuthScope; +import org.apache.hc.client5.http.auth.AuthCache; +import org.apache.hc.client5.http.auth.CredentialsProvider; +import org.apache.hc.client5.http.auth.UsernamePasswordCredentials; +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.impl.auth.BasicAuthCache; +import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider; +import org.apache.hc.client5.http.impl.auth.BasicScheme; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.client5.http.protocol.HttpClientContext; +import org.apache.hc.core5.http.HttpHeaders; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.HttpStatus; +import org.apache.hc.core5.http.protocol.HttpContext; + +import org.junit.jupiter.api.Test; import java.io.IOException; import java.nio.charset.StandardCharsets; -import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; - /* * NOTE : Need module httpclient-simple to be running */ - -public class HttpClientAuthLiveTest { +class HttpClientAuthLiveTest { private static final String URL_SECURED_BY_BASIC_AUTHENTICATION = "http://localhost:8082/httpclient-simple/api/foos/1"; private static final String DEFAULT_USER = "user1"; private static final String DEFAULT_PASS = "user1Pass"; - - private CloseableHttpClient client; - - private CloseableHttpResponse response; - - @Before - public final void before() { - client = HttpClientBuilder.create().build(); - } - - @After - public final void after() throws IllegalStateException, IOException { - ResponseUtil.closeResponse(response); - } - - // tests + private final char[] DEFAULT_PASS_ARRAY = DEFAULT_PASS.toCharArray() ; @Test - public final void whenExecutingBasicGetRequestWithBasicAuthenticationEnabled_thenSuccess() throws IOException { - client = HttpClientBuilder.create().setDefaultCredentialsProvider(provider()).build(); + final void whenExecutingBasicGetRequestWithBasicAuthenticationEnabled_thenSuccess() throws IOException { + final HttpGet request = new HttpGet(URL_SECURED_BY_BASIC_AUTHENTICATION); + try (CloseableHttpClient client = HttpClientBuilder.create() + .setDefaultCredentialsProvider(provider()) + .build(); - response = client.execute(new HttpGet(URL_SECURED_BY_BASIC_AUTHENTICATION)); - - final int statusCode = response.getStatusLine().getStatusCode(); - assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(request, new CustomHttpClientResponseHandler())) { + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } } @Test - public final void givenAuthenticationIsPreemptive_whenExecutingBasicGetRequestWithBasicAuthenticationEnabled_thenSuccess() throws IOException { - client = HttpClientBuilder.create().build(); - response = client.execute(new HttpGet(URL_SECURED_BY_BASIC_AUTHENTICATION), context()); + final void givenAuthenticationIsPreemptive_whenExecutingBasicGetRequestWithBasicAuthenticationEnabled_thenSuccess() throws IOException { + final HttpGet request = new HttpGet(URL_SECURED_BY_BASIC_AUTHENTICATION); + try (CloseableHttpClient client = HttpClientBuilder.create() + .build(); - final int statusCode = response.getStatusLine().getStatusCode(); - assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(request, context(), new CustomHttpClientResponseHandler())) { + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(200)); + } } @Test - public final void givenAuthorizationHeaderIsSetManually_whenExecutingGetRequest_thenSuccess() throws IOException { - client = HttpClientBuilder.create().build(); - + final void givenAuthorizationHeaderIsSetManually_whenExecutingGetRequest_thenSuccess() throws IOException { final HttpGet request = new HttpGet(URL_SECURED_BY_BASIC_AUTHENTICATION); request.setHeader(HttpHeaders.AUTHORIZATION, authorizationHeader(DEFAULT_USER, DEFAULT_PASS)); - response = client.execute(request); + try (CloseableHttpClient client = HttpClientBuilder.create() + .build(); - final int statusCode = response.getStatusLine().getStatusCode(); - assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(request, context(), new CustomHttpClientResponseHandler())) { + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } } @Test - public final void givenAuthorizationHeaderIsSetManually_whenExecutingGetRequest_thenSuccess2() throws IOException { + final void givenAuthorizationHeaderIsSetManually_whenExecutingGetRequest_thenSuccess2() throws IOException { final HttpGet request = new HttpGet(URL_SECURED_BY_BASIC_AUTHENTICATION); final String auth = DEFAULT_USER + ":" + DEFAULT_PASS; final byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.ISO_8859_1)); final String authHeader = "Basic " + new String(encodedAuth); request.setHeader(HttpHeaders.AUTHORIZATION, authHeader); - client = HttpClientBuilder.create().build(); - response = client.execute(request); + try (CloseableHttpClient client = HttpClientBuilder.create() + .build(); - final int statusCode = response.getStatusLine().getStatusCode(); - assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(request, new CustomHttpClientResponseHandler())) { + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } } // UTILS private CredentialsProvider provider() { - final CredentialsProvider provider = new BasicCredentialsProvider(); - final UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(DEFAULT_USER, DEFAULT_PASS); - provider.setCredentials(AuthScope.ANY, credentials); + final HttpHost targetHost = new HttpHost("http", "localhost", 8082); + final BasicCredentialsProvider provider = new BasicCredentialsProvider(); + AuthScope authScope = new AuthScope(targetHost); + provider.setCredentials(authScope, new UsernamePasswordCredentials(DEFAULT_USER, DEFAULT_PASS_ARRAY)); return provider; } private HttpContext context() { - final HttpHost targetHost = new HttpHost("localhost", 8082, "http"); - final CredentialsProvider credsProvider = new BasicCredentialsProvider(); - credsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(DEFAULT_USER, DEFAULT_PASS)); + final HttpHost targetHost = new HttpHost("http", "localhost", 8082); + final BasicCredentialsProvider credsProvider = new BasicCredentialsProvider(); + AuthScope authScope = new AuthScope(targetHost); + credsProvider.setCredentials(authScope, new UsernamePasswordCredentials(DEFAULT_USER, DEFAULT_PASS_ARRAY)); // Create AuthCache instance final AuthCache authCache = new BasicAuthCache(); From 0a76db37d657fee22224cc4178aa5aa4ba74d67c Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 17 Jan 2023 05:39:28 +0000 Subject: [PATCH 284/592] [JAVA-15016] Upgraded to apache http client 5.2 (#13269) * [JAVA-15016] Upgraded to apache http client 5.2 * [JAVA-15016] Clean up * [JAVA-15016] Junit 5 clean up Co-authored-by: panagiotiskakos --- .../HttpClientGettingCookieValueUnitTest.java | 58 ++++++++++--------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/apache-httpclient-2/src/test/java/com/baeldung/httpclient/cookies/HttpClientGettingCookieValueUnitTest.java b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/cookies/HttpClientGettingCookieValueUnitTest.java index 404acb3098..265fa39816 100644 --- a/apache-httpclient-2/src/test/java/com/baeldung/httpclient/cookies/HttpClientGettingCookieValueUnitTest.java +++ b/apache-httpclient-2/src/test/java/com/baeldung/httpclient/cookies/HttpClientGettingCookieValueUnitTest.java @@ -1,46 +1,50 @@ package com.baeldung.httpclient.cookies; -import org.apache.http.client.CookieStore; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.protocol.HttpClientContext; -import org.apache.http.cookie.ClientCookie; -import org.apache.http.cookie.Cookie; -import org.apache.http.impl.client.BasicCookieStore; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.cookie.BasicClientCookie; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.cookie.BasicCookieStore; +import org.apache.hc.client5.http.cookie.Cookie; +import org.apache.hc.client5.http.cookie.CookieStore; + +import org.apache.hc.client5.http.impl.classic.BasicHttpClientResponseHandler; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; + +import org.apache.hc.client5.http.impl.cookie.BasicClientCookie; +import org.apache.hc.client5.http.protocol.HttpClientContext; + import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; -import static org.junit.Assert.assertEquals; - - -public class HttpClientGettingCookieValueUnitTest { +class HttpClientGettingCookieValueUnitTest { private static Logger log = LoggerFactory.getLogger(HttpClientGettingCookieValueUnitTest.class); private static final String SAMPLE_URL = "http://www.baeldung.com/"; @Test - public final void whenSettingCustomCookieOnTheRequest_thenGettingTheSameCookieFromTheResponse() throws IOException { + void whenSettingCustomCookieOnTheRequest_thenGettingTheSameCookieFromTheResponse() throws IOException { + HttpClientContext context = HttpClientContext.create(); context.setAttribute(HttpClientContext.COOKIE_STORE, createCustomCookieStore()); - try (CloseableHttpClient httpClient = HttpClients.createDefault()) { - try (CloseableHttpResponse response = httpClient.execute(new HttpGet(SAMPLE_URL), context)) { - CookieStore cookieStore = context.getCookieStore(); - Cookie customCookie = cookieStore.getCookies() - .stream() - .peek(cookie -> log.info("cookie name:{}", cookie.getName())) - .filter(cookie -> "custom_cookie".equals(cookie.getName())) - .findFirst() - .orElseThrow(IllegalStateException::new); + final HttpGet request = new HttpGet(SAMPLE_URL); - assertEquals("test_value", customCookie.getValue()); - } + try (CloseableHttpClient client = HttpClientBuilder.create() + .build()) { + client.execute(request, context, new BasicHttpClientResponseHandler()); + CookieStore cookieStore = context.getCookieStore(); + Cookie customCookie = cookieStore.getCookies() + .stream() + .peek(cookie -> log.info("cookie name:{}", cookie.getName())) + .filter(cookie -> "custom_cookie".equals(cookie.getName())) + .findFirst() + .orElseThrow(IllegalStateException::new); + + assertEquals("test_value", customCookie.getValue()); } } @@ -48,7 +52,7 @@ public class HttpClientGettingCookieValueUnitTest { BasicCookieStore cookieStore = new BasicCookieStore(); BasicClientCookie cookie = new BasicClientCookie("custom_cookie", "test_value"); cookie.setDomain("baeldung.com"); - cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "true"); + cookie.setAttribute("domain", "true"); cookie.setPath("/"); cookieStore.addCookie(cookie); return cookieStore; From 77d6a987a8684460c91460e4499e6b0e295e09e0 Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Tue, 17 Jan 2023 20:47:07 +0100 Subject: [PATCH 285/592] BAEL-6058: renamed test class --- ...licationTest.java => HeaderInterceptorIntegrationTest.java} | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) rename spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/requestheader/{HeaderInterceptorApplicationTest.java => HeaderInterceptorIntegrationTest.java} (96%) diff --git a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/requestheader/HeaderInterceptorApplicationTest.java b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/requestheader/HeaderInterceptorIntegrationTest.java similarity index 96% rename from spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/requestheader/HeaderInterceptorApplicationTest.java rename to spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/requestheader/HeaderInterceptorIntegrationTest.java index 77b48fbe99..9343a608e4 100644 --- a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/requestheader/HeaderInterceptorApplicationTest.java +++ b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/requestheader/HeaderInterceptorIntegrationTest.java @@ -4,7 +4,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -20,7 +19,7 @@ import org.springframework.web.context.WebApplicationContext; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { HeaderInterceptorApplication.class }) @WebAppConfiguration -public class HeaderInterceptorApplicationTest { +public class HeaderInterceptorIntegrationTest { @Autowired private WebApplicationContext webApplicationContext; From a4f6d89cc7789bc2d0ef9fb8c9ff60f9ab55286f Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Wed, 18 Jan 2023 00:15:26 +0100 Subject: [PATCH 286/592] [store-triple-in-list] Storing Data Triple in a List in Java (#13295) * [store-triple-in-list] Storing Data Triple in a List in Java * [store-triple-in-list] method name "give..."->"given..." --- .../main/java/com/baeldung/triple/Triple.java | 26 +++++ .../baeldung/triple/TripleInListUnitTest.java | 105 ++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/triple/Triple.java create mode 100644 core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/triple/TripleInListUnitTest.java diff --git a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/triple/Triple.java b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/triple/Triple.java new file mode 100644 index 0000000000..b19266ad21 --- /dev/null +++ b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/triple/Triple.java @@ -0,0 +1,26 @@ +package com.baeldung.triple; + +public class Triple { + + private final L left; + private final M middle; + private final R right; + + public Triple(L left, M middle, R right) { + this.left = left; + this.middle = middle; + this.right = right; + } + + public L getLeft() { + return left; + } + + public M getMiddle() { + return middle; + } + + public R getRight() { + return right; + } +} diff --git a/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/triple/TripleInListUnitTest.java b/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/triple/TripleInListUnitTest.java new file mode 100644 index 0000000000..2196ae687f --- /dev/null +++ b/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/triple/TripleInListUnitTest.java @@ -0,0 +1,105 @@ +package com.baeldung.triple; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import org.junit.jupiter.api.Test; + +public class TripleInListUnitTest { + + enum OP { + PLUS("+"), MINUS("-"), MULTIPLY("x"); + final String opSign; + + OP(String x) { + this.opSign = x; + } + } + + private String createQuestion(Long num1, OP operator, Long num2) { + long result; + switch (operator) { + case PLUS: + result = num1 + num2; + break; + case MINUS: + result = num1 - num2; + break; + case MULTIPLY: + result = num1 * num2; + break; + default: + throw new IllegalArgumentException("Unknown operator"); + } + return String.format("%d %s %d = ? ( answer: %d )", num1, operator.opSign, num2, result); + } + + private static final List EXPECTED_QUESTIONS = Arrays.asList( + "100 - 42 = ? ( answer: 58 )", + "100 + 42 = ? ( answer: 142 )", + "100 x 42 = ? ( answer: 4200 )"); + + @Test + void givenTripleValues_whenStoreAsList_thenTypeIsNotSafe() { + + List myTriple1 = new ArrayList(3); + myTriple1.add(100L); + myTriple1.add(OP.MINUS); + myTriple1.add(42L); + + List myTriple2 = new ArrayList(3); + myTriple2.add(100L); + myTriple2.add(OP.PLUS); + myTriple2.add(42L); + + List myTriple3 = new ArrayList(3); + myTriple3.add(100L); + myTriple3.add(OP.MULTIPLY); + myTriple3.add(42L); + + List listOfTriples = new ArrayList<>(Arrays.asList(myTriple1, myTriple2, myTriple3)); + + List oopsTriple = new ArrayList(3); + oopsTriple.add("Oops"); + oopsTriple.add(911L); + oopsTriple.add("The type is wrong"); + + listOfTriples.add(oopsTriple); + assertEquals(4, listOfTriples.size()); + + List questions = listOfTriples.stream() + .filter( + triple -> triple.size() == 3 + && triple.get(0) instanceof Long + && triple.get(1) instanceof OP + && triple.get(2) instanceof Long + ).map(triple -> { + Long left = (Long) triple.get(0); + OP op = (OP) triple.get(1); + Long right = (Long) triple.get(2); + return createQuestion(left, op, right); + }).collect(Collectors.toList()); + + assertEquals(EXPECTED_QUESTIONS, questions); + } + + @Test + void givenTripleValues_whenUsingTheTripleClass_thenTypeIsSafeAndNeat() { + Triple triple1 = new Triple<>(100L, OP.MINUS, 42L); + Triple triple2 = new Triple<>(100L, OP.PLUS, 42L); + Triple triple3 = new Triple<>(100L, OP.MULTIPLY, 42L); + Triple tripleOops = new Triple<>("Oops", 911L, "The type is wrong"); + + List> listOfTriples = new ArrayList<>(Arrays.asList(triple1, triple2, triple3)); + // listOfTriples.add(tripleOops); // Compiler error: "java: incompatible types ... " + + List questions = listOfTriples.stream() + .map(triple -> createQuestion(triple.getLeft(), triple.getMiddle(), triple.getRight())) + .collect(Collectors.toList()); + + assertEquals(EXPECTED_QUESTIONS, questions); + } +} From b62dcfbb36984629e613e4c49cd4c59ad3bfde03 Mon Sep 17 00:00:00 2001 From: gantoin Date: Wed, 18 Jan 2023 11:09:58 +0100 Subject: [PATCH 287/592] fix: Typos in Avro module --- .../AvroDeSerializer.java} | 10 +++---- .../AvroSerializer.java} | 10 +++---- ...erializerDeSerializerIntegrationTest.java} | 26 +++++++++---------- 3 files changed, 23 insertions(+), 23 deletions(-) rename apache-libraries/src/main/java/com/baeldung/avro/util/{serealization/AvroDeSerealizer.java => serialization/AvroDeSerializer.java} (84%) rename apache-libraries/src/main/java/com/baeldung/avro/util/{serealization/AvroSerealizer.java => serialization/AvroSerializer.java} (87%) rename apache-libraries/src/test/java/com/baeldung/avro/util/{serealization/AvroSerealizerDeSerealizerIntegrationTest.java => serialization/AvroSerializerDeSerializerIntegrationTest.java} (75%) diff --git a/apache-libraries/src/main/java/com/baeldung/avro/util/serealization/AvroDeSerealizer.java b/apache-libraries/src/main/java/com/baeldung/avro/util/serialization/AvroDeSerializer.java similarity index 84% rename from apache-libraries/src/main/java/com/baeldung/avro/util/serealization/AvroDeSerealizer.java rename to apache-libraries/src/main/java/com/baeldung/avro/util/serialization/AvroDeSerializer.java index 7d30c3d1ee..cf4c360ba4 100644 --- a/apache-libraries/src/main/java/com/baeldung/avro/util/serealization/AvroDeSerealizer.java +++ b/apache-libraries/src/main/java/com/baeldung/avro/util/serialization/AvroDeSerializer.java @@ -1,4 +1,4 @@ -package com.baeldung.avro.util.serealization; +package com.baeldung.avro.util.serialization; import com.baeldung.avro.util.model.AvroHttpRequest; import org.apache.avro.io.DatumReader; @@ -10,11 +10,11 @@ import org.slf4j.LoggerFactory; import java.io.IOException; -public class AvroDeSerealizer { +public class AvroDeSerializer { - private static Logger logger = LoggerFactory.getLogger(AvroDeSerealizer.class); + private static Logger logger = LoggerFactory.getLogger(AvroDeSerializer.class); - public AvroHttpRequest deSerealizeAvroHttpRequestJSON(byte[] data) { + public AvroHttpRequest deSerializeAvroHttpRequestJSON(byte[] data) { DatumReader reader = new SpecificDatumReader<>(AvroHttpRequest.class); Decoder decoder = null; try { @@ -27,7 +27,7 @@ public class AvroDeSerealizer { return null; } - public AvroHttpRequest deSerealizeAvroHttpRequestBinary(byte[] data) { + public AvroHttpRequest deSerializeAvroHttpRequestBinary(byte[] data) { DatumReader employeeReader = new SpecificDatumReader<>(AvroHttpRequest.class); Decoder decoder = DecoderFactory.get() .binaryDecoder(data, null); diff --git a/apache-libraries/src/main/java/com/baeldung/avro/util/serealization/AvroSerealizer.java b/apache-libraries/src/main/java/com/baeldung/avro/util/serialization/AvroSerializer.java similarity index 87% rename from apache-libraries/src/main/java/com/baeldung/avro/util/serealization/AvroSerealizer.java rename to apache-libraries/src/main/java/com/baeldung/avro/util/serialization/AvroSerializer.java index 767b688dea..6d39060ec8 100644 --- a/apache-libraries/src/main/java/com/baeldung/avro/util/serealization/AvroSerealizer.java +++ b/apache-libraries/src/main/java/com/baeldung/avro/util/serialization/AvroSerializer.java @@ -1,4 +1,4 @@ -package com.baeldung.avro.util.serealization; +package com.baeldung.avro.util.serialization; import com.baeldung.avro.util.model.AvroHttpRequest; import org.apache.avro.io.*; @@ -9,11 +9,11 @@ import org.slf4j.LoggerFactory; import java.io.ByteArrayOutputStream; import java.io.IOException; -public class AvroSerealizer { +public class AvroSerializer { - private static final Logger logger = LoggerFactory.getLogger(AvroSerealizer.class); + private static final Logger logger = LoggerFactory.getLogger(AvroSerializer.class); - public byte[] serealizeAvroHttpRequestJSON(AvroHttpRequest request) { + public byte[] serializeAvroHttpRequestJSON(AvroHttpRequest request) { DatumWriter writer = new SpecificDatumWriter<>(AvroHttpRequest.class); byte[] data = new byte[0]; ByteArrayOutputStream stream = new ByteArrayOutputStream(); @@ -30,7 +30,7 @@ public class AvroSerealizer { return data; } - public byte[] serealizeAvroHttpRequestBinary(AvroHttpRequest request) { + public byte[] serializeAvroHttpRequestBinary(AvroHttpRequest request) { DatumWriter writer = new SpecificDatumWriter<>(AvroHttpRequest.class); byte[] data = new byte[0]; ByteArrayOutputStream stream = new ByteArrayOutputStream(); diff --git a/apache-libraries/src/test/java/com/baeldung/avro/util/serealization/AvroSerealizerDeSerealizerIntegrationTest.java b/apache-libraries/src/test/java/com/baeldung/avro/util/serialization/AvroSerializerDeSerializerIntegrationTest.java similarity index 75% rename from apache-libraries/src/test/java/com/baeldung/avro/util/serealization/AvroSerealizerDeSerealizerIntegrationTest.java rename to apache-libraries/src/test/java/com/baeldung/avro/util/serialization/AvroSerializerDeSerializerIntegrationTest.java index 3d413e1939..964eeb6d87 100644 --- a/apache-libraries/src/test/java/com/baeldung/avro/util/serealization/AvroSerealizerDeSerealizerIntegrationTest.java +++ b/apache-libraries/src/test/java/com/baeldung/avro/util/serialization/AvroSerializerDeSerializerIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.avro.util.serealization; +package com.baeldung.avro.util.serialization; import com.baeldung.avro.util.model.Active; import com.baeldung.avro.util.model.AvroHttpRequest; @@ -13,16 +13,16 @@ import java.util.Objects; import static org.junit.Assert.*; -public class AvroSerealizerDeSerealizerIntegrationTest { +public class AvroSerializerDeSerializerIntegrationTest { - AvroSerealizer serealizer; - AvroDeSerealizer deSerealizer; + AvroSerializer serializer; + AvroDeSerializer deserializer; AvroHttpRequest request; @Before public void setUp() throws Exception { - serealizer = new AvroSerealizer(); - deSerealizer = new AvroDeSerealizer(); + serializer = new AvroSerializer(); + deserializer = new AvroDeSerializer(); ClientIdentifier clientIdentifier = ClientIdentifier.newBuilder() .setHostName("localhost") @@ -49,22 +49,22 @@ public class AvroSerealizerDeSerealizerIntegrationTest { @Test public void WhenSerializedUsingJSONEncoder_thenObjectGetsSerialized() { - byte[] data = serealizer.serealizeAvroHttpRequestJSON(request); + byte[] data = serializer.serializeAvroHttpRequestJSON(request); assertTrue(Objects.nonNull(data)); assertTrue(data.length > 0); } @Test public void WhenSerializedUsingBinaryEncoder_thenObjectGetsSerialized() { - byte[] data = serealizer.serealizeAvroHttpRequestBinary(request); + byte[] data = serializer.serializeAvroHttpRequestBinary(request); assertTrue(Objects.nonNull(data)); assertTrue(data.length > 0); } @Test public void WhenDeserializeUsingJSONDecoder_thenActualAndExpectedObjectsAreEqual() { - byte[] data = serealizer.serealizeAvroHttpRequestJSON(request); - AvroHttpRequest actualRequest = deSerealizer.deSerealizeAvroHttpRequestJSON(data); + byte[] data = serializer.serializeAvroHttpRequestJSON(request); + AvroHttpRequest actualRequest = deserializer.deSerializeAvroHttpRequestJSON(data); assertEquals(actualRequest, request); assertTrue(actualRequest.getRequestTime() .equals(request.getRequestTime())); @@ -72,12 +72,12 @@ public class AvroSerealizerDeSerealizerIntegrationTest { @Test public void WhenDeserializeUsingBinaryecoder_thenActualAndExpectedObjectsAreEqual() { - byte[] data = serealizer.serealizeAvroHttpRequestBinary(request); - AvroHttpRequest actualRequest = deSerealizer.deSerealizeAvroHttpRequestBinary(data); + byte[] data = serializer.serializeAvroHttpRequestBinary(request); + AvroHttpRequest actualRequest = deserializer.deSerializeAvroHttpRequestBinary(data); assertEquals(actualRequest, request); assertTrue(actualRequest.getRequestTime() .equals(request.getRequestTime())); } - + } From de6d2bc25cabd418b944cf7498d8dcffe796253b Mon Sep 17 00:00:00 2001 From: alemoles Date: Wed, 18 Jan 2023 09:48:57 -0300 Subject: [PATCH 288/592] BAEL-5924 Java 8 Stream with Batch Processing Support (#13203) --- core-java-modules/core-java-streams-4/pom.xml | 36 +++++ .../processing/CustomBatchIterator.java | 47 ++++++ .../processing/StreamProcessingUnitTest.java | 141 ++++++++++++++++++ .../StreamProcessingWithVavrUnitTest.java | 30 ++++ 4 files changed, 254 insertions(+) create mode 100644 core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/processing/CustomBatchIterator.java create mode 100644 core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/processing/StreamProcessingUnitTest.java create mode 100644 core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/processing/vavr/StreamProcessingWithVavrUnitTest.java diff --git a/core-java-modules/core-java-streams-4/pom.xml b/core-java-modules/core-java-streams-4/pom.xml index ed4603796d..46c0f3f7e1 100644 --- a/core-java-modules/core-java-streams-4/pom.xml +++ b/core-java-modules/core-java-streams-4/pom.xml @@ -59,6 +59,36 @@ 3.12.0 test + + io.reactivex.rxjava3 + rxjava + ${rx.java3.version} + + + io.vavr + vavr + ${io.varv.version} + + + io.projectreactor + reactor-core + ${io.reactor3.version} + + + org.apache.commons + commons-collections4 + ${apache.commons.collection4.version} + + + com.google.guava + guava + ${google.guava.version} + + + com.oath.cyclops + cyclops + ${cyclops.version} + @@ -90,6 +120,12 @@ 12 1.2.5 2.2.2 + 3.1.5 + 1.0.0-alpha-4 + 3.5.1 + 4.4 + 31.1-jre + 10.4.1 \ No newline at end of file diff --git a/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/processing/CustomBatchIterator.java b/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/processing/CustomBatchIterator.java new file mode 100644 index 0000000000..b5407b7283 --- /dev/null +++ b/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/processing/CustomBatchIterator.java @@ -0,0 +1,47 @@ +package com.baeldung.streams.processing; + +import static java.util.Spliterator.ORDERED; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Spliterators; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +public class CustomBatchIterator implements Iterator> { + private final int batchSize; + private List currentBatch; + private final Iterator iterator; + + public CustomBatchIterator(Iterator sourceIterator, int batchSize) { + this.batchSize = batchSize; + this.iterator = sourceIterator; + } + + @Override + public List next() { + return currentBatch; + } + + @Override + public boolean hasNext() { + prepareNextBatch(); + return currentBatch != null && !currentBatch.isEmpty(); + } + + public static Stream> batchStreamOf(Stream stream, int batchSize) { + return stream(new CustomBatchIterator<>(stream.iterator(), batchSize)); + } + + private static Stream stream(Iterator iterator) { + return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, ORDERED), false); + } + + private void prepareNextBatch() { + currentBatch = new ArrayList<>(batchSize); + while (iterator.hasNext() && currentBatch.size() < batchSize) { + currentBatch.add(iterator.next()); + } + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/processing/StreamProcessingUnitTest.java b/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/processing/StreamProcessingUnitTest.java new file mode 100644 index 0000000000..f8f88387d5 --- /dev/null +++ b/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/processing/StreamProcessingUnitTest.java @@ -0,0 +1,141 @@ +package com.baeldung.streams.processing; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import org.apache.commons.collections4.ListUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.google.common.collect.Iterators; + +import cyclops.data.LazySeq; +import cyclops.reactive.ReactiveSeq; +import io.reactivex.rxjava3.core.Observable; +import reactor.core.publisher.Flux; + +public class StreamProcessingUnitTest { + public final int BATCH_SIZE = 10; + + private final List firstBatch = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); + private final List secondBatch = List.of(10, 11, 12, 13, 14, 15, 16, 17, 18, 19); + private final List thirdBatch = List.of(20, 21, 22, 23, 24, 25, 26, 27, 28, 29); + private final List fourthBatch = List.of(30, 31, 32, 33); + + public Stream data; + + @BeforeEach + public void setUp() { + data = IntStream.range(0, 34) + .boxed(); + } + + @Test + public void givenAStreamOfData_whenIsProcessingInBatchUsingSpliterator_thenFourBatchesAreObtained() { + Collection> result = new ArrayList<>(); + CustomBatchIterator.batchStreamOf(data, BATCH_SIZE) + .forEach(result::add); + assertTrue(result.contains(firstBatch)); + assertTrue(result.contains(secondBatch)); + assertTrue(result.contains(thirdBatch)); + assertTrue(result.contains(fourthBatch)); + } + + @Test + public void givenAStreamOfData_whenIsProcessingInBatchUsingCollectionAPI_thenFourBatchesAreObtained() { + Collection> result = data.collect(Collectors.groupingBy(it -> it / BATCH_SIZE)) + .values(); + assertTrue(result.contains(firstBatch)); + assertTrue(result.contains(secondBatch)); + assertTrue(result.contains(thirdBatch)); + assertTrue(result.contains(fourthBatch)); + } + + @Test + public void givenAStreamOfData_whenIsProcessingInBatchParallelUsingCollectionAPI_thenFourBatchesAreObtained() { + Collection> result = data.parallel() + .collect(Collectors.groupingBy(it -> it / BATCH_SIZE)) + .values(); + assertTrue(result.contains(firstBatch)); + assertTrue(result.contains(secondBatch)); + assertTrue(result.contains(thirdBatch)); + assertTrue(result.contains(fourthBatch)); + } + + @Test + public void givenAStreamOfData_whenIsProcessingInBatchUsingRxJavaV3_thenFourBatchesAreObtained() { + // RxJava v3 + Collection> result = new ArrayList<>(); + Observable.fromStream(data) + .buffer(BATCH_SIZE) + .subscribe(result::add); + assertTrue(result.contains(firstBatch)); + assertTrue(result.contains(secondBatch)); + assertTrue(result.contains(thirdBatch)); + assertTrue(result.contains(fourthBatch)); + } + + @Test + public void givenAStreamOfData_whenIsProcessingInBatchUsingReactor_thenFourBatchesAreObtained() { + Collection> result = new ArrayList<>(); + Flux.fromStream(data) + .buffer(BATCH_SIZE) + .subscribe(result::add); + assertTrue(result.contains(firstBatch)); + assertTrue(result.contains(secondBatch)); + assertTrue(result.contains(thirdBatch)); + assertTrue(result.contains(fourthBatch)); + } + + @Test + public void givenAStreamOfData_whenIsProcessingInBatchUsingApacheCommon_thenFourBatchesAreObtained() { + Collection> result = new ArrayList<>(ListUtils.partition(data.collect(Collectors.toList()), BATCH_SIZE)); + assertTrue(result.contains(firstBatch)); + assertTrue(result.contains(secondBatch)); + assertTrue(result.contains(thirdBatch)); + assertTrue(result.contains(fourthBatch)); + } + + @Test + public void givenAStreamOfData_whenIsProcessingInBatchUsingGuava_thenFourBatchesAreObtained() { + Collection> result = new ArrayList<>(); + Iterators.partition(data.iterator(), BATCH_SIZE) + .forEachRemaining(result::add); + assertTrue(result.contains(firstBatch)); + assertTrue(result.contains(secondBatch)); + assertTrue(result.contains(thirdBatch)); + assertTrue(result.contains(fourthBatch)); + } + + @Test + public void givenAStreamOfData_whenIsProcessingInBatchUsingCyclops_thenFourBatchesAreObtained() { + Collection> result = new ArrayList<>(); + ReactiveSeq.fromStream(data) + .grouped(BATCH_SIZE) + .toList() + .forEach(value -> result.add(value.collect(Collectors.toList()))); + assertTrue(result.contains(firstBatch)); + assertTrue(result.contains(secondBatch)); + assertTrue(result.contains(thirdBatch)); + assertTrue(result.contains(fourthBatch)); + } + + @Test + public void givenAStreamOfData_whenIsProcessingInBatchUsingCyclopsLazy_thenFourBatchesAreObtained() { + Collection> result = new ArrayList<>(); + LazySeq.fromStream(data) + .grouped(BATCH_SIZE) + .toList() + .forEach(value -> result.add(value.collect(Collectors.toList()))); + assertTrue(result.contains(firstBatch)); + assertTrue(result.contains(secondBatch)); + assertTrue(result.contains(thirdBatch)); + assertTrue(result.contains(fourthBatch)); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/processing/vavr/StreamProcessingWithVavrUnitTest.java b/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/processing/vavr/StreamProcessingWithVavrUnitTest.java new file mode 100644 index 0000000000..859b059889 --- /dev/null +++ b/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/processing/vavr/StreamProcessingWithVavrUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.streams.processing.vavr; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +import com.baeldung.streams.processing.StreamProcessingUnitTest; + +import io.vavr.collection.List; +import io.vavr.collection.Stream; + +public class StreamProcessingWithVavrUnitTest extends StreamProcessingUnitTest { + + private final List firstBatch = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); + private final List secondBatch = List.of(10, 11, 12, 13, 14, 15, 16, 17, 18, 19); + private final List thirdBatch = List.of(20, 21, 22, 23, 24, 25, 26, 27, 28, 29); + private final List fourthBatch = List.of(30, 31, 32, 33); + + @Test + public void givenAStreamOfData_whenIsProcessingInBatchUsingVavr_thenFourBatchesAreObtained() { + List> result = Stream.ofAll(data) + .toList() + .grouped(BATCH_SIZE) + .toList(); + assertTrue(result.contains(firstBatch)); + assertTrue(result.contains(secondBatch)); + assertTrue(result.contains(thirdBatch)); + assertTrue(result.contains(fourthBatch)); + } +} From eef1e050177ef079c7630ac4bd9eb709dbe90726 Mon Sep 17 00:00:00 2001 From: IfThen2 <57305322+IfThen2@users.noreply.github.com> Date: Wed, 18 Jan 2023 05:54:00 -0700 Subject: [PATCH 289/592] code for BAEL-5999 Converting String Object to Java Compilable Code (#13179) * code for BAEL-5999 Converting String Object to Java Compilable Code * move code from core-java-jvm-2 to core-java-jvm-3 fix unit test name fix core-java-jvm-3 test directory structure disable non-working unit tests from core-java-jvm-3 --- .../inmemorycompilation/InMemoryClass.java | 6 ++ .../InMemoryClassLoader.java | 30 ++++++++++ .../InMemoryFileManager.java | 52 +++++++++++++++++ .../inmemorycompilation/JavaClassAsBytes.java | 27 +++++++++ .../JavaSourceFromString.java | 26 +++++++++ .../InMemoryCompilationUnitTest.java | 57 +++++++++++++++++++ .../resource/ClassGetResourceUnitTest.java | 2 + .../ClassLoaderGetResourceUnitTest.java | 2 + 8 files changed, 202 insertions(+) create mode 100644 core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/InMemoryClass.java create mode 100644 core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/InMemoryClassLoader.java create mode 100644 core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/InMemoryFileManager.java create mode 100644 core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/JavaClassAsBytes.java create mode 100644 core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/JavaSourceFromString.java create mode 100644 core-java-modules/core-java-jvm-3/src/test/java/com/baeldung/inmemorycompilation/InMemoryCompilationUnitTest.java rename core-java-modules/core-java-jvm-3/{ => src}/test/java/com/baeldung/resource/ClassGetResourceUnitTest.java (93%) rename core-java-modules/core-java-jvm-3/{ => src}/test/java/com/baeldung/resource/ClassLoaderGetResourceUnitTest.java (93%) diff --git a/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/InMemoryClass.java b/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/InMemoryClass.java new file mode 100644 index 0000000000..c61f28bb79 --- /dev/null +++ b/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/InMemoryClass.java @@ -0,0 +1,6 @@ +package com.baeldung.inmemorycompilation; + +public interface InMemoryClass { + + void runCode(); +} diff --git a/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/InMemoryClassLoader.java b/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/InMemoryClassLoader.java new file mode 100644 index 0000000000..b4951e9d91 --- /dev/null +++ b/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/InMemoryClassLoader.java @@ -0,0 +1,30 @@ +package com.baeldung.inmemorycompilation; + +import static java.util.Objects.requireNonNull; + +import java.util.Map; + +public class InMemoryClassLoader extends ClassLoader { + + private final InMemoryFileManager manager; + + public InMemoryClassLoader(ClassLoader parent, InMemoryFileManager manager) { + super(parent); + this.manager = requireNonNull(manager, "manager must not be null"); + } + + @Override + protected Class findClass(String name) throws ClassNotFoundException { + + Map compiledClasses = manager + .getBytesMap(); + + if (compiledClasses.containsKey(name)) { + byte[] bytes = compiledClasses.get(name) + .getBytes(); + return defineClass(name, bytes, 0, bytes.length); + } else { + throw new ClassNotFoundException(); + } + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/InMemoryFileManager.java b/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/InMemoryFileManager.java new file mode 100644 index 0000000000..34ad78856a --- /dev/null +++ b/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/InMemoryFileManager.java @@ -0,0 +1,52 @@ +package com.baeldung.inmemorycompilation; + +import java.util.Hashtable; +import java.util.Map; +import javax.tools.FileObject; +import javax.tools.ForwardingJavaFileManager; +import javax.tools.JavaFileManager; +import javax.tools.JavaFileObject; +import javax.tools.JavaFileObject.Kind; +import javax.tools.StandardJavaFileManager; + +public class InMemoryFileManager extends ForwardingJavaFileManager { + + private final Map compiledClasses; + private final ClassLoader loader; + + public InMemoryFileManager(StandardJavaFileManager standardManager) { + super(standardManager); + this.compiledClasses = new Hashtable<>(); + this.loader = new InMemoryClassLoader(this.getClass() + .getClassLoader(), + this + ); + } + + /** + * Used to get the class loader for our compiled class. It creates an anonymous class extending + * the SecureClassLoader which uses the byte code created by the compiler and stored in the + * JavaClassObject, and returns the Class for it + * + * @param location where to place or search for file objects. + */ + @Override + public ClassLoader getClassLoader(Location location) { + return loader; + } + + @Override + public JavaFileObject getJavaFileForOutput(Location location, String className, Kind kind, + FileObject sibling) { + + JavaClassAsBytes classAsBytes = new JavaClassAsBytes( + className, kind); + compiledClasses.put(className, classAsBytes); + + return classAsBytes; + } + + public Map getBytesMap() { + return compiledClasses; + } +} diff --git a/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/JavaClassAsBytes.java b/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/JavaClassAsBytes.java new file mode 100644 index 0000000000..b7af9a76ba --- /dev/null +++ b/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/JavaClassAsBytes.java @@ -0,0 +1,27 @@ +package com.baeldung.inmemorycompilation; + +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; +import java.net.URI; +import javax.tools.SimpleJavaFileObject; + +/** + * Represents a Java class file (compiled byte-code) + */ +public class JavaClassAsBytes extends SimpleJavaFileObject { + + protected final ByteArrayOutputStream bos = new ByteArrayOutputStream(); + + public JavaClassAsBytes(String name, Kind kind) { + super(URI.create("string:///" + name.replace('.', '/') + kind.extension), kind); + } + + public byte[] getBytes() { + return bos.toByteArray(); + } + + @Override + public OutputStream openOutputStream() { + return bos; + } +} diff --git a/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/JavaSourceFromString.java b/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/JavaSourceFromString.java new file mode 100644 index 0000000000..eaa6c21b54 --- /dev/null +++ b/core-java-modules/core-java-jvm-3/src/main/java/com/baeldung/inmemorycompilation/JavaSourceFromString.java @@ -0,0 +1,26 @@ +package com.baeldung.inmemorycompilation; + +import static java.util.Objects.requireNonNull; + +import java.net.URI; +import javax.tools.SimpleJavaFileObject; + +/** + * Represents a Java source code file + */ +public class JavaSourceFromString extends SimpleJavaFileObject { + + private final String sourceCode; + + public JavaSourceFromString(String name, String sourceCode) { + super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension), + Kind.SOURCE + ); + this.sourceCode = requireNonNull(sourceCode, "sourceCode must not be null"); + } + + @Override + public CharSequence getCharContent(boolean ignoreEncodingErrors) { + return sourceCode; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-jvm-3/src/test/java/com/baeldung/inmemorycompilation/InMemoryCompilationUnitTest.java b/core-java-modules/core-java-jvm-3/src/test/java/com/baeldung/inmemorycompilation/InMemoryCompilationUnitTest.java new file mode 100644 index 0000000000..410bdca866 --- /dev/null +++ b/core-java-modules/core-java-jvm-3/src/test/java/com/baeldung/inmemorycompilation/InMemoryCompilationUnitTest.java @@ -0,0 +1,57 @@ +package com.baeldung.inmemorycompilation; + +import java.util.Collections; +import java.util.List; + +import javax.tools.DiagnosticCollector; +import javax.tools.JavaCompiler; +import javax.tools.JavaFileObject; +import javax.tools.ToolProvider; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class InMemoryCompilationUnitTest { + + private static final Logger LOGGER = LoggerFactory.getLogger(InMemoryCompilationUnitTest.class); + + final static String QUALIFIED_CLASS_NAME = "com.baeldung.inmemorycompilation.TestClass"; + + final static String SOURCE_CODE = + "package com.baeldung.inmemorycompilation;\n" + + "public class TestClass implements InMemoryClass {\n" + + "@Override\n" + + " public void runCode() {\n" + + " System.out.println(\"code is running...\");\n" + + " }\n" + + "}\n"; + + @Test + public void whenStringIsCompiled_ThenCodeShouldExecute() throws ClassNotFoundException, InstantiationException, IllegalAccessException { + + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + DiagnosticCollector diagnostics = new DiagnosticCollector<>(); + InMemoryFileManager manager = new InMemoryFileManager(compiler.getStandardFileManager(null, null, null)); + + List sourceFiles = Collections.singletonList(new JavaSourceFromString(QUALIFIED_CLASS_NAME, SOURCE_CODE)); + + JavaCompiler.CompilationTask task = compiler.getTask(null, manager, diagnostics, null, null, sourceFiles); + + boolean result = task.call(); + + if (result) { + diagnostics.getDiagnostics() + .forEach(d -> LOGGER.error(String.valueOf(d))); + } else { + ClassLoader classLoader = manager.getClassLoader(null); + Class clazz = classLoader.loadClass(QUALIFIED_CLASS_NAME); + InMemoryClass instanceOfClass = (InMemoryClass) clazz.newInstance(); + + Assertions.assertInstanceOf(InMemoryClass.class, instanceOfClass); + + instanceOfClass.runCode(); + } + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-jvm-3/test/java/com/baeldung/resource/ClassGetResourceUnitTest.java b/core-java-modules/core-java-jvm-3/src/test/java/com/baeldung/resource/ClassGetResourceUnitTest.java similarity index 93% rename from core-java-modules/core-java-jvm-3/test/java/com/baeldung/resource/ClassGetResourceUnitTest.java rename to core-java-modules/core-java-jvm-3/src/test/java/com/baeldung/resource/ClassGetResourceUnitTest.java index fb0c88f4bb..2fe512384a 100644 --- a/core-java-modules/core-java-jvm-3/test/java/com/baeldung/resource/ClassGetResourceUnitTest.java +++ b/core-java-modules/core-java-jvm-3/src/test/java/com/baeldung/resource/ClassGetResourceUnitTest.java @@ -1,10 +1,12 @@ package com.baeldung.resource; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import java.net.URL; +@Disabled class ClassGetResourceUnitTest { @Test diff --git a/core-java-modules/core-java-jvm-3/test/java/com/baeldung/resource/ClassLoaderGetResourceUnitTest.java b/core-java-modules/core-java-jvm-3/src/test/java/com/baeldung/resource/ClassLoaderGetResourceUnitTest.java similarity index 93% rename from core-java-modules/core-java-jvm-3/test/java/com/baeldung/resource/ClassLoaderGetResourceUnitTest.java rename to core-java-modules/core-java-jvm-3/src/test/java/com/baeldung/resource/ClassLoaderGetResourceUnitTest.java index 54025c5404..d2d0600165 100644 --- a/core-java-modules/core-java-jvm-3/test/java/com/baeldung/resource/ClassLoaderGetResourceUnitTest.java +++ b/core-java-modules/core-java-jvm-3/src/test/java/com/baeldung/resource/ClassLoaderGetResourceUnitTest.java @@ -1,10 +1,12 @@ package com.baeldung.resource; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import java.net.URL; +@Disabled class ClassLoaderGetResourceUnitTest { @Test From c333a3f3596c7675ff8a732a83412fc839d47416 Mon Sep 17 00:00:00 2001 From: Alex Golub Date: Wed, 18 Jan 2023 22:04:08 +0200 Subject: [PATCH 290/592] Data Type in Groovy: align with `Spock` testing framework --- .../baeldung/determinedatatype/Person.groovy | 23 ++-- .../determinedatatype/PersonTest.groovy | 104 ++++++++++-------- 2 files changed, 72 insertions(+), 55 deletions(-) diff --git a/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/determinedatatype/Person.groovy b/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/determinedatatype/Person.groovy index 3ac88b7952..40c935ce08 100644 --- a/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/determinedatatype/Person.groovy +++ b/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/determinedatatype/Person.groovy @@ -1,14 +1,19 @@ package com.baeldung.determinedatatype class Person { - - private int ageAsInt - private Double ageAsDouble - private String ageAsString - + + int ageAsInt + Double ageAsDouble + String ageAsString + Person() {} - Person(int ageAsInt) { this.ageAsInt = ageAsInt} - Person(Double ageAsDouble) { this.ageAsDouble = ageAsDouble} - Person(String ageAsString) { this.ageAsString = ageAsString} + + Person(int ageAsInt) { this.ageAsInt = ageAsInt } + + Person(Double ageAsDouble) { this.ageAsDouble = ageAsDouble } + + Person(String ageAsString) { this.ageAsString = ageAsString } +} + +class Student extends Person { } -class Student extends Person {} diff --git a/core-groovy-modules/core-groovy-2/src/test/groovy/com/baeldung/determinedatatype/PersonTest.groovy b/core-groovy-modules/core-groovy-2/src/test/groovy/com/baeldung/determinedatatype/PersonTest.groovy index 4c6589f207..414ba52fc5 100644 --- a/core-groovy-modules/core-groovy-2/src/test/groovy/com/baeldung/determinedatatype/PersonTest.groovy +++ b/core-groovy-modules/core-groovy-2/src/test/groovy/com/baeldung/determinedatatype/PersonTest.groovy @@ -1,56 +1,68 @@ package com.baeldung.determinedatatype -import org.junit.Assert -import org.junit.Test -import com.baeldung.determinedatatype.Person +import spock.lang.Specification -public class PersonTest { - - @Test - public void givenWhenParameterTypeIsInteger_thenReturnTrue() { +class PersonTest extends Specification { + + def "givenWhenParameterTypeIsIntegerThenReturnTrue"() { + given: Person personObj = new Person(10) - Assert.assertTrue(personObj.ageAsInt instanceof Integer) - } - - @Test - public void givenWhenParameterTypeIsDouble_thenReturnTrue() { - Person personObj = new Person(10.0) - Assert.assertTrue((personObj.ageAsDouble).getClass() == Double) - } - - @Test - public void givenWhenParameterTypeIsString_thenReturnTrue() { - Person personObj = new Person("10 years") - Assert.assertTrue(personObj.ageAsString.class == String) - } - - @Test - public void givenClassName_WhenParameterIsInteger_thenReturnTrue() { - Assert.assertTrue(Person.class.getDeclaredField('ageAsInt').type == int.class) - } - - @Test - public void givenWhenObjectIsInstanceOfType_thenReturnTrue() { - Person personObj = new Person() - Assert.assertTrue(personObj instanceof Person) + + expect: + personObj.ageAsInt.class == Integer } - @Test - public void givenWhenInstanceIsOfSubtype_thenReturnTrue() { + def "givenWhenParameterTypeIsDouble_thenReturnTrue"() { + given: + Person personObj = new Person(10.0) + + expect: + personObj.ageAsDouble.class == Double + } + + def "givenWhenParameterTypeIsString_thenReturnTrue"() { + given: + Person personObj = new Person("10 years") + + expect: + personObj.ageAsString.class == String + } + + def "givenClassName_WhenParameterIsInteger_thenReturnTrue"() { + expect: + Person.class.getDeclaredField('ageAsInt').type == int.class + } + + def "givenWhenObjectIsInstanceOfType_thenReturnTrue"() { + given: + Person personObj = new Person() + + expect: + personObj.class == Person + } + + def "givenWhenInstanceIsOfSubtype_thenReturnTrue"() { + given: Student studentObj = new Student() - Assert.assertTrue(studentObj in Person) + + expect: + studentObj.class.superclass == Person } - - @Test - public void givenGroovyList_WhenFindClassName_thenReturnTrue() { - def ageList = ['ageAsString','ageAsDouble', 10] - Assert.assertTrue(ageList.class == ArrayList) - Assert.assertTrue(ageList.getClass() == ArrayList) + + def "givenGroovyList_WhenFindClassName_thenReturnTrue"() { + given: + def ageList = ['ageAsString', 'ageAsDouble', 10] + + expect: + ageList.class == ArrayList + ageList.getClass() == ArrayList } - - @Test - public void givenGrooyMap_WhenFindClassName_thenReturnTrue() { - def ageMap = [ageAsString: '10 years', ageAsDouble: 10.0] - Assert.assertFalse(ageMap.class == LinkedHashMap) + + def "givenGroovyMap_WhenFindClassName_thenReturnTrue"() { + given: + def ageMap = [ageAsString: '10 years', ageAsDouble: 10.0] + + expect: + ageMap.getClass() == LinkedHashMap } -} \ No newline at end of file +} From b81ae5b701fcd85c9697da684b0da30e7e008075 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 19 Jan 2023 07:05:30 +0800 Subject: [PATCH 291/592] Update README.md [skip ci] --- persistence-modules/flyway/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/flyway/README.md b/persistence-modules/flyway/README.md index bd5f9bbe03..5fbbc7df9c 100644 --- a/persistence-modules/flyway/README.md +++ b/persistence-modules/flyway/README.md @@ -2,3 +2,4 @@ - [Database Migrations with Flyway](http://www.baeldung.com/database-migrations-with-flyway) - [A Guide to Flyway Callbacks](http://www.baeldung.com/flyway-callbacks) - [Rolling Back Migrations with Flyway](https://www.baeldung.com/flyway-roll-back) +- [Flyway Out of Order Migrations](https://www.baeldung.com/flyway-migrations) From 66441d4f739ad33d40c733d18ba9db0a56873754 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 19 Jan 2023 07:09:56 +0800 Subject: [PATCH 292/592] Create README.md [skip ci] --- logging-modules/tinylog2/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 logging-modules/tinylog2/README.md diff --git a/logging-modules/tinylog2/README.md b/logging-modules/tinylog2/README.md new file mode 100644 index 0000000000..880ff8e65f --- /dev/null +++ b/logging-modules/tinylog2/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Lightweight Logging With tinylog 2](https://www.baeldung.com/java-logging-tinylog-guide) From 289edb5e48ff97d9884c70b6d42f83309ffda8e9 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 19 Jan 2023 07:16:25 +0800 Subject: [PATCH 293/592] Update README.md [skip ci] --- microservices-modules/rest-express/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/microservices-modules/rest-express/README.md b/microservices-modules/rest-express/README.md index 0fdff99fb7..a3340b238d 100644 --- a/microservices-modules/rest-express/README.md +++ b/microservices-modules/rest-express/README.md @@ -2,4 +2,5 @@ This module contains articles about RestExpress. -### Relevant articles \ No newline at end of file +### Relevant articles +- [RESTful Microservices With RestExpress](https://www.baeldung.com/java-restexpress-guide) From 1af5982423da8321233c5dd8564e0c65f5bde34d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 19 Jan 2023 07:20:47 +0800 Subject: [PATCH 294/592] Update README.md [skip ci] --- spring-kafka-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-kafka-2/README.md b/spring-kafka-2/README.md index 76c090342d..1f5e015f9e 100644 --- a/spring-kafka-2/README.md +++ b/spring-kafka-2/README.md @@ -4,4 +4,4 @@ This module contains articles about Spring with Kafka ### Relevant articles -- [Implementing Retry In Kafka Consumer] +- [Implementing Retry In Kafka Consumer](https://www.baeldung.com/spring-retry-kafka-consumer) From 063be454404715f7608dc3fd774839d3a383474d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 19 Jan 2023 07:25:57 +0800 Subject: [PATCH 295/592] Update README.md [skip ci] --- jackson-modules/jackson-annotations/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jackson-modules/jackson-annotations/README.md b/jackson-modules/jackson-annotations/README.md index 3b6cd6f20b..8b405ec778 100644 --- a/jackson-modules/jackson-annotations/README.md +++ b/jackson-modules/jackson-annotations/README.md @@ -8,3 +8,4 @@ This module contains articles about Jackson annotations. - [Jackson – Bidirectional Relationships](https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion) - [Jackson JSON Views](https://www.baeldung.com/jackson-json-view-annotation) - [Deduction-Based Polymorphism in Jackson 2.12](https://www.baeldung.com/jackson-deduction-based-polymorphism) +- [@JsonIgnore vs @Transient](https://www.baeldung.com/java-jsonignore-vs-transient) From f08815a84f13b0ccb21e28e3963bd70e80b4611b Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 19 Jan 2023 07:30:26 +0800 Subject: [PATCH 296/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-array-list/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-array-list/README.md b/core-java-modules/core-java-collections-array-list/README.md index d24f7492bb..094ae33c40 100644 --- a/core-java-modules/core-java-collections-array-list/README.md +++ b/core-java-modules/core-java-collections-array-list/README.md @@ -9,3 +9,4 @@ This module contains articles about the Java ArrayList collection - [Multi Dimensional ArrayList in Java](https://www.baeldung.com/java-multi-dimensional-arraylist) - [Removing an Element From an ArrayList](https://www.baeldung.com/java-arraylist-remove-element) - [The Capacity of an ArrayList vs the Size of an Array in Java](https://www.baeldung.com/java-list-capacity-array-size) +- [Case-Insensitive Searching in ArrayList](https://www.baeldung.com/java-arraylist-case-insensitive-search) From 00e455acbb49f034a8a786cf57c63b8da71c3de3 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 19 Jan 2023 07:37:32 +0800 Subject: [PATCH 297/592] Update README.md [skip ci] --- spring-web-modules/spring-web-url/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-web-modules/spring-web-url/README.md b/spring-web-modules/spring-web-url/README.md index 41b479337b..79a89f4386 100644 --- a/spring-web-modules/spring-web-url/README.md +++ b/spring-web-modules/spring-web-url/README.md @@ -6,3 +6,4 @@ This module contains articles about Spring MVC - [Using a Slash Character in Spring URLs](https://www.baeldung.com/spring-slash-character-in-url) - [Excluding URLs for a Filter in a Spring Web Application](https://www.baeldung.com/spring-exclude-filter) - [Handling URL Encoded Form Data in Spring REST](https://www.baeldung.com/spring-url-encoded-form-data) +- [Spring MVC – Mapping the Root URL to a Page](https://www.baeldung.com/spring-mvc-map-root-url) From 0b2b705298afb98c027a7404e3a9fbf2066254a1 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 19 Jan 2023 07:41:04 +0800 Subject: [PATCH 298/592] Update README.md [skip ci] --- jenkins-modules/jenkins-jobs/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jenkins-modules/jenkins-jobs/README.md b/jenkins-modules/jenkins-jobs/README.md index 7b33dc6d99..d29a25244f 100644 --- a/jenkins-modules/jenkins-jobs/README.md +++ b/jenkins-modules/jenkins-jobs/README.md @@ -2,3 +2,4 @@ - [Trigger Another Job from a Jenkins Pipeline](https://www.baeldung.com/ops/jenkins-pipeline-trigger-new-job) - [Fixing the “No Such DSL method” Error in Jenkins Pipeline](https://www.baeldung.com/ops/jenkins-pipeline-no-such-dsl-method-error) - [Jenkins Pipeline – Change to Another Folder](https://www.baeldung.com/ops/jenkins-pipeline-change-to-another-folder) +- [How to Stop a Zombie Job on Jenkins Without Restarting the Server?](https://www.baeldung.com/ops/stop-zombie-job-on-jenkins-without-restarting-the-server) From 00913e061a7c84bf816dc6dcb47538d63dae3170 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 19 Jan 2023 07:44:33 +0800 Subject: [PATCH 299/592] Update README.md [skip ci] --- core-java-modules/core-java-8/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-8/README.md b/core-java-modules/core-java-8/README.md index ff4ceaf6db..6061f3318d 100644 --- a/core-java-modules/core-java-8/README.md +++ b/core-java-modules/core-java-8/README.md @@ -11,4 +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) - [[More -->]](/core-java-modules/core-java-8-2) From fd1c28657032e30d25840730519a238fe24e52f3 Mon Sep 17 00:00:00 2001 From: Bhaskar Ghosh Dastidar Date: Thu, 19 Jan 2023 08:23:05 +0530 Subject: [PATCH 300/592] [JAVA-5730] convert list of objects to list of strings (#13166) * [JAVA-5730] convert list of objects to list of strings * [JAVA-5730] added new unit tests with null and non-null lists. modified pom.xml with java version to 16 * [JAVA-5730] simplified User class and formatted the codebase * [JAVA-5730] added module in jdk-9 and above profile * [JAVA-5730] removed arraylist module from other profiles of core-java pom * [JAVA-5730] java util opened for reflection surefire plugin Co-authored-by: Bhaskar --- .../core-java-collections-array-list/pom.xml | 33 +++++++ .../listofobjectstolistofstring/Node.java | 17 ++++ .../listofobjectstolistofstring/User.java | 14 +++ ...ConvertObjectListToStringListUnitTest.java | 92 +++++++++++++++++++ core-java-modules/pom.xml | 1 - pom.xml | 1 + 6 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/listofobjectstolistofstring/Node.java create mode 100644 core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/listofobjectstolistofstring/User.java create mode 100644 core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/listofobjectstolistofstring/ConvertObjectListToStringListUnitTest.java diff --git a/core-java-modules/core-java-collections-array-list/pom.xml b/core-java-modules/core-java-collections-array-list/pom.xml index 6b040739e8..e3a115854c 100644 --- a/core-java-modules/core-java-collections-array-list/pom.xml +++ b/core-java-modules/core-java-collections-array-list/pom.xml @@ -5,6 +5,33 @@ 4.0.0 core-java-collections-array-list 0.1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven-compiler-plugin.source} + ${maven-compiler-plugin.target} + + + + org.apache.maven.plugins + maven-surefire-plugin + ${surefire.plugin.version} + + + --add-opens java.base/java.util=ALL-UNNAMED + + + + + + + 16 + 16 + 3.0.0-M3 + core-java-collections-array-list jar @@ -20,6 +47,12 @@ commons-collections4 ${commons-collections4.version} + + com.google.guava + guava + 31.1-jre + test + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/listofobjectstolistofstring/Node.java b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/listofobjectstolistofstring/Node.java new file mode 100644 index 0000000000..3e2c5693de --- /dev/null +++ b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/listofobjectstolistofstring/Node.java @@ -0,0 +1,17 @@ +package com.baeldung.listofobjectstolistofstring; + +public class Node { + + private final int x; + private final int y; + + public Node(int x, int y) { + this.x = x; + this.y = y; + } + + @Override + public String toString() { + return "Node (" + "x=" + x + ", y=" + y + ')'; + } +} diff --git a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/listofobjectstolistofstring/User.java b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/listofobjectstolistofstring/User.java new file mode 100644 index 0000000000..eb9298bce0 --- /dev/null +++ b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/listofobjectstolistofstring/User.java @@ -0,0 +1,14 @@ +package com.baeldung.listofobjectstolistofstring; + +public class User { + private final String fullName; + + public User(String fullName) { + this.fullName = fullName; + } + + @Override + public String toString() { + return "User (" + "full name='" + fullName + ')'; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/listofobjectstolistofstring/ConvertObjectListToStringListUnitTest.java b/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/listofobjectstolistofstring/ConvertObjectListToStringListUnitTest.java new file mode 100644 index 0000000000..1d393a2945 --- /dev/null +++ b/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/listofobjectstolistofstring/ConvertObjectListToStringListUnitTest.java @@ -0,0 +1,92 @@ +package com.baeldung.listofobjectstolistofstring; + +import com.google.common.collect.Lists; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class ConvertObjectListToStringListUnitTest { + + @Test + public void givenObjectList_whenForEachUsedToConvert_thenReturnSuccess() { + List outputList = new ArrayList<>(objectListWithNull().size()); + for (Object obj : objectListWithNull()) { + outputList.add(Objects.toString(obj, null)); + } + Assert.assertEquals(expectedStringListWithNull(), outputList); + } + + @Test + public void givenObjectList_whenUsingStreamsToConvert_thenReturnSuccess() { + List outputList; + outputList = objectListWithNull().stream() + .map((obj) -> Objects.toString(obj, null)) + .collect(Collectors.toList()); + Assert.assertEquals(expectedStringListWithNull(), outputList); + + } + + @Test + public void givenObjectList_whenUsingStreamsUnmodifiableListToConvert_thenReturnSuccess() { + List outputList; + outputList = objectListWithNull().stream() + .filter(Objects::nonNull) + .map((obj) -> Objects.toString(obj, null)) + .collect(Collectors.toUnmodifiableList()); + Assert.assertEquals(expectedStringListWithoutNull(), outputList); + + } + + @Test + public void givenObjectList_whenUsingGuavaTransform_thenReturnSuccess() { + List outputList; + outputList = Lists.transform(objectListWithNull(), obj -> Objects.toString(obj, null)); + Assert.assertEquals(expectedStringListWithNull(), outputList); + } + + @Test + public void givenObjectListWithNoNull_whenUsingToList_thenReturnSuccess() { + List outputList; + outputList = objectListWithoutNull().stream() + .map((obj) -> Objects.toString(obj, null)) + .toList(); + Assert.assertEquals(expectedStringListWithoutNull(), outputList); + } + + private List expectedStringListWithNull() { + List listOfStrings = new ArrayList<>(); + listOfStrings.add("1"); + listOfStrings.add("true"); + listOfStrings.add("hello"); + listOfStrings.add(Double.toString(273773.98)); + listOfStrings.add(null); + listOfStrings.add(new Node(2, 4).toString()); + listOfStrings.add(new User("John Doe").toString()); + return listOfStrings; + } + + private List objectListWithNull() { + List listOfStrings = new ArrayList<>(); + listOfStrings.add(1); + listOfStrings.add(true); + listOfStrings.add("hello"); + listOfStrings.add(Double.valueOf(273773.98)); + listOfStrings.add(null); + listOfStrings.add(new Node(2, 4)); + listOfStrings.add(new User("John Doe")); + return listOfStrings; + } + + private List expectedStringListWithoutNull() { + return List.of("1", "true", "hello", Double.toString(273773.98), new Node(2, 4).toString(), new User("John Doe").toString()); + } + + private List objectListWithoutNull() { + return List.of(1, true, "hello", Double.valueOf(273773.98), new Node(2, 4), new User("John Doe")); + } +} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index cc137d08b6..bbbca6adf5 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -31,7 +31,6 @@ core-java-collections-2 core-java-collections-3 core-java-collections-4 - core-java-collections-array-list core-java-collections-conversions core-java-collections-conversions-2 core-java-collections-set-2 diff --git a/pom.xml b/pom.xml index c4e5c25d9d..0b19c6eee6 100644 --- a/pom.xml +++ b/pom.xml @@ -1133,6 +1133,7 @@ core-java-modules/core-java-collections-set core-java-modules/core-java-collections-list-4 + core-java-modules/core-java-collections-array-list core-java-modules/core-java-collections-maps-4 core-java-modules/core-java-collections-maps-5 core-java-modules/core-java-concurrency-simple From caa663239f09d534e08686a2933525833ce8524f Mon Sep 17 00:00:00 2001 From: Muhammad Asif Date: Thu, 19 Jan 2023 10:32:40 +0500 Subject: [PATCH 301/592] muasif80@gmail.com (#13262) * BAEL-6063 * Updated the unit test class name * Fixed the test * Made updates to method names for tests and some refactor of code * Updated the formatting using Baeldung formatter for Java * Removed the space around = and made line continuations 2 spaces --- .../data/persistence/search/Student.java | 75 +++++++++++++ .../search/StudentApplication.java | 16 +++ .../persistence/search/StudentRepository.java | 31 ++++++ .../src/main/resources/application.properties | 1 + .../search/StudentApplicationUnitTest.java | 100 ++++++++++++++++++ 5 files changed, 223 insertions(+) create mode 100644 persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/search/Student.java create mode 100644 persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/search/StudentApplication.java create mode 100644 persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/search/StudentRepository.java create mode 100644 persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/search/StudentApplicationUnitTest.java diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/search/Student.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/search/Student.java new file mode 100644 index 0000000000..1d6eaa3b33 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/search/Student.java @@ -0,0 +1,75 @@ +package com.baeldung.spring.data.persistence.search; + +import java.util.Objects; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Student { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + private String name; + private int score; + + public Student() { + } + + public Student(String name, int score) { + + this.name = name; + this.score = score; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getScore() { + return score; + } + + public void setScore(int score) { + this.score = score; + } + + @Override + public String toString() { + return "Student [id=" + id + ", name=" + name + ", score=" + score + "]"; + } + + @Override + public int hashCode() { + return Objects.hash(id, name, score); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Student other = (Student) obj; + return id == other.id && Objects.equals(name, other.name) && score == other.score; + } + +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/search/StudentApplication.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/search/StudentApplication.java new file mode 100644 index 0000000000..6aa895d067 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/search/StudentApplication.java @@ -0,0 +1,16 @@ +package com.baeldung.spring.data.persistence.search; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class StudentApplication { + + private static final Logger log = LoggerFactory.getLogger(StudentApplication.class); + + public static void main(String[] args) { + SpringApplication.run(StudentApplication.class, args); + } +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/search/StudentRepository.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/search/StudentRepository.java new file mode 100644 index 0000000000..29aade5886 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/search/StudentRepository.java @@ -0,0 +1,31 @@ +package com.baeldung.spring.data.persistence.search; + +import java.util.List; + +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface StudentRepository extends JpaRepository { + + Student findFirstByOrderByScoreDesc(); + + Student findFirstBy(Sort sort); + + Student findFirstByNameLike(String name, Sort sort); + + List findFirst3ByOrderByScoreDesc(); + + List findFirst2ByScoreBetween(int startScore, int endScore, Sort sort); + + Student findTopByOrderByScoreDesc(); + + Student findTopBy(Sort sort); + + Student findTopByNameLike(String name, Sort sort); + + List findTop3ByOrderByScoreDesc(); + + List findTop2ByScoreBetween(int startScore, int endScore, Sort sort); +} diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/resources/application.properties b/persistence-modules/spring-data-jpa-repo-2/src/main/resources/application.properties index 30cc5abbcc..3ca0cc1242 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/resources/application.properties +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/resources/application.properties @@ -3,3 +3,4 @@ spring.datasource.username=sa spring.datasource.password=sa spring.jpa.properties.hibernate.globally_quoted_identifiers=true +logging.level.com.baeldung.spring.data.persistence.search=debug \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/search/StudentApplicationUnitTest.java b/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/search/StudentApplicationUnitTest.java new file mode 100644 index 0000000000..ea16b3597d --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/search/StudentApplicationUnitTest.java @@ -0,0 +1,100 @@ +package com.baeldung.spring.data.persistence.search; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; + +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.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Sort; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class StudentApplicationUnitTest { + + @Autowired + private StudentRepository studentRepo; + private List students; + + @Before + public void fillData() { + students = new ArrayList<>(); + int count = 10; + Random r = new Random(); + List scores = r.ints(0, 101) + .distinct() + .limit(count) + .boxed() + .collect(Collectors.toList()); + + for (int i = 0; i < count; i++) { + Integer score = scores.get(i); + Student s = new Student("Student-" + i, score); + students.add(s); + } + + studentRepo.saveAll(students); + Comparator c = Comparator.comparing(a -> a.getScore()); + c = c.reversed(); + students.sort(c); + } + + @After + public void clearData() { + studentRepo.deleteAll(); + } + + @Test + public void givenStudentScores_whenMoreThanOne_thenFindFirst() { + + Student student = studentRepo.findFirstByOrderByScoreDesc(); + Student s = students.get(0); + assertEquals(student, s); + } + + @Test + public void givenStudentScores_whenMoreThan3_thenFindFirstThree() { + + List firstThree = studentRepo.findFirst3ByOrderByScoreDesc(); + List sList = students.subList(0, 3); + assertArrayEquals(firstThree.toArray(), sList.toArray()); + } + + @Test + public void givenStudentScores_whenNameMatches_thenFindFirstStudent() { + + String matchString = "3"; + Student student = studentRepo.findFirstByNameLike("%" + matchString + "%", Sort.by("score") + .descending()); + Student s = students.stream() + .filter(a -> a.getName() + .contains(matchString)) + .findFirst() + .orElse(null); + assertEquals(student, s); + } + + @Test + public void givenStudentScores_whenBetweenRange_thenFindFirstTwoStudents() { + + List topTwoBetweenRange = studentRepo.findFirst2ByScoreBetween(50, 60, Sort.by("score") + .descending()); + List _students = students.stream() + .filter(a -> a.getScore() >= 50 && a.getScore() <= 60) + .limit(2) + .collect(Collectors.toList()); + assertArrayEquals(_students.toArray(), topTwoBetweenRange.toArray()); + } +} From a844943283f4998e8b991850406e2329256e356d Mon Sep 17 00:00:00 2001 From: etrandafir93 <75391049+etrandafir93@users.noreply.github.com> Date: Thu, 19 Jan 2023 09:59:49 +0100 Subject: [PATCH 302/592] BAEL-6058: fixed formatting for line continuation --- .../HeaderInterceptorIntegrationTest.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/requestheader/HeaderInterceptorIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/requestheader/HeaderInterceptorIntegrationTest.java index 9343a608e4..ee053a4c36 100644 --- a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/requestheader/HeaderInterceptorIntegrationTest.java +++ b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/requestheader/HeaderInterceptorIntegrationTest.java @@ -29,15 +29,15 @@ public class HeaderInterceptorIntegrationTest { @BeforeEach public void setup() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext) - .build(); + .build(); } @Test public void givenARequestWithOperatorHeader_whenWeCallFooEndpoint_thenOperatorIsExtracted() throws Exception { MockHttpServletResponse response = this.mockMvc.perform(get("/foo").header("operator", "John.Doe")) - .andDo(print()) - .andReturn() - .getResponse(); + .andDo(print()) + .andReturn() + .getResponse(); assertThat(response.getContentAsString()).isEqualTo("hello, John.Doe"); } @@ -45,9 +45,9 @@ public class HeaderInterceptorIntegrationTest { @Test public void givenARequestWithOperatorHeader_whenWeCallBarEndpoint_thenOperatorIsExtracted() throws Exception { MockHttpServletResponse response = this.mockMvc.perform(get("/bar").header("operator", "John.Doe")) - .andDo(print()) - .andReturn() - .getResponse(); + .andDo(print()) + .andReturn() + .getResponse(); assertThat(response.getContentAsString()).isEqualTo("hello, John.Doe"); } @@ -55,11 +55,11 @@ public class HeaderInterceptorIntegrationTest { @Test public void givenARequestWithOperatorHeader_whenWeCallBuzzEndpoint_thenOperatorIsIntercepted() throws Exception { MockHttpServletResponse response = this.mockMvc.perform(get("/buzz").header("operator", "John.Doe")) - .andDo(print()) - .andReturn() - .getResponse(); + .andDo(print()) + .andReturn() + .getResponse(); assertThat(response.getContentAsString()).isEqualTo("hello, John.Doe"); } -} \ No newline at end of file +} From a16876b7b94a5941d63e6f8077862e5e183bceb3 Mon Sep 17 00:00:00 2001 From: Cesare Date: Thu, 19 Jan 2023 10:26:10 +0100 Subject: [PATCH 303/592] BAEL-6088 - Ahead of Time Optimizations in Spring 6 --- .../spring-boot-3-native/pom.xml | 24 +++++++++++++++---- spring-native/README.md | 1 + 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/spring-boot-modules/spring-boot-3-native/pom.xml b/spring-boot-modules/spring-boot-3-native/pom.xml index a70cc08755..5382b8413c 100644 --- a/spring-boot-modules/spring-boot-3-native/pom.xml +++ b/spring-boot-modules/spring-boot-3-native/pom.xml @@ -47,12 +47,26 @@ true - - - + + + + + + + - - + + diff --git a/spring-native/README.md b/spring-native/README.md index 0f193252d0..72308cb9d5 100644 --- a/spring-native/README.md +++ b/spring-native/README.md @@ -1,3 +1,4 @@ ## Relevant Articles: - [Introduction to Spring Native](https://www.baeldung.com/spring-native-intro) +- [Ahead of Time Optimizations in Spring 6](https://www.baeldung.com/aot-optimization-spring) \ No newline at end of file From 845ed7690e92bc398bcfdacd0a73e1b3c03a2c70 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Thu, 19 Jan 2023 21:30:18 +0530 Subject: [PATCH 304/592] JAVA-16308 Potential issue in Introduction to Spring Data Elasticsearch article (#13286) * JAVA-16308 Potential issue in Introduction to Spring Data Elasticsearch article * JAVA-16308 Update code as per Review Comments --- .../spring/data/es/config/Config.java | 13 ++++------ .../data/es/ElasticSearchManualTest.java | 12 +++++----- .../data/es/ElasticSearchQueryManualTest.java | 24 +++++++++---------- 3 files changed, 22 insertions(+), 27 deletions(-) diff --git a/persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/config/Config.java b/persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/config/Config.java index 51bbe73e9e..7f6653d7a8 100644 --- a/persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/config/Config.java +++ b/persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/config/Config.java @@ -6,17 +6,17 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.client.ClientConfiguration; import org.springframework.data.elasticsearch.client.RestClients; -import org.springframework.data.elasticsearch.core.ElasticsearchOperations; -import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; +import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; @Configuration @EnableElasticsearchRepositories(basePackages = "com.baeldung.spring.data.es.repository") @ComponentScan(basePackages = { "com.baeldung.spring.data.es.service" }) -public class Config { +public class Config extends AbstractElasticsearchConfiguration { @Bean - RestHighLevelClient client() { + @Override + public RestHighLevelClient elasticsearchClient() { ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo("localhost:9200") .build(); @@ -24,9 +24,4 @@ public class Config { return RestClients.create(clientConfiguration) .rest(); } - - @Bean - public ElasticsearchOperations elasticsearchTemplate() { - return new ElasticsearchRestTemplate(client()); - } } diff --git a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchManualTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchManualTest.java index 412cd04e09..cc38acc41c 100644 --- a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchManualTest.java +++ b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchManualTest.java @@ -22,7 +22,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; -import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.SearchHits; import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; @@ -41,7 +41,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; public class ElasticSearchManualTest { @Autowired - private ElasticsearchRestTemplate elasticsearchTemplate; + private ElasticsearchOperations elasticsearchOperations; @Autowired private ArticleRepository articleRepository; @@ -117,7 +117,7 @@ public class ElasticSearchManualTest { final Query searchQuery = new NativeSearchQueryBuilder().withFilter(regexpQuery("title", ".*data.*")) .build(); - final SearchHits
    articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + final SearchHits
    articles = elasticsearchOperations.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(1, articles.getTotalHits()); } @@ -126,7 +126,7 @@ public class ElasticSearchManualTest { public void givenSavedDoc_whenTitleUpdated_thenCouldFindByUpdatedTitle() { final Query searchQuery = new NativeSearchQueryBuilder().withQuery(fuzzyQuery("title", "serch")) .build(); - final SearchHits
    articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + final SearchHits
    articles = elasticsearchOperations.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(1, articles.getTotalHits()); @@ -147,7 +147,7 @@ public class ElasticSearchManualTest { final Query searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", articleTitle).minimumShouldMatch("75%")) .build(); - final SearchHits
    articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + final SearchHits
    articles = elasticsearchOperations.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(1, articles.getTotalHits()); final long count = articleRepository.count(); @@ -162,7 +162,7 @@ public class ElasticSearchManualTest { public void givenSavedDoc_whenOneTermMatches_thenFindByTitle() { final Query searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", "Search engines").operator(AND)) .build(); - final SearchHits
    articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + final SearchHits
    articles = elasticsearchOperations.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(1, articles.getTotalHits()); } } diff --git a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryManualTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryManualTest.java index aaf0c80097..03c8da80c9 100644 --- a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryManualTest.java +++ b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryManualTest.java @@ -39,7 +39,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.SearchHits; import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates; import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; @@ -58,7 +58,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; public class ElasticSearchQueryManualTest { @Autowired - private ElasticsearchRestTemplate elasticsearchTemplate; + private ElasticsearchOperations elasticsearchOperations; @Autowired private ArticleRepository articleRepository; @@ -101,7 +101,7 @@ public class ElasticSearchQueryManualTest { public void givenFullTitle_whenRunMatchQuery_thenDocIsFound() { final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", "Search engines").operator(Operator.AND)) .build(); - final SearchHits
    articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + final SearchHits
    articles = elasticsearchOperations.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(1, articles.getTotalHits()); } @@ -110,7 +110,7 @@ public class ElasticSearchQueryManualTest { final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", "Engines Solutions")) .build(); - final SearchHits
    articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + final SearchHits
    articles = elasticsearchOperations.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(1, articles.getTotalHits()); assertEquals("Search engines", articles.getSearchHit(0) @@ -123,7 +123,7 @@ public class ElasticSearchQueryManualTest { final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", "elasticsearch data")) .build(); - final SearchHits
    articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + final SearchHits
    articles = elasticsearchOperations.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(3, articles.getTotalHits()); } @@ -133,14 +133,14 @@ public class ElasticSearchQueryManualTest { NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title.verbatim", "Second Article About Elasticsearch")) .build(); - SearchHits
    articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + SearchHits
    articles = elasticsearchOperations.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(1, articles.getTotalHits()); searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title.verbatim", "Second Article About")) .build(); - articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + articles = elasticsearchOperations.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(0, articles.getTotalHits()); } @@ -150,7 +150,7 @@ public class ElasticSearchQueryManualTest { final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder) .build(); - final SearchHits
    articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + final SearchHits
    articles = elasticsearchOperations.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(2, articles.getTotalHits()); } @@ -205,7 +205,7 @@ public class ElasticSearchQueryManualTest { final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchPhraseQuery("title", "spring elasticsearch").slop(1)) .build(); - final SearchHits
    articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + final SearchHits
    articles = elasticsearchOperations.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(1, articles.getTotalHits()); } @@ -217,7 +217,7 @@ public class ElasticSearchQueryManualTest { .prefixLength(3)) .build(); - final SearchHits
    articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + final SearchHits
    articles = elasticsearchOperations.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(1, articles.getTotalHits()); } @@ -229,7 +229,7 @@ public class ElasticSearchQueryManualTest { .type(MultiMatchQueryBuilder.Type.BEST_FIELDS)) .build(); - final SearchHits
    articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + final SearchHits
    articles = elasticsearchOperations.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(2, articles.getTotalHits()); } @@ -241,7 +241,7 @@ public class ElasticSearchQueryManualTest { final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder) .build(); - final SearchHits
    articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + final SearchHits
    articles = elasticsearchOperations.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(2, articles.getTotalHits()); } From aa53dde12729407d9999dc42610d9969a73d1125 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Thu, 19 Jan 2023 21:36:54 +0530 Subject: [PATCH 305/592] JAVA-14179 Potential issue in Keycloak Integration - OAuth article (#13305) --- .../src/main/resources/application.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/application.yml b/spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/application.yml index e4bcdb5888..5d3c8b3af5 100644 --- a/spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/application.yml +++ b/spring-boot-modules/spring-boot-swagger-keycloak/src/main/resources/application.yml @@ -2,7 +2,6 @@ keycloak: auth-server-url: https://api.example.com/auth # Keycloak server url realm: todos-service-realm # Keycloak Realm resource: todos-service-clients # Keycloak Client - public-client: true principal-attribute: preferred_username ssl-required: external credentials: From edd27fda3ba06dcb11e9e55bb9ec92eb59302056 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 19 Jan 2023 16:21:21 +0000 Subject: [PATCH 306/592] [JAVA-15021] Upgraded to apache httpclient 5.2 (#13309) Co-authored-by: panagiotiskakos --- httpclient-simple/pom.xml | 13 ++ .../httpclient/HttpClientPostingLiveTest.java | 183 +++++++++++------- .../httpclient/ProgressEntityWrapper.java | 4 +- 3 files changed, 125 insertions(+), 75 deletions(-) diff --git a/httpclient-simple/pom.xml b/httpclient-simple/pom.xml index 45da1e7a39..c39983564f 100644 --- a/httpclient-simple/pom.xml +++ b/httpclient-simple/pom.xml @@ -112,6 +112,18 @@ + + + org.apache.httpcomponents.client5 + httpclient5-fluent + ${httpclient5-fluent.version} + + + commons-logging + commons-logging + + + org.apache.commons @@ -308,6 +320,7 @@ 5.2 5.2 + 5.2 1.6.1 diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientPostingLiveTest.java b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientPostingLiveTest.java index f5dff8d757..b30921c990 100644 --- a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientPostingLiveTest.java +++ b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientPostingLiveTest.java @@ -1,74 +1,88 @@ package com.baeldung.httpclient; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.NameValuePair; -import org.apache.http.auth.AuthenticationException; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.entity.UrlEncodedFormEntity; -import org.apache.http.client.fluent.Form; -import org.apache.http.client.fluent.Request; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.ContentType; -import org.apache.http.entity.StringEntity; -import org.apache.http.entity.mime.MultipartEntityBuilder; -import org.apache.http.impl.auth.BasicScheme; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.message.BasicNameValuePair; -import org.junit.Test; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import org.junit.jupiter.api.Test; + +import org.apache.hc.client5.http.auth.AuthScope; +import org.apache.hc.client5.http.auth.UsernamePasswordCredentials; +import org.apache.hc.client5.http.classic.methods.HttpPost; +import org.apache.hc.client5.http.entity.UrlEncodedFormEntity; +import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder; +import org.apache.hc.client5.http.fluent.Form; +import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.http.ContentType; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.core5.http.HttpStatus; +import org.apache.hc.core5.http.NameValuePair; +import org.apache.hc.client5.http.fluent.Request; +import org.apache.hc.core5.http.io.entity.StringEntity; +import org.apache.hc.core5.http.message.BasicNameValuePair; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; +import com.baeldung.handler.CustomHttpClientResponseHandler; /* * NOTE : Need module spring-rest to be running */ -public class HttpClientPostingLiveTest { +class HttpClientPostingLiveTest { private static final String SAMPLE_URL = "http://www.example.com"; private static final String URL_SECURED_BY_BASIC_AUTHENTICATION = "http://browserspy.dk/password-ok.php"; private static final String DEFAULT_USER = "test"; private static final String DEFAULT_PASS = "test"; @Test - public void whenSendPostRequestUsingHttpClient_thenCorrect() throws IOException { - final CloseableHttpClient client = HttpClients.createDefault(); + void whenSendPostRequestUsingHttpClient_thenCorrect() throws IOException { final HttpPost httpPost = new HttpPost(SAMPLE_URL); - final List params = new ArrayList(); params.add(new BasicNameValuePair("username", DEFAULT_USER)); params.add(new BasicNameValuePair("password", DEFAULT_PASS)); httpPost.setEntity(new UrlEncodedFormEntity(params)); - final CloseableHttpResponse response = client.execute(httpPost); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); - client.close(); + try (CloseableHttpClient client = HttpClients.createDefault(); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(httpPost, new CustomHttpClientResponseHandler())) { + + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } } @Test - public void whenSendPostRequestWithAuthorizationUsingHttpClient_thenCorrect() throws IOException, AuthenticationException { - final CloseableHttpClient client = HttpClients.createDefault(); + void whenSendPostRequestWithAuthorizationUsingHttpClient_thenCorrect() throws IOException { final HttpPost httpPost = new HttpPost(URL_SECURED_BY_BASIC_AUTHENTICATION); - httpPost.setEntity(new StringEntity("test post")); - final UsernamePasswordCredentials creds = new UsernamePasswordCredentials(DEFAULT_USER, DEFAULT_PASS); - httpPost.addHeader(new BasicScheme().authenticate(creds, httpPost, null)); - final CloseableHttpResponse response = client.execute(httpPost); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); - client.close(); + final BasicCredentialsProvider credsProvider = new BasicCredentialsProvider(); + final UsernamePasswordCredentials credentials = + new UsernamePasswordCredentials(DEFAULT_USER, DEFAULT_PASS.toCharArray()); + + credsProvider.setCredentials(new AuthScope(URL_SECURED_BY_BASIC_AUTHENTICATION, 80) ,credentials); + + try (CloseableHttpClient client = HttpClients.custom() + .setDefaultCredentialsProvider(credsProvider) + .build(); + + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(httpPost, new CustomHttpClientResponseHandler())) { + + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } } @Test - public void whenPostJsonUsingHttpClient_thenCorrect() throws IOException { - final CloseableHttpClient client = HttpClients.createDefault(); + void whenPostJsonUsingHttpClient_thenCorrect() throws IOException { final HttpPost httpPost = new HttpPost(SAMPLE_URL); final String json = "{\"id\":1,\"name\":\"John\"}"; @@ -77,68 +91,91 @@ public class HttpClientPostingLiveTest { httpPost.setHeader("Accept", "application/json"); httpPost.setHeader("Content-type", "application/json"); - final CloseableHttpResponse response = client.execute(httpPost); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); - client.close(); + try (CloseableHttpClient client = HttpClients.createDefault(); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(httpPost, new CustomHttpClientResponseHandler())) { + + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } } @Test - public void whenPostFormUsingHttpClientFluentAPI_thenCorrect() throws IOException { - final HttpResponse response = Request.Post(SAMPLE_URL).bodyForm(Form.form().add("username", DEFAULT_USER).add("password", DEFAULT_PASS).build()).execute().returnResponse(); + void whenPostFormUsingHttpClientFluentAPI_thenCorrect() throws IOException { + Request request = Request.post(SAMPLE_URL) + .bodyForm(Form.form() + .add("username", DEFAULT_USER) + .add("password", DEFAULT_PASS) + .build()); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + HttpResponse response = request.execute() + .returnResponse(); + assertThat(response.getCode(), equalTo(HttpStatus.SC_OK)); } @Test - public void whenSendMultipartRequestUsingHttpClient_thenCorrect() throws IOException { - final CloseableHttpClient client = HttpClients.createDefault(); + void whenSendMultipartRequestUsingHttpClient_thenCorrect() throws IOException { final HttpPost httpPost = new HttpPost(SAMPLE_URL); final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addTextBody("username", DEFAULT_USER); builder.addTextBody("password", DEFAULT_PASS); - builder.addBinaryBody("file", new File("src/test/resources/test.in"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); + builder.addBinaryBody( + "file", new File("src/test/resources/test.in"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); + + final HttpEntity multipart = builder.build(); + httpPost.setEntity(multipart); + + try (CloseableHttpClient client = HttpClients.createDefault(); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(httpPost, new CustomHttpClientResponseHandler())) { + + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } + } + + @Test + void whenUploadFileUsingHttpClient_thenCorrect() throws IOException { + final HttpPost httpPost = new HttpPost(SAMPLE_URL); + + final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); + builder.addBinaryBody( + "file", new File("src/test/resources/test.in"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); final HttpEntity multipart = builder.build(); httpPost.setEntity(multipart); - final CloseableHttpResponse response = client.execute(httpPost); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); - client.close(); + try (CloseableHttpClient client = HttpClients.createDefault(); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(httpPost, new CustomHttpClientResponseHandler())) { + + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } } @Test - public void whenUploadFileUsingHttpClient_thenCorrect() throws IOException { - final CloseableHttpClient client = HttpClients.createDefault(); + void whenGetUploadFileProgressUsingHttpClient_thenCorrect() throws IOException { final HttpPost httpPost = new HttpPost(SAMPLE_URL); final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); - builder.addBinaryBody("file", new File("src/test/resources/test.in"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); + builder.addBinaryBody( + "file", new File("src/test/resources/test.in"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); final HttpEntity multipart = builder.build(); - httpPost.setEntity(multipart); - - final CloseableHttpResponse response = client.execute(httpPost); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); - client.close(); - } - - @Test - public void whenGetUploadFileProgressUsingHttpClient_thenCorrect() throws IOException { - final CloseableHttpClient client = HttpClients.createDefault(); - final HttpPost httpPost = new HttpPost(SAMPLE_URL); - - final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); - builder.addBinaryBody("file", new File("src/test/resources/test.in"), ContentType.APPLICATION_OCTET_STREAM, "file.ext"); - final HttpEntity multipart = builder.build(); - - final ProgressEntityWrapper.ProgressListener pListener = percentage -> assertFalse(Float.compare(percentage, 100) > 0); + final ProgressEntityWrapper.ProgressListener pListener = + percentage -> assertFalse(Float.compare(percentage, 100) > 0); httpPost.setEntity(new ProgressEntityWrapper(multipart, pListener)); - final CloseableHttpResponse response = client.execute(httpPost); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); - client.close(); + try (CloseableHttpClient client = HttpClients.createDefault(); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(httpPost, new CustomHttpClientResponseHandler())) { + + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } } } \ No newline at end of file diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/ProgressEntityWrapper.java b/httpclient-simple/src/test/java/com/baeldung/httpclient/ProgressEntityWrapper.java index c7adf51b3e..0fbc6e5dcd 100644 --- a/httpclient-simple/src/test/java/com/baeldung/httpclient/ProgressEntityWrapper.java +++ b/httpclient-simple/src/test/java/com/baeldung/httpclient/ProgressEntityWrapper.java @@ -4,8 +4,8 @@ import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; -import org.apache.http.HttpEntity; -import org.apache.http.entity.HttpEntityWrapper; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.core5.http.io.entity.HttpEntityWrapper; public class ProgressEntityWrapper extends HttpEntityWrapper { private final ProgressListener listener; From 947f992d84457c19029378ef3c1594f2ac7dcb02 Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Date: Thu, 19 Jan 2023 19:58:20 +0200 Subject: [PATCH 307/592] JAVA-15609 Fixed failing tests (#13304) --- ....java => ApiControllerDocTesterUnitTest.java} | 6 +++--- ...nTest.java => ApiControllerMockUnitTest.java} | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) rename web-modules/ninja/src/test/java/controllers/{ApiControllerDocTesterIntegrationTest.java => ApiControllerDocTesterUnitTest.java} (90%) rename web-modules/ninja/src/test/java/controllers/{ApiControllerMockIntegrationTest.java => ApiControllerMockUnitTest.java} (68%) diff --git a/web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterIntegrationTest.java b/web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterUnitTest.java similarity index 90% rename from web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterIntegrationTest.java rename to web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterUnitTest.java index a075497dc8..64812f6935 100644 --- a/web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterIntegrationTest.java +++ b/web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterUnitTest.java @@ -7,11 +7,11 @@ import org.doctester.testbrowser.Response; import org.junit.Test; import ninja.NinjaDocTester; -public class ApiControllerDocTesterIntegrationTest extends NinjaDocTester { +public class ApiControllerDocTesterUnitTest extends NinjaDocTester { String URL_INDEX = "/"; String URL_HELLO = "/hello"; - + @Test public void testGetIndex() { Response response = makeRequest(Request.GET().url(testServerUrl().path(URL_INDEX))); @@ -23,5 +23,5 @@ public class ApiControllerDocTesterIntegrationTest extends NinjaDocTester { Response response = makeRequest(Request.GET().url(testServerUrl().path(URL_HELLO))); assertThat(response.payload, containsString("Bonjour, bienvenue dans Ninja Framework!")); } - + } diff --git a/web-modules/ninja/src/test/java/controllers/ApiControllerMockIntegrationTest.java b/web-modules/ninja/src/test/java/controllers/ApiControllerMockUnitTest.java similarity index 68% rename from web-modules/ninja/src/test/java/controllers/ApiControllerMockIntegrationTest.java rename to web-modules/ninja/src/test/java/controllers/ApiControllerMockUnitTest.java index 53a760aadc..8534fa0b0f 100644 --- a/web-modules/ninja/src/test/java/controllers/ApiControllerMockIntegrationTest.java +++ b/web-modules/ninja/src/test/java/controllers/ApiControllerMockUnitTest.java @@ -1,23 +1,23 @@ package controllers; import static org.junit.Assert.assertEquals; -import javax.inject.Inject; + import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; -import ninja.NinjaRunner; + +import ninja.NinjaTest; import ninja.Result; import services.UserService; -@RunWith(NinjaRunner.class) -public class ApiControllerMockIntegrationTest { +public class ApiControllerMockUnitTest extends NinjaTest { - @Inject private UserService userService; + private UserService userService; - ApplicationController applicationController; + private ApplicationController applicationController; @Before public void setupTest() { + userService = this.ninjaTestServer.getInjector().getInstance(UserService.class); applicationController = new ApplicationController(); applicationController.userService = userService; } @@ -28,5 +28,5 @@ public class ApiControllerMockIntegrationTest { System.out.println(result.getRenderable()); assertEquals(userService.getUserMap().toString(), result.getRenderable().toString()); } - + } From 58069ea225fe025432c4da0443570c66fbb5505a Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Date: Thu, 19 Jan 2023 20:07:14 +0200 Subject: [PATCH 308/592] JAVA-12390 Enabled CORS (#13208) --- .../basicauth/config/BasicAuthConfiguration.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spring-security-modules/spring-security-web-angular/spring-security-web-angular-server/src/main/java/com/baeldung/springbootsecurityrest/basicauth/config/BasicAuthConfiguration.java b/spring-security-modules/spring-security-web-angular/spring-security-web-angular-server/src/main/java/com/baeldung/springbootsecurityrest/basicauth/config/BasicAuthConfiguration.java index 504dbf63e3..5f4b82a191 100644 --- a/spring-security-modules/spring-security-web-angular/spring-security-web-angular-server/src/main/java/com/baeldung/springbootsecurityrest/basicauth/config/BasicAuthConfiguration.java +++ b/spring-security-modules/spring-security-web-angular/spring-security-web-angular-server/src/main/java/com/baeldung/springbootsecurityrest/basicauth/config/BasicAuthConfiguration.java @@ -1,5 +1,7 @@ package com.baeldung.springbootsecurityrest.basicauth.config; +import static org.springframework.security.config.Customizer.withDefaults; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; @@ -27,6 +29,7 @@ public class BasicAuthConfiguration { public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf() .disable() + .cors(withDefaults()) .authorizeRequests() .antMatchers(HttpMethod.OPTIONS, "/**") .permitAll() From 7936998b971336b73c96d424c9a2950572e951d4 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Thu, 19 Jan 2023 23:43:03 +0530 Subject: [PATCH 309/592] JAVA-14471 Remove remaining code for moved articles --- .../src/main/java/com/baeldung/keycloak/SecurityConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c85438952a..1ad22d9397 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 @@ -30,7 +30,7 @@ class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests() - .antMatchers("/customers*", "/users*") + .antMatchers("/customers*") .hasRole("USER") .anyRequest() .permitAll(); From 1b25127d899fb85b25a3f8b8eb03b110261284eb Mon Sep 17 00:00:00 2001 From: Kapil Khandelwal Date: Fri, 20 Jan 2023 00:24:58 +0530 Subject: [PATCH 310/592] LNX-453:- Prevent Jenkins build from failing when execute shell step fails (#13300) --- .../pipeline-prevent-build-failure-job | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 jenkins-modules/jenkins-jobs/prevent-build-failure-job/pipeline-prevent-build-failure-job diff --git a/jenkins-modules/jenkins-jobs/prevent-build-failure-job/pipeline-prevent-build-failure-job b/jenkins-modules/jenkins-jobs/prevent-build-failure-job/pipeline-prevent-build-failure-job new file mode 100644 index 0000000000..b143f31dc7 --- /dev/null +++ b/jenkins-modules/jenkins-jobs/prevent-build-failure-job/pipeline-prevent-build-failure-job @@ -0,0 +1,16 @@ +pipeline { + agent any + stages { + stage('tryCatch') { + steps { + script { + try { + sh 'test_script.sh' + } catch (e) { + echo "An error occurred: ${e}" + } + } + } + } + } +} From 305b369f5d1fd62c5b9cd5ee651ff9e60f1c9327 Mon Sep 17 00:00:00 2001 From: Iniubong LA Date: Thu, 19 Jan 2023 19:03:51 +0000 Subject: [PATCH 311/592] arthurshur@gmail.com (#13275) * Creating a deep vs shallow copy of an object in Java * Creating a deep vs shallow copy of an object in Java * Baeldung article converting number bases * Baeldung article converting number bases * edits made to Converting a Number from One Base to Another in Java * added braces to oneliners * added precondition to check input --- .../ConvertNumberBases.java | 52 +++++++++++-------- .../ConvertNumberBasesUnitTest.java | 12 +++++ 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/convertnumberbases/ConvertNumberBases.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/convertnumberbases/ConvertNumberBases.java index 405504a965..09b880cd19 100644 --- a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/convertnumberbases/ConvertNumberBases.java +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/convertnumberbases/ConvertNumberBases.java @@ -2,68 +2,76 @@ package com.baeldung.convertnumberbases; public class ConvertNumberBases { - public static String convertNumberToNewBase(String number, int base, int newBase){ + public static String convertNumberToNewBase(String number, int base, int newBase) { return Integer.toString(Integer.parseInt(number, base), newBase); } + public static String convertNumberToNewBaseCustom(String num, int base, int newBase) { int decimalNumber = convertFromAnyBaseToDecimal(num, base); - return convertFromDecimalToBaseX(decimalNumber, newBase); + String targetBase = ""; + try { + targetBase = convertFromDecimalToBaseX(decimalNumber, newBase); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } + return targetBase; } - public static String convertFromDecimalToBaseX(int num, int newBase) { + public static String convertFromDecimalToBaseX(int num, int newBase) throws IllegalArgumentException { + if ((newBase < 2 || newBase > 10) && newBase != 16) { + throw new IllegalArgumentException("New base must be from 2 - 10 or 16"); + } String result = ""; int remainder; while (num > 0) { remainder = num % newBase; if (newBase == 16) { - if (remainder == 10) + if (remainder == 10) { result += 'A'; - else if (remainder == 11) + } else if (remainder == 11) { result += 'B'; - else if (remainder == 12) + } else if (remainder == 12) { result += 'C'; - else if (remainder == 13) + } else if (remainder == 13) { result += 'D'; - else if (remainder == 14) + } else if (remainder == 14) { result += 'E'; - else if (remainder == 15) + } else if (remainder == 15) { result += 'F'; - else + } else { result += remainder; - } else + } + } else { result += remainder; - + } num /= newBase; } return new StringBuffer(result).reverse().toString(); } public static int convertFromAnyBaseToDecimal(String num, int base) { - - if (base < 2 || (base > 10 && base != 16)) + if (base < 2 || (base > 10 && base != 16)) { return -1; - + } int val = 0; int power = 1; - for (int i = num.length() - 1; i >= 0; i--) { int digit = charToDecimal(num.charAt(i)); - - if (digit < 0 || digit >= base) + if (digit < 0 || digit >= base) { return -1; - + } val += digit * power; power = power * base; } - return val; } public static int charToDecimal(char c) { - if (c >= '0' && c <= '9') + if (c >= '0' && c <= '9') { return (int) c - '0'; - else + } else { return (int) c - 'A' + 10; + } } } diff --git a/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertnumberbases/ConvertNumberBasesUnitTest.java b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertnumberbases/ConvertNumberBasesUnitTest.java index 109e1da1b2..a666346b1a 100644 --- a/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertnumberbases/ConvertNumberBasesUnitTest.java +++ b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertnumberbases/ConvertNumberBasesUnitTest.java @@ -1,5 +1,6 @@ package com.baeldung.convertnumberbases; +import static com.baeldung.convertnumberbases.ConvertNumberBases.convertFromDecimalToBaseX; import static com.baeldung.convertnumberbases.ConvertNumberBases.convertNumberToNewBase; import static com.baeldung.convertnumberbases.ConvertNumberBases.convertNumberToNewBaseCustom; import static org.junit.jupiter.api.Assertions.*; @@ -17,4 +18,15 @@ class ConvertNumberBasesUnitTest { assertEquals(convertNumberToNewBaseCustom("11001000", 2, 8), "310"); } + @Test + void whenInputIsOutOfRange_thenIllegalArgumentExceptionIsThrown() { + Exception exception = assertThrows(IllegalArgumentException.class, ()-> { + convertFromDecimalToBaseX(100, 12); + }); + String expectedMessage = "New base must be from 2 - 10 or 16"; + String actualMessage = exception.getMessage(); + + assertTrue(actualMessage.contains(expectedMessage)); + } + } \ No newline at end of file From cf5eeaa1765bf4b22f1593d7ba0d6b78360ac4ba Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 20 Jan 2023 07:39:27 +0530 Subject: [PATCH 312/592] Updated Readme to include info on building modules from the root (#13312) --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 1ae225b1f3..aecd561645 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,13 @@ Building a single module To build a specific module, run the command: `mvn clean install` in the module directory. +Building modules from the root of the repository +==================== +To build specific modules from the root of the repository, run the command: `mvn clean install --pl asm,atomikos -Pdefault-first` in the root directory. + +Here `asm` and `atomikos` are the modules that we want to build and `default-first` is the maven profile in which these modules are present. + + Running a Spring Boot module ==================== To run a Spring Boot module, run the command: `mvn spring-boot:run` in the module directory. From 0c3db032b8d9238dd8cb16dbf920b38ef6897e71 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Jan 2023 16:11:34 +0800 Subject: [PATCH 313/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-array-list/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-array-list/README.md b/core-java-modules/core-java-collections-array-list/README.md index 094ae33c40..0bc090d635 100644 --- a/core-java-modules/core-java-collections-array-list/README.md +++ b/core-java-modules/core-java-collections-array-list/README.md @@ -10,3 +10,4 @@ This module contains articles about the Java ArrayList collection - [Removing an Element From an ArrayList](https://www.baeldung.com/java-arraylist-remove-element) - [The Capacity of an ArrayList vs the Size of an Array in Java](https://www.baeldung.com/java-list-capacity-array-size) - [Case-Insensitive Searching in ArrayList](https://www.baeldung.com/java-arraylist-case-insensitive-search) +- [Storing Data Triple in a List in Java](https://www.baeldung.com/java-list-storing-triple) From a8b953195db115646fbd0e6b74fd24994824bb9b Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Jan 2023 16:17:17 +0800 Subject: [PATCH 314/592] Update README.md [skip ci] --- core-java-modules/core-java/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java/README.md b/core-java-modules/core-java/README.md index 087c5d356e..0000962164 100644 --- a/core-java-modules/core-java/README.md +++ b/core-java-modules/core-java/README.md @@ -9,3 +9,4 @@ - [A Guide to the ResourceBundle](http://www.baeldung.com/java-resourcebundle) - [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) - [Illegal Character Compilation Error](https://www.baeldung.com/java-illegal-character-error) +- [Lambda Expression vs. Anonymous Inner Class](https://www.baeldung.com/java-lambdas-vs-anonymous-class) From a028f31823cebcef7826c14d55dca4418221cb8a Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Jan 2023 16:21:36 +0800 Subject: [PATCH 315/592] Update README.md [skip ci] --- core-java-modules/core-java-streams-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-streams-4/README.md b/core-java-modules/core-java-streams-4/README.md index 187117d5d3..b210c2775a 100644 --- a/core-java-modules/core-java-streams-4/README.md +++ b/core-java-modules/core-java-streams-4/README.md @@ -5,3 +5,4 @@ - [Filter Java Stream to 1 and Only 1 Element](https://www.baeldung.com/java-filter-stream-unique-element) - [Java 8 Streams: Multiple Filters vs. Complex Condition](https://www.baeldung.com/java-streams-multiple-filters-vs-condition) - [Finding Max Date in List Using Streams](https://www.baeldung.com/java-max-date-list-streams) +- [Batch Processing of Stream Data in Java](https://www.baeldung.com/java-stream-batch-processing) From 9b0daac6406573b15d5a749f29745b63619a0bc4 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Jan 2023 16:24:48 +0800 Subject: [PATCH 316/592] Update README.md [skip ci] --- core-java-modules/core-java-jvm-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-jvm-3/README.md b/core-java-modules/core-java-jvm-3/README.md index 5c694edaa0..0c8a325cf2 100644 --- a/core-java-modules/core-java-jvm-3/README.md +++ b/core-java-modules/core-java-jvm-3/README.md @@ -5,4 +5,5 @@ This module contains articles about working with the Java Virtual Machine (JVM). ### Relevant Articles: - [Difference Between Class.getResource() and ClassLoader.getResource()](https://www.baeldung.com/java-class-vs-classloader-getresource) +- [Compiling and Executing Code From a String in Java](https://www.baeldung.com/java-string-compile-execute-code) - More articles: [[<-- prev]](/core-java-modules/core-java-jvm-2) From 5e420e34e1be7b4086569f6fc966922f629a707c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Jan 2023 16:27:49 +0800 Subject: [PATCH 317/592] 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 d3909c0014..b482669508 100644 --- a/core-java-modules/core-java-lang-oop-others/README.md +++ b/core-java-modules/core-java-lang-oop-others/README.md @@ -6,3 +6,4 @@ This module contains articles about Object Oriented Programming (OOP) in Java - [Object-Oriented-Programming Concepts in Java](https://www.baeldung.com/java-oop) - [Static and Dynamic Binding in Java](https://www.baeldung.com/java-static-dynamic-binding) - [Pass-By-Value as a Parameter Passing Mechanism in Java](https://www.baeldung.com/java-pass-by-value-or-pass-by-reference) +- [Check If All the Variables of an Object Are Null](https://www.baeldung.com/java-check-all-variables-object-null) From b2731db3ef48af77243fcd97c4f01f0d3390e07c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Jan 2023 16:31:09 +0800 Subject: [PATCH 318/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-array-list/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-array-list/README.md b/core-java-modules/core-java-collections-array-list/README.md index 0bc090d635..53568ca98a 100644 --- a/core-java-modules/core-java-collections-array-list/README.md +++ b/core-java-modules/core-java-collections-array-list/README.md @@ -11,3 +11,4 @@ This module contains articles about the Java ArrayList collection - [The Capacity of an ArrayList vs the Size of an Array in Java](https://www.baeldung.com/java-list-capacity-array-size) - [Case-Insensitive Searching in ArrayList](https://www.baeldung.com/java-arraylist-case-insensitive-search) - [Storing Data Triple in a List in Java](https://www.baeldung.com/java-list-storing-triple) +- [Convert an ArrayList of Object to an ArrayList of String Elements](https://www.baeldung.com/java-object-list-to-strings) From 05601ae0febcf4249c61f17bf1a06d1cd45d3d67 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Jan 2023 16:34:39 +0800 Subject: [PATCH 319/592] Update README.md [skip ci] --- persistence-modules/spring-data-jpa-repo-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-data-jpa-repo-2/README.md b/persistence-modules/spring-data-jpa-repo-2/README.md index f51e7135ae..6f19577606 100644 --- a/persistence-modules/spring-data-jpa-repo-2/README.md +++ b/persistence-modules/spring-data-jpa-repo-2/README.md @@ -7,4 +7,5 @@ - [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) - More articles: [[<-- prev]](../spring-data-jpa-repo) From 34c282de3425ce02ee627200de81268234e47c08 Mon Sep 17 00:00:00 2001 From: Alex Golub Date: Fri, 20 Jan 2023 12:28:29 +0200 Subject: [PATCH 320/592] Metaprogramming: Align with groovy version `3.0.8` and use spock testing framework --- .../baeldung/metaprogramming/Employee.groovy | 25 ++- .../extension/BasicExtensions.groovy | 19 +- .../MetaprogrammingUnitTest.groovy | 164 +++++++++++------- 3 files changed, 121 insertions(+), 87 deletions(-) diff --git a/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/Employee.groovy b/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/Employee.groovy index f49d0f906b..cade7dab3c 100644 --- a/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/Employee.groovy +++ b/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/Employee.groovy @@ -1,18 +1,14 @@ package com.baeldung.metaprogramming -import groovy.transform.AutoClone -import groovy.transform.Canonical -import groovy.transform.EqualsAndHashCode -import groovy.transform.ToString -import groovy.transform.TupleConstructor -import groovy.util.logging.* +import groovy.transform.* +import groovy.util.logging.Log -@Canonical +@ToString(includePackage = false, excludes = ['id']) @TupleConstructor @EqualsAndHashCode -@ToString(includePackage=false, excludes=['id']) -@Log -@AutoClone +@Canonical +@AutoClone(style = AutoCloneStyle.SIMPLE) +@Log class Employee { long id @@ -30,16 +26,15 @@ class Employee { def propertyMissing(String propertyName, propertyValue) { println "property '$propertyName' is not available" log.info "$propertyName is not available" - "property '$propertyName' is not available" + "property '$propertyName' with value '$propertyValue' is not available" } - def methodMissing(String methodName, def methodArgs) { + def methodMissing(String methodName, Object methodArgs) { log.info "$methodName is not defined" "method '$methodName' is not defined" } - + def logEmp() { log.info "Employee: $lastName, $firstName is of $age years age" } - -} \ No newline at end of file +} diff --git a/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/extension/BasicExtensions.groovy b/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/extension/BasicExtensions.groovy index 0612ecb955..7e9f0111cd 100644 --- a/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/extension/BasicExtensions.groovy +++ b/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/extension/BasicExtensions.groovy @@ -2,32 +2,31 @@ package com.baeldung.metaprogramming.extension import com.baeldung.metaprogramming.Employee -import java.time.LocalDate import java.time.Year class BasicExtensions { - + static int getYearOfBirth(Employee self) { return Year.now().value - self.age } - + static String capitalize(String self) { return self.substring(0, 1).toUpperCase() + self.substring(1) } static void printCounter(Integer self) { - while (self>0) { + while (self > 0) { println self self-- } } - + static Long square(Long self) { - return self*self + return self * self } - + static BigDecimal cube(BigDecimal self) { - return self*self*self + return self * self * self } - -} \ No newline at end of file + +} diff --git a/core-groovy-modules/core-groovy-2/src/test/groovy/com/baeldung/metaprogramming/MetaprogrammingUnitTest.groovy b/core-groovy-modules/core-groovy-2/src/test/groovy/com/baeldung/metaprogramming/MetaprogrammingUnitTest.groovy index 4a8631eb95..6959c97533 100644 --- a/core-groovy-modules/core-groovy-2/src/test/groovy/com/baeldung/metaprogramming/MetaprogrammingUnitTest.groovy +++ b/core-groovy-modules/core-groovy-2/src/test/groovy/com/baeldung/metaprogramming/MetaprogrammingUnitTest.groovy @@ -1,123 +1,163 @@ package com.baeldung.metaprogramming +import spock.lang.Specification -import java.time.LocalDate -import java.time.Period import java.time.Year -class MetaprogrammingUnitTest extends GroovyTestCase { +class MetaprogrammingUnitTest extends Specification { - Employee emp = new Employee(firstName: "Norman", lastName: "Lewis") + Employee emp - void testPropertyMissing() { - assert emp.address == "property 'address' is not available" + void setup() { + emp = new Employee(firstName: "Norman", lastName: "Lewis") } - void testMethodMissing() { + def "testPropertyMissing"() { + expect: + emp.address == "property 'address' is not available" + } + + def "testMethodMissing"() { + given: Employee emp = new Employee() - try { - emp.getFullName() - } catch(MissingMethodException e) { - println "method is not defined" - } - assert emp.getFullName() == "method 'getFullName' is not defined" + + expect: + emp.getFullName() == "method 'getFullName' is not defined" } - void testMetaClassProperty() { + def "testMetaClassProperty"() { + when: Employee.metaClass.address = "" - emp = new Employee(firstName: "Norman", lastName: "Lewis", address: "US") - assert emp.address == "US" + + and: + emp = new Employee(firstName: "Norman", + lastName: "Lewis", + address: "US") + + then: + emp.address == "US" } - void testMetaClassMethod() { + def "testMetaClassMethod"() { + when: emp.metaClass.getFullName = { "$lastName, $firstName" } - assert emp.getFullName() == "Lewis, Norman" + + then: + emp.getFullName() == "Lewis, Norman" } - void testMetaClassConstructor() { - try { - Employee emp = new Employee("Norman") - } catch(GroovyRuntimeException e) { - assert e.message == "Could not find matching constructor for: com.baeldung.metaprogramming.Employee(String)" - } + def "testOnlyNameConstructor"() { + when: + new Employee("Norman") + then: + thrown(GroovyRuntimeException) + } + + def "testMetaClassConstructor"() { + when: Employee.metaClass.constructor = { String firstName -> new Employee(firstName: firstName) } + and: Employee norman = new Employee("Norman") - assert norman.firstName == "Norman" - assert norman.lastName == null + + then: + norman.firstName == "Norman" + norman.lastName == null } - void testJavaMetaClass() { + def "testJavaMetaClass"() { + when: String.metaClass.capitalize = { String str -> str.substring(0, 1).toUpperCase() + str.substring(1) } - assert "norman".capitalize() == "Norman" + + and: + String.metaClass.static.joinWith = { String delimiter, String... args -> + String.join(delimiter, args) + } + + then: + "norman".capitalize() == "Norman" + String.joinWith(" -> ", "a", "b", "c") == "a -> b -> c" } - void testEmployeeExtension() { + def "testEmployeeExtension"() { + given: def age = 28 def expectedYearOfBirth = Year.now() - age Employee emp = new Employee(age: age) - assert emp.getYearOfBirth() == expectedYearOfBirth.value + + expect: + emp.getYearOfBirth() == expectedYearOfBirth.value } - void testJavaClassesExtensions() { + def "testJavaClassesExtensions"() { + when: 5.printCounter() - assert 40l.square() == 1600l - - assert (2.98).cube() == 26.463592 + then: + 40L.square() == 1600L + (2.98).cube() == 26.463592 } - void testStaticEmployeeExtension() { + def "testStaticEmployeeExtension"() { assert Employee.getDefaultObj().firstName == "firstName" assert Employee.getDefaultObj().lastName == "lastName" assert Employee.getDefaultObj().age == 20 } - void testToStringAnnotation() { - Employee employee = new Employee() - employee.id = 1 - employee.firstName = "norman" - employee.lastName = "lewis" - employee.age = 28 + def "testToStringAnnotation"() { + when: + Employee employee = new Employee().tap { + id = 1 + firstName = "norman" + lastName = "lewis" + age = 28 + } - assert employee.toString() == "Employee(norman, lewis, 28)" + then: + employee.toString() == "Employee(norman, lewis, 28)" } - void testTupleConstructorAnnotation() { + def "testTupleConstructorAnnotation"() { + when: Employee norman = new Employee(1, "norman", "lewis", 28) - assert norman.toString() == "Employee(norman, lewis, 28)" - Employee snape = new Employee(2, "snape") - assert snape.toString() == "Employee(snape, null, 0)" + then: + norman.toString() == "Employee(norman, lewis, 28)" + snape.toString() == "Employee(snape, null, 0)" } - - void testEqualsAndHashCodeAnnotation() { + + def "testEqualsAndHashCodeAnnotation"() { + when: Employee norman = new Employee(1, "norman", "lewis", 28) Employee normanCopy = new Employee(1, "norman", "lewis", 28) - assert norman.equals(normanCopy) - assert norman.hashCode() == normanCopy.hashCode() - } - - void testAutoCloneAnnotation() { - try { - Employee norman = new Employee(1, "norman", "lewis", 28) - def normanCopy = norman.clone() - assert norman == normanCopy - } catch(CloneNotSupportedException e) { - e.printStackTrace() - } + + then: + norman == normanCopy + norman.hashCode() == normanCopy.hashCode() } - void testLoggingAnnotation() { + def "testAutoCloneAnnotation"() { + given: + Employee norman = new Employee(1, "norman", "lewis", 28) + + when: + def normanCopy = norman.clone() + + then: + norman == normanCopy + } + + def "testLoggingAnnotation"() { + given: Employee employee = new Employee(1, "Norman", "Lewis", 28) - employee.logEmp() + employee.logEmp() // INFO: Employee: Lewis, Norman is of 28 years age } } From 46ac54b723afc17e1636dc4d3f7e2fc4b36cd7a6 Mon Sep 17 00:00:00 2001 From: Alex Golub Date: Fri, 20 Jan 2023 12:55:56 +0200 Subject: [PATCH 321/592] Categories: code reformat --- .../baeldung/category/BaeldungCategory.groovy | 16 +++++----- .../baeldung/category/NumberCategory.groovy | 14 ++++----- .../baeldung/category/CategoryUnitTest.groovy | 31 +++++++++---------- 3 files changed, 29 insertions(+), 32 deletions(-) diff --git a/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy b/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy index 479c39699f..ccb1c7fc95 100644 --- a/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy +++ b/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy @@ -1,17 +1,17 @@ -package com.baeldung.category; +package com.baeldung.category class BaeldungCategory { - public static String capitalize(String self) { - String capitalizedStr = self; + static String capitalize(String self) { + String capitalizedStr = self if (self.size() > 0) { - capitalizedStr = self.substring(0, 1).toUpperCase() + self.substring(1); + capitalizedStr = self.substring(0, 1).toUpperCase() + self.substring(1) } + return capitalizedStr } - - public static double toThePower(Number self, Number exponent) { - return Math.pow(self, exponent); - } + static double toThePower(Number self, Number exponent) { + return Math.pow(self, exponent) + } } diff --git a/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy b/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy index ccf2ed519b..4f38b87ec5 100644 --- a/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy +++ b/core-groovy-modules/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy @@ -1,17 +1,15 @@ -package com.baeldung.category; - -import groovy.lang.Category +package com.baeldung.category @Category(Number) class NumberCategory { - public Number cube() { - return this*this*this + Number cube() { + return this**3 } - public int divideWithRoundUp(BigDecimal divisor, boolean isRoundUp) { + int divideWithRoundUp(BigDecimal divisor, boolean isRoundUp) { def mathRound = isRoundUp ? BigDecimal.ROUND_UP : BigDecimal.ROUND_DOWN - return (int)new BigDecimal(this).divide(divisor, 0, mathRound) + + return (int) new BigDecimal(this).divide(divisor, 0, mathRound) } - } diff --git a/core-groovy-modules/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy b/core-groovy-modules/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy index a1f67b1e2e..370dfb316e 100644 --- a/core-groovy-modules/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy +++ b/core-groovy-modules/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy @@ -1,17 +1,17 @@ package com.baeldung.category -import groovy.time.* +import groovy.time.TimeCategory +import groovy.xml.DOMBuilder +import groovy.xml.QName +import groovy.xml.dom.DOMCategory + import java.text.SimpleDateFormat -import groovy.xml.* -import groovy.xml.dom.* -import com.baeldung.category.BaeldungCategory -import com.baeldung.category.NumberCategory class CategoryUnitTest extends GroovyTestCase { void test_whenUsingTimeCategory_thenOperationOnDate() { def jan_1_2019 = new Date("01/01/2019") - use (TimeCategory) { + use(TimeCategory) { assert jan_1_2019 + 10.seconds == new Date("01/01/2019 00:00:10") assert jan_1_2019 + 20.minutes == new Date("01/01/2019 00:20:00") @@ -30,7 +30,7 @@ class CategoryUnitTest extends GroovyTestCase { void test_whenUsingTimeCategory_thenOperationOnNumber() { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy") - use (TimeCategory) { + use(TimeCategory) { assert sdf.format(5.days.from.now) == sdf.format(new Date() + 5.days) sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss") @@ -57,7 +57,7 @@ class CategoryUnitTest extends GroovyTestCase { def root = baeldungArticlesDom.documentElement - use (DOMCategory) { + use(DOMCategory) { assert root.article.size() == 2 def articles = root.article @@ -75,27 +75,26 @@ class CategoryUnitTest extends GroovyTestCase { assert root.article[2].title.text() == "Metaprogramming in Groovy" } } - + void test_whenUsingBaeldungCategory_thenCapitalizeString() { - use (BaeldungCategory) { + use(BaeldungCategory) { assert "norman".capitalize() == "Norman" - } + } } - + void test_whenUsingBaeldungCategory_thenOperationsOnNumber() { - use (BaeldungCategory) { + use(BaeldungCategory) { assert 50.toThePower(2) == 2500 assert 2.4.toThePower(4) == 33.1776 } } - + void test_whenUsingNumberCategory_thenOperationsOnNumber() { - use (NumberCategory) { + use(NumberCategory) { assert 3.cube() == 27 assert 25.divideWithRoundUp(6, true) == 5 assert 120.23.divideWithRoundUp(6.1, true) == 20 assert 150.9.divideWithRoundUp(12.1, false) == 12 } } - } From 3512ca847faca394abeb688418b3271d9fcb5696 Mon Sep 17 00:00:00 2001 From: Alex Golub Date: Fri, 20 Jan 2023 15:01:35 +0200 Subject: [PATCH 322/592] Maps in Groovy: convert to spock test framework --- .../groovy/com/baeldung/maps/MapTest.groovy | 212 +++++++++--------- 1 file changed, 112 insertions(+), 100 deletions(-) diff --git a/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/maps/MapTest.groovy b/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/maps/MapTest.groovy index deb552c420..9529330089 100644 --- a/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/maps/MapTest.groovy +++ b/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/maps/MapTest.groovy @@ -1,148 +1,160 @@ -package com.baeldung.maps; +package com.baeldung.maps -import static groovy.test.GroovyAssert.* -import org.junit.Test +import spock.lang.Specification -class MapTest{ - - @Test - void createMap() { +class MapTest extends Specification { + def "createMap"() { + when: def emptyMap = [:] - assertNotNull(emptyMap) + def map = [name: "Jerry", age: 42, city: "New York"] - assertTrue(emptyMap instanceof java.util.LinkedHashMap) - - def map = [name:"Jerry", age: 42, city: "New York"] - assertTrue(map.size() == 3) + then: + emptyMap != null + emptyMap instanceof java.util.LinkedHashMap + map.size() == 3 } - @Test - void addItemsToMap() { - - def map = [name:"Jerry"] - - map["age"] = 42 - - map.city = "New York" - + def "addItemsToMap"() { + given: + def map = [name: "Jerry"] def hobbyLiteral = "hobby" def hobbyMap = [(hobbyLiteral): "Singing"] + def appendToMap = [:] + + when: + map["age"] = 42 + map.city = "New York" + map.putAll(hobbyMap) - assertTrue(map == [name:"Jerry", age: 42, city: "New York", hobby:"Singing"]) - assertTrue(hobbyMap.hobby == "Singing") - assertTrue(hobbyMap[hobbyLiteral] == "Singing") - - map.plus([1:20]) // returns new map + appendToMap.plus([1: 20]) + appendToMap << [2: 30] - map << [2:30] + then: + map == [name: "Jerry", age: 42, city: "New York", hobby: "Singing"] + hobbyMap.hobby == "Singing" + hobbyMap[hobbyLiteral] == "Singing" + + appendToMap == [2: 30] // plus(Map) returns new instance of Map } - @Test - void getItemsFromMap() { - - def map = [name:"Jerry", age: 42, city: "New York", hobby:"Singing"] - - assertTrue(map["name"] == "Jerry") - - assertTrue(map.name == "Jerry") - + def "getItemsFromMap"() { + when: + def map = [name: "Jerry", age: 42, city: "New York", hobby: "Singing"] def propertyAge = "age" - assertTrue(map[propertyAge] == 42) + + then: + map["name"] == "Jerry" + map.name == "Jerry" + map[propertyAge] == 42 + map."$propertyAge" == 42 } - @Test - void removeItemsFromMap() { + def "removeItemsFromMap"() { + given: + def map = [1: 20, a: 30, 2: 42, 4: 34, ba: 67, 6: 39, 7: 49] + def removeAllKeysOfTypeString = [1: 20, a: 30, ba: 67, 6: 39, 7: 49] + def retainAllEntriesWhereValueIsEven = [1: 20, a: 30, ba: 67, 6: 39, 7: 49] - def map = [1:20, a:30, 2:42, 4:34, ba:67, 6:39, 7:49] + when: + def minusMap = map - [2: 42, 4: 34] + removeAllKeysOfTypeString.removeAll { it.key instanceof String } + retainAllEntriesWhereValueIsEven.retainAll { it.value % 2 == 0 } - def minusMap = map.minus([2:42, 4:34]); - assertTrue(minusMap == [1:20, a:30, ba:67, 6:39, 7:49]) - - minusMap.removeAll{it -> it.key instanceof String} - assertTrue( minusMap == [ 1:20, 6:39, 7:49]) - - minusMap.retainAll{it -> it.value %2 == 0} - assertTrue( minusMap == [1:20]) + then: + minusMap == [1: 20, a: 30, ba: 67, 6: 39, 7: 49] + removeAllKeysOfTypeString == [1: 20, 6: 39, 7: 49] + retainAllEntriesWhereValueIsEven == [1: 20, a: 30] } - @Test - void iteratingOnMaps(){ - def map = [name:"Jerry", age: 42, city: "New York", hobby:"Singing"] + def "iteratingOnMaps"() { + when: + def map = [name: "Jerry", age: 42, city: "New York", hobby: "Singing"] - map.each{ entry -> println "$entry.key: $entry.value" } - - map.eachWithIndex{ entry, i -> println "$i $entry.key: $entry.value" } - - map.eachWithIndex{ key, value, i -> println "$i $key: $value" } + then: + map.each { entry -> println "$entry.key: $entry.value" } + map.eachWithIndex { entry, i -> println "$i $entry.key: $entry.value" } + map.eachWithIndex { key, value, i -> println "$i $key: $value" } } - @Test - void filteringAndSearchingMaps(){ - def map = [name:"Jerry", age: 42, city: "New York", hobby:"Singing"] + def "filteringAndSearchingMaps"() { + given: + def map = [name: "Jerry", age: 42, city: "New York", hobby: "Singing"] - assertTrue(map.find{ it.value == "New York"}.key == "city") + when: + def find = map.find { it.value == "New York" } + def finaAll = map.findAll { it.value == "New York" } + def grep = map.grep { it.value == "New York" } + def every = map.every { it -> it.value instanceof String } + def any = map.any { it -> it.value instanceof String } - assertTrue(map.findAll{ it.value == "New York"} == [city : "New York"]) + then: + find.key == "city" - map.grep{it.value == "New York"}.each{ it -> assertTrue(it.key == "city" && it.value == "New York")} + finaAll instanceof Map + finaAll == [city: "New York"] - assertTrue(map.every{it -> it.value instanceof String} == false) + grep instanceof Collection + grep.each { it -> assert it.key == "city" && it.value == "New York" } - assertTrue(map.any{it -> it.value instanceof String} == true) + every instanceof Boolean + !every + + any instanceof Boolean + any } - @Test - void collect(){ - - def map = [1: [name:"Jerry", age: 42, city: "New York"], - 2: [name:"Long", age: 25, city: "New York"], - 3: [name:"Dustin", age: 29, city: "New York"], - 4: [name:"Dustin", age: 34, city: "New York"]] - - def names = map.collect{entry -> entry.value.name} // returns only list - assertTrue(names == ["Jerry", "Long", "Dustin", "Dustin"]) - - def uniqueNames = map.collect([] as HashSet){entry -> entry.value.name} - assertTrue(uniqueNames == ["Jerry", "Long", "Dustin"] as Set) - - def idNames = map.collectEntries{key, value -> [key, value.name]} - assertTrue(idNames == [1:"Jerry", 2: "Long", 3:"Dustin", 4: "Dustin"]) - - def below30Names = map.findAll{it.value.age < 30}.collect{key, value -> value.name} - assertTrue(below30Names == ["Long", "Dustin"]) + def "collect"() { + given: + def map = [ + 1: [name: "Jerry", age: 42, city: "New York"], + 2: [name: "Long", age: 25, city: "New York"], + 3: [name: "Dustin", age: 29, city: "New York"], + 4: [name: "Dustin", age: 34, city: "New York"] + ] + when: + def names = map.collect { entry -> entry.value.name } // returns only list + def uniqueNames = map.collect { entry -> entry.value.name } + .unique() + def idNames = map.collectEntries { key, value -> [key, value.name] } + def below30Names = map.findAll { it.value.age < 30 } + .collect { key, value -> value.name } + then: + names == ["Jerry", "Long", "Dustin", "Dustin"] + uniqueNames == ["Jerry", "Long", "Dustin"] + idNames == [1: "Jerry", 2: "Long", 3: "Dustin", 4: "Dustin"] + below30Names == ["Long", "Dustin"] } - @Test - void group(){ - def map = [1:20, 2: 40, 3: 11, 4: 93] - - def subMap = map.groupBy{it.value % 2} - println subMap - assertTrue(subMap == [0:[1:20, 2:40 ], 1:[3:11, 4:93]]) + def "group"() { + given: + def map = [1: 20, 2: 40, 3: 11, 4: 93] + when: + def subMap = map.groupBy { it.value % 2 } def keySubMap = map.subMap([1, 2]) - assertTrue(keySubMap == [1:20, 2:40]) + then: + subMap == [0: [1: 20, 2: 40], 1: [3: 11, 4: 93]] + keySubMap == [1: 20, 2: 40] } - @Test - void sorting(){ - def map = [ab:20, a: 40, cb: 11, ba: 93] + def "sorting"() { + given: + def map = [ab: 20, a: 40, cb: 11, ba: 93] + when: def naturallyOrderedMap = map.sort() - assertTrue([a:40, ab:20, ba:93, cb:11] == naturallyOrderedMap) - def compSortedMap = map.sort({ k1, k2 -> k1 <=> k2 } as Comparator) - assertTrue([a:40, ab:20, ba:93, cb:11] == compSortedMap) - def cloSortedMap = map.sort({ it1, it2 -> it1.value <=> it1.value }) - assertTrue([cb:11, ab:20, a:40, ba:93] == cloSortedMap) + then: + naturallyOrderedMap == [a: 40, ab: 20, ba: 93, cb: 11] + compSortedMap == [a: 40, ab: 20, ba: 93, cb: 11] + cloSortedMap == [cb: 11, ab: 20, a: 40, ba: 93] } - } From 76fb5b02e0ef7a04fdf14940852522d0acfc0d76 Mon Sep 17 00:00:00 2001 From: Alex Golub Date: Fri, 20 Jan 2023 18:27:09 +0200 Subject: [PATCH 323/592] Finding Elements in Collections in Groovy: refactor to use spock testing framework --- .../com/baeldung/find/ListFindUnitTest.groovy | 71 ++++++------ .../com/baeldung/find/MapFindUnitTest.groovy | 105 +++++++++--------- .../groovy/com/baeldung/find/Person.groovy | 39 +------ .../com/baeldung/find/SetFindUnitTest.groovy | 17 ++- 4 files changed, 104 insertions(+), 128 deletions(-) diff --git a/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/find/ListFindUnitTest.groovy b/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/find/ListFindUnitTest.groovy index 82a2138be4..325cf18c5f 100644 --- a/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/find/ListFindUnitTest.groovy +++ b/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/find/ListFindUnitTest.groovy @@ -1,58 +1,57 @@ package com.baeldung.find -import com.baeldung.find.Person -import org.junit.Test +import spock.lang.Specification -import static org.junit.Assert.* +class ListFindUnitTest extends Specification { -class ListFindUnitTest { - - private final personList = [ - new Person("Regina", "Fitzpatrick", 25), - new Person("Abagail", "Ballard", 26), - new Person("Lucian", "Walter", 30), + final personList = [ + new Person("Regina", "Fitzpatrick", 25), + new Person("Abagail", "Ballard", 26), + new Person("Lucian", "Walter", 30), ] - @Test - void whenListContainsElement_thenCheckReturnsTrue() { + def "whenListContainsElement_thenCheckReturnsTrue"() { + given: def list = ['a', 'b', 'c'] - assertTrue(list.indexOf('a') > -1) - assertTrue(list.contains('a')) + expect: + list.indexOf('a') > -1 + list.contains('a') } - @Test - void whenListContainsElement_thenCheckWithMembershipOperatorReturnsTrue() { + def "whenListContainsElement_thenCheckWithMembershipOperatorReturnsTrue"() { + given: def list = ['a', 'b', 'c'] - assertTrue('a' in list) + expect: + 'a' in list } - @Test - void givenListOfPerson_whenUsingStreamMatching_thenShouldEvaluateList() { - assertTrue(personList.stream().anyMatch {it.age > 20}) - assertFalse(personList.stream().allMatch {it.age < 30}) + def "givenListOfPerson_whenUsingStreamMatching_thenShouldEvaluateList"() { + expect: + personList.stream().anyMatch { it.age > 20 } + !personList.stream().allMatch { it.age < 30 } } - @Test - void givenListOfPerson_whenUsingCollectionMatching_thenShouldEvaluateList() { - assertTrue(personList.any {it.age > 20}) - assertFalse(personList.every {it.age < 30}) + def "givenListOfPerson_whenUsingCollectionMatching_thenShouldEvaluateList"() { + expect: + personList.any { it.age > 20 } + !personList.every { it.age < 30 } } - @Test - void givenListOfPerson_whenUsingStreamFind_thenShouldReturnMatchingElements() { - assertTrue(personList.stream().filter {it.age > 20}.findAny().isPresent()) - assertFalse(personList.stream().filter {it.age > 30}.findAny().isPresent()) - assertTrue(personList.stream().filter {it.age > 20}.findAll().size() == 3) - assertTrue(personList.stream().filter {it.age > 30}.findAll().isEmpty()) + def "givenListOfPerson_whenUsingStreamFind_thenShouldReturnMatchingElements"() { + expect: + personList.stream().filter { it.age > 20 }.findAny().isPresent() + !personList.stream().filter { it.age > 30 }.findAny().isPresent() + personList.stream().filter { it.age > 20 }.findAll().size() == 3 + personList.stream().filter { it.age > 30 }.findAll().isEmpty() } - @Test - void givenListOfPerson_whenUsingCollectionFind_thenShouldReturnMatchingElements() { - assertNotNull(personList.find {it.age > 20}) - assertNull(personList.find {it.age > 30}) - assertTrue(personList.findAll {it.age > 20}.size() == 3) - assertTrue(personList.findAll {it.age > 30}.isEmpty()) + def "givenListOfPerson_whenUsingCollectionFind_thenShouldReturnMatchingElements"() { + expect: + personList.find { it.age > 20 } == new Person("Regina", "Fitzpatrick", 25) + personList.find { it.age > 30 } == null + personList.findAll { it.age > 20 }.size() == 3 + personList.findAll { it.age > 30 }.isEmpty() } } diff --git a/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/find/MapFindUnitTest.groovy b/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/find/MapFindUnitTest.groovy index 16e231182b..74d85ad71b 100644 --- a/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/find/MapFindUnitTest.groovy +++ b/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/find/MapFindUnitTest.groovy @@ -1,76 +1,81 @@ package com.baeldung.find -import com.baeldung.find.Person -import org.junit.Test +import spock.lang.Specification -import static org.junit.Assert.* +class MapFindUnitTest extends Specification { -class MapFindUnitTest { - - private final personMap = [ - Regina : new Person("Regina", "Fitzpatrick", 25), - Abagail: new Person("Abagail", "Ballard", 26), - Lucian : new Person("Lucian", "Walter", 30) + final personMap = [ + Regina: new Person("Regina", "Fitzpatrick", 25), + Abagail: new Person("Abagail", "Ballard", 26), + Lucian: new Person("Lucian", "Walter", 30) ] - @Test - void whenMapContainsKeyElement_thenCheckReturnsTrue() { + def "whenMapContainsKeyElement_thenCheckReturnsTrue"() { + given: def map = [a: 'd', b: 'e', c: 'f'] - assertTrue(map.containsKey('a')) - assertFalse(map.containsKey('e')) - assertTrue(map.containsValue('e')) + expect: + map.containsKey('a') + !map.containsKey('e') + map.containsValue('e') } - @Test - void whenMapContainsKeyElement_thenCheckByMembershipReturnsTrue() { + def "whenMapContainsKeyElement_thenCheckByMembershipReturnsTrue"() { + given: def map = [a: 'd', b: 'e', c: 'f'] - assertTrue('a' in map) - assertFalse('f' in map) + expect: + 'a' in map + 'f' !in map } - @Test - void whenMapContainsFalseBooleanValues_thenCheckReturnsFalse() { + def "whenMapContainsFalseBooleanValues_thenCheckReturnsFalse"() { + given: def map = [a: true, b: false, c: null] - assertTrue(map.containsKey('b')) - assertTrue('a' in map) - assertFalse('b' in map) - assertFalse('c' in map) + expect: + map.containsKey('b') + 'a' in map + 'b' !in map // get value of key 'b' and does the assertion + 'c' !in map } - @Test - void givenMapOfPerson_whenUsingStreamMatching_thenShouldEvaluateMap() { - assertTrue(personMap.keySet().stream().anyMatch {it == "Regina"}) - assertFalse(personMap.keySet().stream().allMatch {it == "Albert"}) - assertFalse(personMap.values().stream().allMatch {it.age < 30}) - assertTrue(personMap.entrySet().stream().anyMatch {it.key == "Abagail" && it.value.lastname == "Ballard"}) + def "givenMapOfPerson_whenUsingStreamMatching_thenShouldEvaluateMap"() { + expect: + personMap.keySet().stream() + .anyMatch { it == "Regina" } + !personMap.keySet().stream() + .allMatch { it == "Albert" } + !personMap.values().stream() + .allMatch { it.age < 30 } + personMap.entrySet().stream() + .anyMatch { it.key == "Abagail" && it.value.lastname == "Ballard" } } - @Test - void givenMapOfPerson_whenUsingCollectionMatching_thenShouldEvaluateMap() { - assertTrue(personMap.keySet().any {it == "Regina"}) - assertFalse(personMap.keySet().every {it == "Albert"}) - assertFalse(personMap.values().every {it.age < 30}) - assertTrue(personMap.any {firstname, person -> firstname == "Abagail" && person.lastname == "Ballard"}) + def "givenMapOfPerson_whenUsingCollectionMatching_thenShouldEvaluateMap"() { + expect: + personMap.keySet().any { it == "Regina" } + !personMap.keySet().every { it == "Albert" } + !personMap.values().every { it.age < 30 } + personMap.any { firstname, person -> firstname == "Abagail" && person.lastname == "Ballard" } } - @Test - void givenMapOfPerson_whenUsingCollectionFind_thenShouldReturnElements() { - assertNotNull(personMap.find {it.key == "Abagail" && it.value.lastname == "Ballard"}) - assertTrue(personMap.findAll {it.value.age > 20}.size() == 3) + def "givenMapOfPerson_whenUsingCollectionFind_thenShouldReturnElements"() { + expect: + personMap.find { it.key == "Abagail" && it.value.lastname == "Ballard" } + personMap.findAll { it.value.age > 20 }.size() == 3 } - @Test - void givenMapOfPerson_whenUsingStreamFind_thenShouldReturnElements() { - assertTrue( - personMap.entrySet().stream() - .filter {it.key == "Abagail" && it.value.lastname == "Ballard"} - .findAny().isPresent()) - assertTrue( - personMap.entrySet().stream() - .filter {it.value.age > 20} - .findAll().size() == 3) + def "givenMapOfPerson_whenUsingStreamFind_thenShouldReturnElements"() { + expect: + personMap.entrySet().stream() + .filter { it.key == "Abagail" && it.value.lastname == "Ballard" } + .findAny() + .isPresent() + + personMap.entrySet().stream() + .filter { it.value.age > 20 } + .findAll() + .size() == 3 } } diff --git a/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/find/Person.groovy b/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/find/Person.groovy index e65826363a..a9266c4079 100644 --- a/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/find/Person.groovy +++ b/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/find/Person.groovy @@ -1,37 +1,10 @@ package com.baeldung.find +import groovy.transform.Canonical + +@Canonical class Person { - private String firstname - private String lastname - private Integer age - - Person(String firstname, String lastname, Integer age) { - this.firstname = firstname - this.lastname = lastname - this.age = age - } - - String getFirstname() { - return firstname - } - - void setFirstname(String firstname) { - this.firstname = firstname - } - - String getLastname() { - return lastname - } - - void setLastname(String lastname) { - this.lastname = lastname - } - - Integer getAge() { - return age - } - - void setAge(Integer age) { - this.age = age - } + String firstname + String lastname + Integer age } diff --git a/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/find/SetFindUnitTest.groovy b/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/find/SetFindUnitTest.groovy index d2d03d5427..d82cf689d3 100644 --- a/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/find/SetFindUnitTest.groovy +++ b/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/find/SetFindUnitTest.groovy @@ -1,16 +1,15 @@ package com.baeldung.find -import org.junit.Test +import spock.lang.Specification -import static org.junit.Assert.assertTrue +class SetFindUnitTest extends Specification { -class SetFindUnitTest { - - @Test - void whenSetContainsElement_thenCheckReturnsTrue() { + def "whenSetContainsElement_thenCheckReturnsTrue"() { + given: def set = ['a', 'b', 'c'] as Set - assertTrue(set.contains('a')) - assertTrue('a' in set) + expect: + set.contains('a') + 'a' in set } -} \ No newline at end of file +} From 66feff149a0cdc43f8fc9637d51f629248d60655 Mon Sep 17 00:00:00 2001 From: Alex Golub Date: Fri, 20 Jan 2023 19:17:04 +0200 Subject: [PATCH 324/592] Lists in Groovy: refactor to use spock testing framework --- .../com/baeldung/lists/ListUnitTest.groovy | 222 +++++++++--------- 1 file changed, 110 insertions(+), 112 deletions(-) diff --git a/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/lists/ListUnitTest.groovy b/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/lists/ListUnitTest.groovy index e4c0a0c177..5baa19f360 100644 --- a/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/lists/ListUnitTest.groovy +++ b/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/lists/ListUnitTest.groovy @@ -1,173 +1,171 @@ package com.baeldung.lists -import static groovy.test.GroovyAssert.* -import org.junit.Test +import spock.lang.Specification -class ListUnitTest { - - @Test - void testCreateList() { +class ListUnitTest extends Specification { + def "testCreateList"() { + when: def list = [1, 2, 3] - assertNotNull(list) - def listMix = ['A', "b", 1, true] - assertTrue(listMix == ['A', "b", 1, true]) - def linkedList = [1, 2, 3] as LinkedList - assertTrue(linkedList instanceof LinkedList) - ArrayList arrList = [1, 2, 3] - assertTrue(arrList.class == ArrayList) - def copyList = new ArrayList(arrList) - assertTrue(copyList == arrList) - def cloneList = arrList.clone() - assertTrue(cloneList == arrList) + + then: + list + listMix == ['A', "b", 1, true] + linkedList instanceof LinkedList + arrList.class == ArrayList + copyList == arrList + cloneList == arrList } - @Test - void testCreateEmptyList() { - + def "testCreateEmptyList"() { + when: def emptyList = [] - assertTrue(emptyList.size() == 0) + + then: + emptyList.isEmpty() } - @Test - void testCompareTwoLists() { - + def "testCompareTwoLists"() { + when: def list1 = [5, 6.0, 'p'] def list2 = [5, 6.0, 'p'] - assertTrue(list1 == list2) + + then: + list1 == list2 } - @Test - void testGetItemsFromList(){ - + def "testGetItemsFromList"() { + when: def list = ["Hello", "World"] - assertTrue(list.get(1) == "World") - assertTrue(list[1] == "World") - assertTrue(list[-1] == "World") - assertTrue(list.getAt(1) == "World") - assertTrue(list.getAt(-2) == "Hello") + then: + list.get(1) == "World" + list[1] == "World" + list[-1] == "World" + list.getAt(1) == "World" + list.getAt(-2) == "Hello" } - @Test - void testAddItemsToList() { + def "testAddItemsToList"() { + given: + def list1 = [] + def list2 = [] + def list3 = [1, 2] - def list = [] + when: + list1 << 1 // [1] + list1.add("Apple") // [1, "Apple"] - list << 1 - list.add("Apple") - assertTrue(list == [1, "Apple"]) + list2[2] = "Box" // [null, "Box"] + list2[4] = true // [null, "Box", null, true] - list[2] = "Box" - list[4] = true - assertTrue(list == [1, "Apple", "Box", null, true]) + list1.add(1, 6.0) // [1, 6.0, "Apple"] + list1 += list3 // [1, 6.0, "Apple", 1, 2] + list1 += 12 // [1, 6.0, "Apple", 1, 2, 12] - list.add(1, 6.0) - assertTrue(list == [1, 6.0, "Apple", "Box", null, true]) - - def list2 = [1, 2] - list += list2 - list += 12 - assertTrue(list == [1, 6.0, "Apple", "Box", null, true, 1, 2, 12]) + then: + list1 == [1, 6.0, "Apple", 1, 2, 12] + list2 == [null, null, "Box", null, true] } - @Test - void testUpdateItemsInList() { + def "testUpdateItemsInList"() { + given: + def list = [1, "Apple", 80, "App"] - def list =[1, "Apple", 80, "App"] + when: list[1] = "Box" - list.set(2,90) - assertTrue(list == [1, "Box", 90, "App"]) + list.set(2, 90) + + then: + list == [1, "Box", 90, "App"] } - @Test - void testRemoveItemsFromList(){ - + def "testRemoveItemsFromList"() { + given: def list = [1, 2, 3, 4, 5, 5, 6, 6, 7] - list.remove(3) - assertTrue(list == [1, 2, 3, 5, 5, 6, 6, 7]) + when: + list.remove(3) // [1, 2, 3, 5, 5, 6, 6, 7] + list.removeElement(5) // [1, 2, 3, 5, 6, 6, 7] + list = list - 6 // [1, 2, 3, 5, 7] - list.removeElement(5) - assertTrue(list == [1, 2, 3, 5, 6, 6, 7]) - - assertTrue(list - 6 == [1, 2, 3, 5, 7]) + then: + list == [1, 2, 3, 5, 7] } - @Test - void testIteratingOnAList(){ - + def "testIteratingOnAList"() { + given: def list = [1, "App", 3, 4] - list.each{ println it * 2} - list.eachWithIndex{ it, i -> println "$i : $it" } + expect: + list.each { println it * 2 } + list.eachWithIndex { it, i -> println "$i : $it" } } - @Test - void testCollectingToAnotherList(){ - + def "testCollectingToAnotherList"() { + given: def list = ["Kay", "Henry", "Justin", "Tom"] - assertTrue(list.collect{"Hi " + it} == ["Hi Kay", "Hi Henry", "Hi Justin", "Hi Tom"]) + + when: + def collect = list.collect { "Hi " + it } + + then: + collect == ["Hi Kay", "Hi Henry", "Hi Justin", "Hi Tom"] } - @Test - void testJoinItemsInAList(){ - assertTrue(["One", "Two", "Three"].join(",") == "One,Two,Three") + def "testJoinItemsInAList"() { + expect: + ["One", "Two", "Three"].join(",") == "One,Two,Three" } - @Test - void testFilteringOnLists(){ + def "testFilteringOnLists"() { + given: def filterList = [2, 1, 3, 4, 5, 6, 76] - - assertTrue(filterList.find{it > 3} == 4) - - assertTrue(filterList.findAll{it > 3} == [4, 5, 6, 76]) - - assertTrue(filterList.findAll{ it instanceof Number} == [2, 1, 3, 4, 5, 6, 76]) - - assertTrue(filterList.grep( Number )== [2, 1, 3, 4, 5, 6, 76]) - - assertTrue(filterList.grep{ it> 6 }== [76]) - def conditionList = [2, 1, 3, 4, 5, 6, 76] - assertFalse(conditionList.every{ it < 6}) - - assertTrue(conditionList.any{ it%2 == 0}) + expect: + filterList.find { it > 3 } == 4 + filterList.findAll { it > 3 } == [4, 5, 6, 76] + filterList.findAll { it instanceof Number } == [2, 1, 3, 4, 5, 6, 76] + filterList.grep(Number) == [2, 1, 3, 4, 5, 6, 76] + filterList.grep { it > 6 } == [76] + !(conditionList.every { it < 6 }) + conditionList.any { it % 2 == 0 } } - @Test - void testGetUniqueItemsInAList(){ - assertTrue([1, 3, 3, 4].toUnique() == [1, 3, 4]) - + def "testGetUniqueItemsInAList"() { + given: def uniqueList = [1, 3, 3, 4] - uniqueList.unique() - assertTrue(uniqueList == [1, 3, 4]) - assertTrue(["A", "B", "Ba", "Bat", "Cat"].toUnique{ it.size()} == ["A", "Ba", "Bat"]) + when: + uniqueList.unique(true) + + then: + [1, 3, 3, 4].toUnique() == [1, 3, 4] + uniqueList == [1, 3, 4] + ["A", "B", "Ba", "Bat", "Cat"].toUnique { it.size() } == ["A", "Ba", "Bat"] } - @Test - void testSorting(){ - - assertTrue([1, 2, 1, 0].sort() == [0, 1, 1, 2]) - Comparator mc = {a,b -> a == b? 0: a < b? 1 : -1} - + def "testSorting"() { + given: + Comparator naturalOrder = { a, b -> a == b ? 0 : a < b ? -1 : 1 } def list = [1, 2, 1, 0] - list.sort(mc) - assertTrue(list == [2, 1, 1, 0]) - def strList = ["na", "ppp", "as"] - assertTrue(strList.max() == "ppp") - - Comparator minc = {a,b -> a == b? 0: a < b? -1 : 1} def numberList = [3, 2, 0, 7] - assertTrue(numberList.min(minc) == 0) + + when: + list.sort(naturalOrder.reversed()) + + then: + list == [2, 1, 1, 0] + strList.max() == "ppp" + [1, 2, 1, 0].sort() == [0, 1, 1, 2] + numberList.min(naturalOrder) == 0 } -} \ No newline at end of file +} From f6fa7f8909e5ad1089463d905cbc4928b585371e Mon Sep 17 00:00:00 2001 From: Alex Golub Date: Fri, 20 Jan 2023 19:25:34 +0200 Subject: [PATCH 325/592] A Quick Guide to Iterating a Map in Groovy: refactor to use spock testing framework --- .../iteratemap/IterateMapUnitTest.groovy | 81 ++++++------------- 1 file changed, 25 insertions(+), 56 deletions(-) diff --git a/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/iteratemap/IterateMapUnitTest.groovy b/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/iteratemap/IterateMapUnitTest.groovy index 970203ce85..4cbcaee2d8 100644 --- a/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/iteratemap/IterateMapUnitTest.groovy +++ b/core-groovy-modules/core-groovy-collections/src/test/groovy/com/baeldung/iteratemap/IterateMapUnitTest.groovy @@ -1,85 +1,54 @@ package com.baeldung.iteratemap -import com.baeldung.find.Person -import org.junit.Test +import spock.lang.Specification -import static org.junit.Assert.* +class IterateMapUnitTest extends Specification { -class IterateMapUnitTest { - - @Test - void whenUsingEach_thenMapIsIterated() { - def map = [ - 'FF0000' : 'Red', - '00FF00' : 'Lime', - '0000FF' : 'Blue', - 'FFFF00' : 'Yellow' - ] + final Map map = [ + 'FF0000': 'Red', + '00FF00': 'Lime', + '0000FF': 'Blue', + 'FFFF00': 'Yellow', + 'E6E6FA': 'Lavender', + 'D8BFD8': 'Thistle', + 'DDA0DD': 'Plum', + ] + def "whenUsingEach_thenMapIsIterated"() { + expect: map.each { println "Hex Code: $it.key = Color Name: $it.value" } } - @Test - void whenUsingEachWithEntry_thenMapIsIterated() { - def map = [ - 'E6E6FA' : 'Lavender', - 'D8BFD8' : 'Thistle', - 'DDA0DD' : 'Plum', - ] - + def "whenUsingEachWithEntry_thenMapIsIterated"() { + expect: map.each { entry -> println "Hex Code: $entry.key = Color Name: $entry.value" } } - @Test - void whenUsingEachWithKeyAndValue_thenMapIsIterated() { - def map = [ - '000000' : 'Black', - 'FFFFFF' : 'White', - '808080' : 'Gray' - ] - + def "whenUsingEachWithKeyAndValue_thenMapIsIterated"() { + expect: map.each { key, val -> println "Hex Code: $key = Color Name $val" } } - @Test - void whenUsingEachWithIndexAndEntry_thenMapIsIterated() { - def map = [ - '800080' : 'Purple', - '4B0082' : 'Indigo', - '6A5ACD' : 'Slate Blue' - ] - + def "whenUsingEachWithIndexAndEntry_thenMapIsIterated"() { + expect: map.eachWithIndex { entry, index -> - def indent = ((index == 0 || index % 2 == 0) ? " " : "") + def indent = index % 2 == 0 ? " " : "" println "$indent Hex Code: $entry.key = Color Name: $entry.value" } } - @Test - void whenUsingEachWithIndexAndKeyAndValue_thenMapIsIterated() { - def map = [ - 'FFA07A' : 'Light Salmon', - 'FF7F50' : 'Coral', - 'FF6347' : 'Tomato', - 'FF4500' : 'Orange Red' - ] - + def "whenUsingEachWithIndexAndKeyAndValue_thenMapIsIterated"() { + expect: map.eachWithIndex { key, val, index -> - def indent = ((index == 0 || index % 2 == 0) ? " " : "") + def indent = index % 2 == 0 ? " " : "" println "$indent Hex Code: $key = Color Name: $val" } } - @Test - void whenUsingForLoop_thenMapIsIterated() { - def map = [ - '2E8B57' : 'Seagreen', - '228B22' : 'Forest Green', - '008000' : 'Green' - ] - + def "whenUsingForLoop_thenMapIsIterated"() { + expect: for (entry in map) { println "Hex Code: $entry.key = Color Name: $entry.value" } From 41d8fffcc715fbea16c2601e9d571471849b6b2a Mon Sep 17 00:00:00 2001 From: Alex Golub Date: Fri, 20 Jan 2023 20:04:48 +0200 Subject: [PATCH 326/592] How to Remove a Prefix From Strings in Groovy: refactor to use spock testing framework --- .../removeprefix/RemovePrefixTest.groovy | 72 ++++++++++--------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/core-groovy-modules/core-groovy-strings/src/test/groovy/com/baeldung/removeprefix/RemovePrefixTest.groovy b/core-groovy-modules/core-groovy-strings/src/test/groovy/com/baeldung/removeprefix/RemovePrefixTest.groovy index 61b81fe1b2..8b7ce9c355 100644 --- a/core-groovy-modules/core-groovy-strings/src/test/groovy/com/baeldung/removeprefix/RemovePrefixTest.groovy +++ b/core-groovy-modules/core-groovy-strings/src/test/groovy/com/baeldung/removeprefix/RemovePrefixTest.groovy @@ -1,70 +1,74 @@ package com.baeldung.removeprefix -import org.junit.Assert -import org.junit.Test +import spock.lang.Specification -class RemovePrefixTest { +class RemovePrefixTest extends Specification { - - @Test - public void whenCasePrefixIsRemoved_thenReturnTrue() { + def "whenCasePrefixIsRemoved_thenReturnTrue"() { + given: def trimPrefix = { it.startsWith('Groovy-') ? it.minus('Groovy-') : it } - + + when: def actual = trimPrefix("Groovy-Tutorials at Baeldung") def expected = "Tutorials at Baeldung" - Assert.assertEquals(expected, actual) + then: + expected == actual } - @Test - public void whenPrefixIsRemoved_thenReturnTrue() { - + def "whenPrefixIsRemoved_thenReturnTrue"() { + given: String prefix = "groovy-" String trimPrefix = "Groovy-Tutorials at Baeldung" - def actual; - if(trimPrefix.startsWithIgnoreCase(prefix)) { + + when: + def actual + if (trimPrefix.startsWithIgnoreCase(prefix)) { actual = trimPrefix.substring(prefix.length()) } - def expected = "Tutorials at Baeldung" - Assert.assertEquals(expected, actual) + then: + expected == actual } - @Test - public void whenPrefixIsRemovedUsingRegex_thenReturnTrue() { - + def "whenPrefixIsRemovedUsingRegex_thenReturnTrue"() { + given: def regex = ~"^([Gg])roovy-" String trimPrefix = "Groovy-Tutorials at Baeldung" + + when: String actual = trimPrefix - regex - def expected = "Tutorials at Baeldung" - Assert.assertEquals(expected, actual) + then: + expected == actual } - @Test - public void whenPrefixIsRemovedUsingReplaceFirst_thenReturnTrue() { - def regex = ~"^groovy" - String trimPrefix = "groovyTutorials at Baeldung's groovy page" + def "whenPrefixIsRemovedUsingReplaceFirst_thenReturnTrue"() { + given: + def regex = ~"^groovy" + String trimPrefix = "groovyTutorials at Baeldung's groovy page" + + when: String actual = trimPrefix.replaceFirst(regex, "") - def expected = "Tutorials at Baeldung's groovy page" - - Assert.assertEquals(expected, actual) + + then: + expected == actual } - @Test - public void whenPrefixIsRemovedUsingReplaceAll_thenReturnTrue() { - + def "whenPrefixIsRemovedUsingReplaceAll_thenReturnTrue"() { + given: String trimPrefix = "groovyTutorials at Baeldung groovy" + + when: String actual = trimPrefix.replaceAll(/^groovy/, "") - def expected = "Tutorials at Baeldung groovy" - Assert.assertEquals(expected, actual) + then: + expected == actual } - -} \ No newline at end of file +} From 63b714f00fcadc827f42d961da0bfa948466c274 Mon Sep 17 00:00:00 2001 From: Kumar Prabhash Anand Date: Fri, 20 Jan 2023 19:14:23 +0100 Subject: [PATCH 327/592] BAEL-6073 added scylladb code (#13307) * BAEL-6073 added scylladb code * BAEL-6073 renamed test class name --- persistence-modules/scylladb/pom.xml | 85 ++++++++++++++++++ .../scylladb/ScylladbApplication.java | 89 +++++++++++++++++++ .../com/baeldung/scylladb/model/User.java | 17 ++++ .../src/main/resources/application.yml | 3 + .../scylladb/ScyllaDBApplicationLiveTest.java | 68 ++++++++++++++ .../src/test/resources/application.yml | 3 + 6 files changed, 265 insertions(+) create mode 100644 persistence-modules/scylladb/pom.xml create mode 100644 persistence-modules/scylladb/src/main/java/com/baeldung/scylladb/ScylladbApplication.java create mode 100644 persistence-modules/scylladb/src/main/java/com/baeldung/scylladb/model/User.java create mode 100644 persistence-modules/scylladb/src/main/resources/application.yml create mode 100644 persistence-modules/scylladb/src/test/java/com/baeldung/scylladb/ScyllaDBApplicationLiveTest.java create mode 100644 persistence-modules/scylladb/src/test/resources/application.yml diff --git a/persistence-modules/scylladb/pom.xml b/persistence-modules/scylladb/pom.xml new file mode 100644 index 0000000000..e457c75d91 --- /dev/null +++ b/persistence-modules/scylladb/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + com.baeldung.examples.scylladb + scylladb + 0.0.1-SNAPSHOT + scylladb + Sample ScyllaDB Project + + 1.17.6 + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + org.springframework.boot + spring-boot-starter + + + com.scylladb + java-driver-core + 4.14.1.0 + + + com.scylladb + java-driver-query-builder + 4.14.1.0 + + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.testcontainers + testcontainers + test + + + org.testcontainers + junit-jupiter + test + + + + + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/persistence-modules/scylladb/src/main/java/com/baeldung/scylladb/ScylladbApplication.java b/persistence-modules/scylladb/src/main/java/com/baeldung/scylladb/ScylladbApplication.java new file mode 100644 index 0000000000..3e6cea7ed2 --- /dev/null +++ b/persistence-modules/scylladb/src/main/java/com/baeldung/scylladb/ScylladbApplication.java @@ -0,0 +1,89 @@ +package com.baeldung.scylladb; + +import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.insertInto; +import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.literal; +import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.selectFrom; +import static com.datastax.oss.driver.api.querybuilder.SchemaBuilder.createKeyspace; +import static com.datastax.oss.driver.api.querybuilder.SchemaBuilder.createTable; + +import java.util.ArrayList; +import java.util.List; + +import com.baeldung.scylladb.model.User; +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.cql.ResultSet; +import com.datastax.oss.driver.api.core.cql.Row; +import com.datastax.oss.driver.api.core.cql.SimpleStatement; +import com.datastax.oss.driver.api.core.type.DataTypes; +import com.datastax.oss.driver.api.querybuilder.insert.InsertInto; +import com.datastax.oss.driver.api.querybuilder.schema.CreateKeyspaceStart; +import com.datastax.oss.driver.api.querybuilder.schema.CreateTableStart; +import com.datastax.oss.driver.api.querybuilder.select.Select; + +public class ScylladbApplication { + + private String keySpaceName; + private String tableName; + + public ScylladbApplication(String keySpaceName, String tableName) { + this.keySpaceName = keySpaceName; + this.tableName = tableName; + CreateKeyspaceStart createKeyspace = createKeyspace(keySpaceName); + SimpleStatement keypaceStatement = createKeyspace.ifNotExists() + .withSimpleStrategy(3) + .build(); + + CreateTableStart createTable = createTable(keySpaceName, tableName); + SimpleStatement tableStatement = createTable.ifNotExists() + .withPartitionKey("id", DataTypes.BIGINT) + .withColumn("name", DataTypes.TEXT) + .build(); + + try (CqlSession session = CqlSession.builder().build()) { + ResultSet rs = session.execute(keypaceStatement); + if (null == rs.getExecutionInfo().getErrors() || rs.getExecutionInfo().getErrors().isEmpty()) { + rs = session.execute(tableStatement); + } + } + } + + public List getAllUserNames() { + List userNames = new ArrayList<>(); + try (CqlSession session = CqlSession.builder().build()) { + String query = String.format("select * from %s.%s",keySpaceName,tableName); + ResultSet rs = session.execute(query); + for (Row r : rs.all()) + userNames.add(r.getString("name")); + } + return userNames; + } + + public List getUsersByUserName(String userName) { + List userList = new ArrayList<>(); + try (CqlSession session = CqlSession.builder().build()) { + Select query = selectFrom(keySpaceName, tableName).all() + .whereColumn("name") + .isEqualTo(literal(userName)) + .allowFiltering(); + SimpleStatement statement = query.build(); + ResultSet rs = session.execute(statement); + for (Row r : rs) + userList.add(new User(r.getLong("id"), r.getString("name"))); + } + return userList; + } + + public boolean addNewUser(User user) { + boolean response = false; + try (CqlSession session = CqlSession.builder().build()) { + InsertInto insert = insertInto(keySpaceName, tableName); + SimpleStatement statement = insert.value("id", literal(user.getId())) + .value("name", literal(user.getName())) + .build(); + ResultSet rs = session.execute(statement); + response = null == rs.getExecutionInfo().getErrors() || rs.getExecutionInfo().getErrors().isEmpty(); + } + return response; + } + +} diff --git a/persistence-modules/scylladb/src/main/java/com/baeldung/scylladb/model/User.java b/persistence-modules/scylladb/src/main/java/com/baeldung/scylladb/model/User.java new file mode 100644 index 0000000000..28d60112b9 --- /dev/null +++ b/persistence-modules/scylladb/src/main/java/com/baeldung/scylladb/model/User.java @@ -0,0 +1,17 @@ +package com.baeldung.scylladb.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class User { + + private long id; + + private String name; +} diff --git a/persistence-modules/scylladb/src/main/resources/application.yml b/persistence-modules/scylladb/src/main/resources/application.yml new file mode 100644 index 0000000000..3a4abad3dd --- /dev/null +++ b/persistence-modules/scylladb/src/main/resources/application.yml @@ -0,0 +1,3 @@ +datastax-java-driver: + basic: + contact-points: 127.0.0.1:9042 \ No newline at end of file diff --git a/persistence-modules/scylladb/src/test/java/com/baeldung/scylladb/ScyllaDBApplicationLiveTest.java b/persistence-modules/scylladb/src/test/java/com/baeldung/scylladb/ScyllaDBApplicationLiveTest.java new file mode 100644 index 0000000000..4e3cb00a41 --- /dev/null +++ b/persistence-modules/scylladb/src/test/java/com/baeldung/scylladb/ScyllaDBApplicationLiveTest.java @@ -0,0 +1,68 @@ +package com.baeldung.scylladb; + +import static org.junit.Assert.assertEquals; + +import java.util.List; +import java.util.function.Consumer; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; + +import com.baeldung.scylladb.model.User; +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.PortBinding; +import com.github.dockerjava.api.model.Ports; + +@Testcontainers +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class ScyllaDBApplicationLiveTest { + + private static final String IMAGE_NAME = "scylladb/scylla"; + private static final int hostPort = 9042; + private static final int containerExposedPort = 9042; + private static Consumer cmd = e -> e.withPortBindings(new PortBinding(Ports.Binding.bindPort(hostPort), + new ExposedPort(containerExposedPort))); + + @Container + private static final GenericContainer scyllaDbContainer = new GenericContainer(DockerImageName.parse(IMAGE_NAME)) + .withExposedPorts(containerExposedPort) + .withCreateContainerCmdModifier(cmd); + + private ScylladbApplication scylladbApplication; + + @BeforeAll + void setUp() { + scylladbApplication = new ScylladbApplication("baeldung", "User"); + } + + @Test + public void givenKeySpaceAndTable_whenInsertData_thenShouldBeAbleToFindData() { + User user = new User(10, "John"); + scylladbApplication.addNewUser(user); + + List userList = scylladbApplication.getUsersByUserName("John"); + assertEquals(1, userList.size()); + assertEquals("John", userList.get(0).getName()); + assertEquals(10, userList.get(0).getId()); + + } + + @Test + public void givenKeySpaceAndTable_whenInsertData_thenRowCountIncreases() { + int initialCount = scylladbApplication.getAllUserNames().size(); + User user = new User(11, "Doe"); + scylladbApplication.addNewUser(user); + + int expectedCount = initialCount+1; + int updatedCount = scylladbApplication.getAllUserNames().size(); + assertEquals(expectedCount, updatedCount); + + } + +} diff --git a/persistence-modules/scylladb/src/test/resources/application.yml b/persistence-modules/scylladb/src/test/resources/application.yml new file mode 100644 index 0000000000..3a4abad3dd --- /dev/null +++ b/persistence-modules/scylladb/src/test/resources/application.yml @@ -0,0 +1,3 @@ +datastax-java-driver: + basic: + contact-points: 127.0.0.1:9042 \ No newline at end of file From 54a6c6c61d18a8f2cdc8b3cb6c0faf0346c3eb05 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Sat, 21 Jan 2023 15:50:19 +0530 Subject: [PATCH 328/592] fixed backlink --- axon/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/axon/README.md b/axon/README.md index 5db38a7c94..2dad554110 100644 --- a/axon/README.md +++ b/axon/README.md @@ -20,4 +20,4 @@ Two scripts are included to easily start middleware using Docker matching the pr - [Multi-Entity Aggregates in Axon](https://www.baeldung.com/java-axon-multi-entity-aggregates) - [Snapshotting Aggregates in Axon](https://www.baeldung.com/axon-snapshotting-aggregates) - [Dispatching Queries in Axon Framework](https://www.baeldung.com/axon-query-dispatching) -- [Persisting the Query Model](https://www.baeldung.com/persisting-the-query-model) +- [Persisting the Query Model](https://www.baeldung.com/axon-persisting-query-model) From 5835814337c37dca43df1da1c50a615486e45b15 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Sat, 21 Jan 2023 15:52:19 +0530 Subject: [PATCH 329/592] backlink fixed --- jmeter/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jmeter/README.md b/jmeter/README.md index e53f411cdb..76d329342d 100644 --- a/jmeter/README.md +++ b/jmeter/README.md @@ -54,4 +54,4 @@ Enjoy it :) - [Configure Jenkins to Run and Show JMeter Tests](https://www.baeldung.com/ops/jenkins-and-jmeter) - [Write Extracted Data to a File Using JMeter](https://www.baeldung.com/jmeter-write-to-file) - [Basic Authentication in JMeter](https://www.baeldung.com/jmeter-basic-auth) -- [JMeter: Latency vs. Load Time](https://www.baeldung.com/java-jmeter-latency-vs-load-time/) +- [JMeter: Latency vs. Load Time](https://www.baeldung.com/java-jmeter-latency-vs-load-time) From 3b770c4deeeffbd8dbd2a00338c6086f4c3e2fc2 Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Sat, 21 Jan 2023 16:16:18 +0100 Subject: [PATCH 330/592] BAEL-6044: Fix the IllegalArgumentException: No enum const class (#13171) --- .../exception/noenumconst/Priority.java | 13 +++++++ .../exception/noenumconst/PriorityUtils.java | 21 +++++++++++ .../noenumconst/PriorityUtilsUnitTest.java | 36 +++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/noenumconst/Priority.java create mode 100644 core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/noenumconst/PriorityUtils.java create mode 100644 core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/noenumconst/PriorityUtilsUnitTest.java diff --git a/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/noenumconst/Priority.java b/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/noenumconst/Priority.java new file mode 100644 index 0000000000..ff9591b1e0 --- /dev/null +++ b/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/noenumconst/Priority.java @@ -0,0 +1,13 @@ +package com.baeldung.exception.noenumconst; + +public enum Priority { + + HIGH("High"), MEDIUM("Medium"), LOW("Low"); + + private String name; + + Priority(String name) { + this.name = name; + } + +} diff --git a/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/noenumconst/PriorityUtils.java b/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/noenumconst/PriorityUtils.java new file mode 100644 index 0000000000..8d7004bf39 --- /dev/null +++ b/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/noenumconst/PriorityUtils.java @@ -0,0 +1,21 @@ +package com.baeldung.exception.noenumconst; + +public class PriorityUtils { + + public static Priority getByName(String name) { + return Priority.valueOf(name); + } + + public static Priority getByUpperCaseName(String name) { + if (name == null || name.isEmpty()) { + return null; + } + + return Priority.valueOf(name.toUpperCase()); + } + + public static void main(String[] args) { + System.out.println(getByName("Low")); + } + +} diff --git a/core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/noenumconst/PriorityUtilsUnitTest.java b/core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/noenumconst/PriorityUtilsUnitTest.java new file mode 100644 index 0000000000..1ff9c49015 --- /dev/null +++ b/core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/noenumconst/PriorityUtilsUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.exception.noenumconst; + +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 org.junit.jupiter.api.Test; + +class PriorityUtilsUnitTest { + + @Test + void givenCustomName_whenUsingGetByName_thenThrowIllegalArgumentException() { + assertThrows(IllegalArgumentException.class, () -> PriorityUtils.getByName("Low")); + } + + @Test + void givenCustomName_whenUsingGetByUpperCaseName_thenReturnEnumConstant() { + assertEquals(Priority.HIGH, PriorityUtils.getByUpperCaseName("High")); + } + + @Test + void givenInvalidCustomName_whenUsingGetByUpperCaseName_thenThrowIllegalArgumentException() { + assertThrows(IllegalArgumentException.class, () -> PriorityUtils.getByUpperCaseName("invalid")); + } + + @Test + void givenEmptyName_whenUsingGetByUpperCaseName_thenReturnNull() { + assertNull(PriorityUtils.getByUpperCaseName("")); + } + + @Test + void givenNull_whenUsingGetByUpperCaseName_thenReturnNull() { + assertNull(PriorityUtils.getByUpperCaseName(null)); + } + +} From fa6b78233c56d6f6f1d1d33024f5bf0ed1cea958 Mon Sep 17 00:00:00 2001 From: Vali Tuguran Date: Sun, 22 Jan 2023 05:39:34 +0100 Subject: [PATCH 331/592] BAEL-6040 Add Java List tests. (#13255) * BAEL-6040 Add list interface example. * BAEL-6040 Updated list iterator. * BAEL-6040 Removed logger import. * BAEL-6040 Added List interface tests. * BAEL-6040 Update tests success names. * BAEL-6040 Small names refactoring. * BAEL-6040 Add new core-java-collections-5 module. * BAEL-6040 Create module core-java-collections-list-5. * BAEL-6040 Create module core-java-collections-list-5. --- .../core-java-collections-list-5/README.md | 5 + .../core-java-collections-list-5/pom.xml | 35 +++++ .../com/baeldung/java/list/ListUnitTest.java | 126 ++++++++++++++++++ 3 files changed, 166 insertions(+) create mode 100644 core-java-modules/core-java-collections-list-5/README.md create mode 100644 core-java-modules/core-java-collections-list-5/pom.xml create mode 100644 core-java-modules/core-java-collections-list-5/src/test/java/com/baeldung/java/list/ListUnitTest.java diff --git a/core-java-modules/core-java-collections-list-5/README.md b/core-java-modules/core-java-collections-list-5/README.md new file mode 100644 index 0000000000..4b7fbf8669 --- /dev/null +++ b/core-java-modules/core-java-collections-list-5/README.md @@ -0,0 +1,5 @@ +## Core Java Collections List (Part 5) + +This module contains articles about the Java List collection + +### Relevant Articles: \ 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 new file mode 100644 index 0000000000..0807f7612c --- /dev/null +++ b/core-java-modules/core-java-collections-list-5/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + core-java-collections-list-5 + 0.1.0-SNAPSHOT + core-java-collections-list-5 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + commons-lang + commons-lang + ${commons-lang.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + 2.2 + 3.12.0 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-list-5/src/test/java/com/baeldung/java/list/ListUnitTest.java b/core-java-modules/core-java-collections-list-5/src/test/java/com/baeldung/java/list/ListUnitTest.java new file mode 100644 index 0000000000..2222bc5a6f --- /dev/null +++ b/core-java-modules/core-java-collections-list-5/src/test/java/com/baeldung/java/list/ListUnitTest.java @@ -0,0 +1,126 @@ +package com.baeldung.java.list; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; + +import org.junit.Test; + +public class ListUnitTest { + + @Test + public void givenAFruitList_whenAddNewFruit_thenFruitIsAdded(){ + List fruits = new ArrayList<>(); + assertEquals("Unexpected number of fruits in the list, should have been 0", 0, fruits.size()); + + fruits.add("Apple"); + assertEquals("Unexpected number of fruits in the list, should have been 1", 1, fruits.size()); + } + + @Test + public void givenAFruitList_whenContainsFruit_thenFruitIsInTheList(){ + List fruits = new ArrayList<>(); + + fruits.add("Apple"); + assertTrue("Apple should be in the fruit list", fruits.contains("Apple")); + assertFalse("Banana should not be in the fruit list", fruits.contains("Banana")); + } + + @Test + public void givenAnEmptyFruitList_whenEmptyCheck_thenListIsEmpty(){ + List fruits = new ArrayList<>(); + assertTrue("Fruit list should be empty", fruits.isEmpty()); + + fruits.add("Apple"); + assertFalse("Fruit list should not be empty", fruits.isEmpty()); + } + + @Test + public void givenAFruitList_whenIterateOverIt_thenFruitsAreInOrder(){ + List fruits = new ArrayList<>(); + + fruits.add("Apple"); // fruit at index 0 + fruits.add("Orange");// fruit at index 1 + fruits.add("Banana");// fruit at index 2 + int index = 0; + for (Iterator it = fruits.listIterator(); it.hasNext(); ) { + String fruit = it.next(); + assertEquals("Fruits should be in order", fruits.get(index++), fruit); + } + } + + @Test + public void givenAFruitList_whenRemoveFruit_thenFruitIsRemoved(){ + List fruits = new ArrayList<>(); + + fruits.add("Apple"); + fruits.add("Orange"); + assertEquals("Unexpected number of fruits in the list, should have been 2", 2, fruits.size()); + + fruits.remove("Apple"); + assertEquals("Unexpected number of fruits in the list, should have been 1", 1, fruits.size()); + } + + @Test + public void givenAFruitList_whenSetFruit_thenFruitIsUpdated(){ + List fruits = new ArrayList<>(); + + fruits.add("Apple"); + fruits.add("Orange"); + + fruits.set(0, "Banana"); + assertEquals("Fruit at index 0 should be Banana", "Banana", fruits.get(0)); + } + + @Test + public void givenAFruitList_whenSort_thenFruitsAreSorted(){ + List fruits = new ArrayList<>(); + + fruits.add("Apple"); + fruits.add("Orange"); + fruits.add("Banana"); + + fruits.sort(Comparator.naturalOrder()); + + assertEquals("Fruit at index 0 should be Apple", "Apple", fruits.get(0)); + assertEquals("Fruit at index 1 should be Banana", "Banana", fruits.get(1)); + assertEquals("Fruit at index 2 should be Orange", "Orange", fruits.get(2)); + } + + @Test + public void givenAFruitList_whenSublist_thenWeGetASublist(){ + List fruits = new ArrayList<>(); + + fruits.add("Apple"); + fruits.add("Orange"); + fruits.add("Banana"); + + List fruitsSublist = fruits.subList(0, 2); + assertEquals("Unexpected number of fruits in the sublist, should have been 2", 2, fruitsSublist.size()); + + assertEquals("Fruit at index 0 should be Apple", "Apple", fruitsSublist.get(0)); + assertEquals("Fruit at index 1 should be Orange", "Orange", fruitsSublist.get(1)); + } + + @Test + public void givenAFruitList_whenToArray_thenWeGetAnArray(){ + List fruits = new ArrayList<>(); + + fruits.add("Apple"); + fruits.add("Orange"); + fruits.add("Banana"); + + String[] fruitsArray = fruits.toArray(new String[0]); + assertEquals("Unexpected number of fruits in the array, should have been 3", 3, fruitsArray.length); + + assertEquals("Fruit at index 0 should be Apple", "Apple", fruitsArray[0]); + assertEquals("Fruit at index 1 should be Orange", "Orange", fruitsArray[1]); + assertEquals("Fruit at index 2 should be Banana", "Banana", fruitsArray[2]); + } + +} From b958c3fdcb28c5ff2a75d1e15740a7f7cdcfafb0 Mon Sep 17 00:00:00 2001 From: brokenhardisk Date: Sun, 22 Jan 2023 12:48:56 +0100 Subject: [PATCH 332/592] BAEL-5942 Code changes (#13147) * BAEL-5942 Code changes * BAEL-5942 Code changes * BAEL-5942 Code updates from Review * BAEL-5942 Code updates from Review * BAEL-5942 Code updates from Review * BAEL-5942 Code updates from Review * BAEL-5942 Code updates from Review * BAEL-5942 Code updates from Review * BAEL-5942 Test updates from Review * BAEL-5942 Test updates from Review * BAEL-5942 Test updates from Review --- spring-web-modules/pom.xml | 1 + spring-web-modules/spring-mvc-file/.gitignore | 9 +++ spring-web-modules/spring-mvc-file/README.md | 9 +++ spring-web-modules/spring-mvc-file/pom.xml | 50 ++++++++++++++++ .../main/java/com/baeldung/Application.java | 11 ++++ .../baeldung/file/CustomMultipartFile.java | 60 +++++++++++++++++++ .../file/CustomMultipartFileUnitTest.java | 49 +++++++++++++++ 7 files changed, 189 insertions(+) create mode 100644 spring-web-modules/spring-mvc-file/.gitignore create mode 100644 spring-web-modules/spring-mvc-file/README.md create mode 100644 spring-web-modules/spring-mvc-file/pom.xml create mode 100644 spring-web-modules/spring-mvc-file/src/main/java/com/baeldung/Application.java create mode 100644 spring-web-modules/spring-mvc-file/src/main/java/com/baeldung/file/CustomMultipartFile.java create mode 100644 spring-web-modules/spring-mvc-file/src/test/java/com/baeldung/file/CustomMultipartFileUnitTest.java diff --git a/spring-web-modules/pom.xml b/spring-web-modules/pom.xml index 047dbaaad0..a9970e85c0 100644 --- a/spring-web-modules/pom.xml +++ b/spring-web-modules/pom.xml @@ -23,6 +23,7 @@ spring-mvc-basics-4 spring-mvc-basics-5 spring-mvc-crash + spring-mvc-file spring-mvc-forms-jsp spring-mvc-forms-thymeleaf spring-mvc-java diff --git a/spring-web-modules/spring-mvc-file/.gitignore b/spring-web-modules/spring-mvc-file/.gitignore new file mode 100644 index 0000000000..da9ec604ff --- /dev/null +++ b/spring-web-modules/spring-mvc-file/.gitignore @@ -0,0 +1,9 @@ +*.class + +#folders# +/target + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-file/README.md b/spring-web-modules/spring-mvc-file/README.md new file mode 100644 index 0000000000..c1622f80c2 --- /dev/null +++ b/spring-web-modules/spring-mvc-file/README.md @@ -0,0 +1,9 @@ +## Spring MVC File + + + +### The Course + + +### Relevant Articles: + diff --git a/spring-web-modules/spring-mvc-file/pom.xml b/spring-web-modules/spring-mvc-file/pom.xml new file mode 100644 index 0000000000..c6b063c785 --- /dev/null +++ b/spring-web-modules/spring-mvc-file/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + spring-mvc-file + 0.1-SNAPSHOT + spring-mvc-file + jar + + + 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 + + + commons-io + commons-io + ${commons-io.version} + + + + + + spring-mvc-file + + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.Application + JAR + + + + + + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-file/src/main/java/com/baeldung/Application.java b/spring-web-modules/spring-mvc-file/src/main/java/com/baeldung/Application.java new file mode 100644 index 0000000000..d58049fb35 --- /dev/null +++ b/spring-web-modules/spring-mvc-file/src/main/java/com/baeldung/Application.java @@ -0,0 +1,11 @@ +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-web-modules/spring-mvc-file/src/main/java/com/baeldung/file/CustomMultipartFile.java b/spring-web-modules/spring-mvc-file/src/main/java/com/baeldung/file/CustomMultipartFile.java new file mode 100644 index 0000000000..c68729588f --- /dev/null +++ b/spring-web-modules/spring-mvc-file/src/main/java/com/baeldung/file/CustomMultipartFile.java @@ -0,0 +1,60 @@ +package com.baeldung.file; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.springframework.web.multipart.MultipartFile; + +public class CustomMultipartFile implements MultipartFile { + private byte[] input; + + public CustomMultipartFile(byte[] input) { + this.input = input; + } + + @Override + public String getName() { + return null; + } + + @Override + public String getOriginalFilename() { + return null; + } + + @Override + public String getContentType() { + return null; + } + + @Override + public boolean isEmpty() { + return input == null || input.length == 0; + } + + @Override + public long getSize() { + return input.length; + } + + @Override + public byte[] getBytes() throws IOException { + return input; + } + + @Override + public InputStream getInputStream() throws IOException { + return new ByteArrayInputStream(input); + } + + @Override + public void transferTo(File destination) throws IOException, IllegalStateException { + try(FileOutputStream fos = new FileOutputStream(destination)) { + fos.write(input); + } + } + +} diff --git a/spring-web-modules/spring-mvc-file/src/test/java/com/baeldung/file/CustomMultipartFileUnitTest.java b/spring-web-modules/spring-mvc-file/src/test/java/com/baeldung/file/CustomMultipartFileUnitTest.java new file mode 100644 index 0000000000..1aa07766ca --- /dev/null +++ b/spring-web-modules/spring-mvc-file/src/test/java/com/baeldung/file/CustomMultipartFileUnitTest.java @@ -0,0 +1,49 @@ +package com.baeldung.file; + +import java.io.IOException; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.mock.web.MockMultipartFile; + +class CustomMultipartFileUnitTest { + + @Test + void whenProvidingByteArray_thenMultipartFileCreated() throws IOException { + byte[] inputArray = "Test String".getBytes(); + CustomMultipartFile customMultipartFile = new CustomMultipartFile(inputArray); + Assertions.assertFalse(customMultipartFile.isEmpty()); + Assertions.assertArrayEquals(inputArray, customMultipartFile.getBytes()); + Assertions.assertEquals(inputArray.length, customMultipartFile.getSize()); + } + + @Test + void whenProvidingEmptyByteArray_thenMockMultipartFileIsEmpty() throws IOException { + byte[] inputArray = "".getBytes(); + MockMultipartFile mockMultipartFile = new MockMultipartFile("tempFileName", inputArray); + Assertions.assertTrue(mockMultipartFile.isEmpty()); + } + + @Test + void whenProvidingNullByteArray_thenMockMultipartFileIsEmpty() throws IOException { + byte[] inputArray = null; + MockMultipartFile mockMultipartFile = new MockMultipartFile("tempFileName", inputArray); + Assertions.assertTrue(mockMultipartFile.isEmpty()); + } + + @Test + void whenProvidingByteArray_thenMultipartFileInputSizeMatches() throws IOException { + byte[] inputArray = "Testing String".getBytes(); + CustomMultipartFile customMultipartFile = new CustomMultipartFile(inputArray); + Assertions.assertEquals(inputArray.length, customMultipartFile.getSize()); + } + + @Test + void whenProvidingByteArray_thenMockMultipartFileCreated() throws IOException { + byte[] inputArray = "Test String".getBytes(); + MockMultipartFile mockMultipartFile = new MockMultipartFile("tempFileName", inputArray); + Assertions.assertFalse(mockMultipartFile.isEmpty()); + Assertions.assertArrayEquals(inputArray, mockMultipartFile.getBytes()); + Assertions.assertEquals(inputArray.length, mockMultipartFile.getSize()); + } +} From e6685e5dac69dbd136554835caaa78d67ae590ff Mon Sep 17 00:00:00 2001 From: jsgrah-spring Date: Mon, 23 Jan 2023 09:22:37 +0100 Subject: [PATCH 333/592] Fix The PR that is merged here is causing some other integration tests to fail in the same module (#13331) * JAVA-14459, GitHub Issue: Reactive WebSocket App example no longer works. * JAVA-14459, Move spring5 reactive webflux filters to its own module. Co-authored-by: jogra --- spring-reactive-modules/pom.xml | 1 + .../spring-5-reactive-filters/.gitignore | 12 ++++ .../spring-5-reactive-filters/README.md | 15 ++++ .../spring-5-reactive-filters/pom.xml | 68 +++++++++++++++++++ .../Spring5ReactiveFiltersApplication.java | 13 ++++ .../filters/ExampleHandlerFilterFunction.java | 0 .../reactive/filters/ExampleWebFilter.java | 0 .../reactive/filters/PlayerHandler.java | 0 .../reactive/filters/PlayerRouter.java | 0 .../reactive/filters/UserController.java | 0 .../src/main/resources/application.properties | 1 + .../src/main/resources/logback.xml | 13 ++++ .../java/com/baeldung/SpringContextTest.java | 17 +++++ .../filters/PlayerHandlerIntegrationTest.java | 0 .../UserControllerIntegrationTest.java | 0 15 files changed, 140 insertions(+) create mode 100644 spring-reactive-modules/spring-5-reactive-filters/.gitignore create mode 100644 spring-reactive-modules/spring-5-reactive-filters/README.md create mode 100644 spring-reactive-modules/spring-5-reactive-filters/pom.xml create mode 100644 spring-reactive-modules/spring-5-reactive-filters/src/main/java/com/baeldung/reactive/Spring5ReactiveFiltersApplication.java rename spring-reactive-modules/{spring-5-reactive => spring-5-reactive-filters}/src/main/java/com/baeldung/reactive/filters/ExampleHandlerFilterFunction.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-5-reactive-filters}/src/main/java/com/baeldung/reactive/filters/ExampleWebFilter.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-5-reactive-filters}/src/main/java/com/baeldung/reactive/filters/PlayerHandler.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-5-reactive-filters}/src/main/java/com/baeldung/reactive/filters/PlayerRouter.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-5-reactive-filters}/src/main/java/com/baeldung/reactive/filters/UserController.java (100%) create mode 100644 spring-reactive-modules/spring-5-reactive-filters/src/main/resources/application.properties create mode 100644 spring-reactive-modules/spring-5-reactive-filters/src/main/resources/logback.xml create mode 100644 spring-reactive-modules/spring-5-reactive-filters/src/test/java/com/baeldung/SpringContextTest.java rename spring-reactive-modules/{spring-5-reactive => spring-5-reactive-filters}/src/test/java/com/baeldung/reactive/filters/PlayerHandlerIntegrationTest.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-5-reactive-filters}/src/test/java/com/baeldung/reactive/filters/UserControllerIntegrationTest.java (100%) diff --git a/spring-reactive-modules/pom.xml b/spring-reactive-modules/pom.xml index 0d9ea6bf5d..c8c9c84394 100644 --- a/spring-reactive-modules/pom.xml +++ b/spring-reactive-modules/pom.xml @@ -23,6 +23,7 @@ spring-5-reactive-3 spring-5-reactive-client spring-5-reactive-client-2 + spring-5-reactive-filters spring-5-reactive-oauth spring-5-reactive-security spring-reactive diff --git a/spring-reactive-modules/spring-5-reactive-filters/.gitignore b/spring-reactive-modules/spring-5-reactive-filters/.gitignore new file mode 100644 index 0000000000..dec013dfa4 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-filters/.gitignore @@ -0,0 +1,12 @@ +#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-filters/README.md b/spring-reactive-modules/spring-5-reactive-filters/README.md new file mode 100644 index 0000000000..aa8d2800e2 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-filters/README.md @@ -0,0 +1,15 @@ +## Spring 5 Reactive Project + +This module contains articles about reactive Spring 5 + +### 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) +- [Spring WebFlux Filters](https://www.baeldung.com/spring-webflux-filters) +- [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) diff --git a/spring-reactive-modules/spring-5-reactive-filters/pom.xml b/spring-reactive-modules/spring-5-reactive-filters/pom.xml new file mode 100644 index 0000000000..c9503d631a --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-filters/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + spring-5-reactive-filters + 0.0.1-SNAPSHOT + spring-5-reactive-filters + 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-webflux + + + + + org.springframework.boot + spring-boot-devtools + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-test + test + + + io.projectreactor + reactor-test + test + + + + + io.netty + netty-all + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.reactive.Spring5ReactiveFiltersApplication + JAR + + + + + + \ No newline at end of file diff --git a/spring-reactive-modules/spring-5-reactive-filters/src/main/java/com/baeldung/reactive/Spring5ReactiveFiltersApplication.java b/spring-reactive-modules/spring-5-reactive-filters/src/main/java/com/baeldung/reactive/Spring5ReactiveFiltersApplication.java new file mode 100644 index 0000000000..41f95a274c --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-filters/src/main/java/com/baeldung/reactive/Spring5ReactiveFiltersApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.reactive; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Spring5ReactiveFiltersApplication{ + + public static void main(String[] args) { + SpringApplication.run(Spring5ReactiveFiltersApplication.class, args); + } + +} diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/filters/ExampleHandlerFilterFunction.java b/spring-reactive-modules/spring-5-reactive-filters/src/main/java/com/baeldung/reactive/filters/ExampleHandlerFilterFunction.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/filters/ExampleHandlerFilterFunction.java rename to spring-reactive-modules/spring-5-reactive-filters/src/main/java/com/baeldung/reactive/filters/ExampleHandlerFilterFunction.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/filters/ExampleWebFilter.java b/spring-reactive-modules/spring-5-reactive-filters/src/main/java/com/baeldung/reactive/filters/ExampleWebFilter.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/filters/ExampleWebFilter.java rename to spring-reactive-modules/spring-5-reactive-filters/src/main/java/com/baeldung/reactive/filters/ExampleWebFilter.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/filters/PlayerHandler.java b/spring-reactive-modules/spring-5-reactive-filters/src/main/java/com/baeldung/reactive/filters/PlayerHandler.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/filters/PlayerHandler.java rename to spring-reactive-modules/spring-5-reactive-filters/src/main/java/com/baeldung/reactive/filters/PlayerHandler.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/filters/PlayerRouter.java b/spring-reactive-modules/spring-5-reactive-filters/src/main/java/com/baeldung/reactive/filters/PlayerRouter.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/filters/PlayerRouter.java rename to spring-reactive-modules/spring-5-reactive-filters/src/main/java/com/baeldung/reactive/filters/PlayerRouter.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/filters/UserController.java b/spring-reactive-modules/spring-5-reactive-filters/src/main/java/com/baeldung/reactive/filters/UserController.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/filters/UserController.java rename to spring-reactive-modules/spring-5-reactive-filters/src/main/java/com/baeldung/reactive/filters/UserController.java diff --git a/spring-reactive-modules/spring-5-reactive-filters/src/main/resources/application.properties b/spring-reactive-modules/spring-5-reactive-filters/src/main/resources/application.properties new file mode 100644 index 0000000000..4b49e8e8a2 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-filters/src/main/resources/application.properties @@ -0,0 +1 @@ +logging.level.root=INFO \ No newline at end of file diff --git a/spring-reactive-modules/spring-5-reactive-filters/src/main/resources/logback.xml b/spring-reactive-modules/spring-5-reactive-filters/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-filters/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/spring-reactive-modules/spring-5-reactive-filters/src/test/java/com/baeldung/SpringContextTest.java b/spring-reactive-modules/spring-5-reactive-filters/src/test/java/com/baeldung/SpringContextTest.java new file mode 100644 index 0000000000..3e026ef45f --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-filters/src/test/java/com/baeldung/SpringContextTest.java @@ -0,0 +1,17 @@ +package com.baeldung; + +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.reactive.Spring5ReactiveFiltersApplication; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Spring5ReactiveFiltersApplication.class) +public class SpringContextTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/reactive/filters/PlayerHandlerIntegrationTest.java b/spring-reactive-modules/spring-5-reactive-filters/src/test/java/com/baeldung/reactive/filters/PlayerHandlerIntegrationTest.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/reactive/filters/PlayerHandlerIntegrationTest.java rename to spring-reactive-modules/spring-5-reactive-filters/src/test/java/com/baeldung/reactive/filters/PlayerHandlerIntegrationTest.java diff --git a/spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/reactive/filters/UserControllerIntegrationTest.java b/spring-reactive-modules/spring-5-reactive-filters/src/test/java/com/baeldung/reactive/filters/UserControllerIntegrationTest.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/reactive/filters/UserControllerIntegrationTest.java rename to spring-reactive-modules/spring-5-reactive-filters/src/test/java/com/baeldung/reactive/filters/UserControllerIntegrationTest.java From 629582c27bfc3b8ddce011e2b85b5fe862a27f2f Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 23 Jan 2023 10:47:03 +0000 Subject: [PATCH 334/592] [JAVA-15036] Upgraded to apache client 5.2 (#13334) Co-authored-by: panagiotiskakos --- .../httpclient/HttpClientTimeoutLiveTest.java | 192 +++++++++++------- .../HttpClientTimeoutV4LiveTest.java | 116 +++++++++++ 2 files changed, 233 insertions(+), 75 deletions(-) create mode 100644 httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientTimeoutLiveTest.java b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientTimeoutLiveTest.java index 8bd7042dc6..ab80d5665f 100644 --- a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientTimeoutLiveTest.java +++ b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientTimeoutLiveTest.java @@ -1,129 +1,171 @@ package com.baeldung.httpclient; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.when; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + import java.io.IOException; import java.util.Timer; import java.util.TimerTask; +import java.util.concurrent.TimeUnit; -import org.apache.http.HttpResponse; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.params.ClientPNames; -import org.apache.http.config.SocketConfig; -import org.apache.http.conn.ConnectTimeoutException; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.params.CoreConnectionPNames; -import org.apache.http.params.HttpParams; -import org.junit.After; -import org.junit.Ignore; -import org.junit.Test; +import org.apache.hc.client5.http.ConnectTimeoutException; +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.config.ConnectionConfig; +import org.apache.hc.client5.http.config.RequestConfig; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; -public class HttpClientTimeoutLiveTest { +import org.apache.hc.client5.http.impl.io.BasicHttpClientConnectionManager; - private CloseableHttpResponse response; +import org.apache.hc.core5.http.HttpStatus; +import org.apache.hc.core5.http.io.SocketConfig; +import org.apache.hc.core5.util.Timeout; - @After - public final void after() throws IllegalStateException, IOException { - ResponseUtil.closeResponse(response); - } - // tests - @Test - public final void givenUsingOldApi_whenSettingTimeoutViaParameter_thenCorrect() throws IOException { - - DefaultHttpClient httpClient = new DefaultHttpClient(); - int timeout = 5; // seconds - HttpParams httpParams = httpClient.getParams(); - httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout * 1000); - httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout * 1000); - httpParams.setParameter(ClientPNames.CONN_MANAGER_TIMEOUT, new Long(timeout * 1000)); - - final HttpGet request = new HttpGet("http://www.github.com"); - HttpResponse execute = httpClient.execute(request); - assertThat(execute.getStatusLine().getStatusCode(), equalTo(200)); - } +import com.baeldung.handler.CustomHttpClientResponseHandler; + +class HttpClientTimeoutLiveTest { @Test - public final void givenUsingNewApi_whenSettingTimeoutViaRequestConfig_thenCorrect() throws IOException { - final int timeout = 2; - final RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build(); - final CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build(); - final HttpGet request = new HttpGet("http://www.github.com"); - - response = client.execute(request); - - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); - } - - @Test - public final void givenUsingNewApi_whenSettingTimeoutViaSocketConfig_thenCorrect() throws IOException { + void givenUsingNewApi_whenSettingTimeoutViaHighLevelApi_thenCorrect() throws IOException { final int timeout = 2; - final SocketConfig config = SocketConfig.custom().setSoTimeout(timeout * 1000).build(); - final CloseableHttpClient client = HttpClientBuilder.create().setDefaultSocketConfig(config).build(); + ConnectionConfig connConfig = ConnectionConfig.custom() + .setConnectTimeout(timeout, TimeUnit.MILLISECONDS) + .setSocketTimeout(timeout, TimeUnit.MILLISECONDS) + .build(); + + RequestConfig requestConfig = RequestConfig.custom() + .setConnectionRequestTimeout(Timeout.ofMilliseconds(2000L)) + .build(); + + BasicHttpClientConnectionManager cm = new BasicHttpClientConnectionManager(); + cm.setConnectionConfig(connConfig); + final HttpGet request = new HttpGet("http://www.github.com"); - response = client.execute(request); + try (CloseableHttpClient client = HttpClientBuilder.create() + .setDefaultRequestConfig(requestConfig) + .setConnectionManager(cm) + .build(); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(request, new CustomHttpClientResponseHandler())) { + + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } } @Test - public final void givenUsingNewApi_whenSettingTimeoutViaHighLevelApi_thenCorrect() throws IOException { - final int timeout = 5; + void givenUsingNewApi_whenSettingTimeoutViaSocketConfig_thenCorrect() throws IOException { + final int timeout = 2000; + final SocketConfig config = SocketConfig.custom().setSoTimeout(timeout, TimeUnit.MILLISECONDS).build(); - final RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build(); - final CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build(); + BasicHttpClientConnectionManager cm = new BasicHttpClientConnectionManager(); + cm.setSocketConfig(config); final HttpGet request = new HttpGet("http://www.github.com"); - response = client.execute(request); + try (CloseableHttpClient client = HttpClientBuilder.create() + .setConnectionManager(cm) + .build(); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(request, new CustomHttpClientResponseHandler())) { + + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } } + /** * This simulates a timeout against a domain with multiple routes/IPs to it (not a single raw IP) */ - @Test(expected = ConnectTimeoutException.class) - @Ignore - public final void givenTimeoutIsConfigured_whenTimingOut_thenTimeoutException() throws IOException { + @Disabled + void givenTimeoutIsConfigured_whenTimingOut_thenTimeoutException() throws IOException { final int timeout = 3; - final RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build(); - final CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build(); + ConnectionConfig connConfig = ConnectionConfig.custom() + .setConnectTimeout(timeout, TimeUnit.MILLISECONDS) + .setSocketTimeout(timeout, TimeUnit.MILLISECONDS) + .build(); + + RequestConfig requestConfig = RequestConfig.custom() + .setConnectionRequestTimeout(Timeout.ofMilliseconds(3000L)) + .build(); + + BasicHttpClientConnectionManager cm = new BasicHttpClientConnectionManager(); + cm.setConnectionConfig(connConfig); final HttpGet request = new HttpGet("http://www.google.com:81"); - client.execute(request); + + assertThrows(ConnectTimeoutException.class, () -> { + try (CloseableHttpClient client = HttpClientBuilder.create() + .setDefaultRequestConfig(requestConfig) + .setConnectionManager(cm) + .build(); + + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(request, new CustomHttpClientResponseHandler())) { + + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } + }); } @Test - public void whenSecuredRestApiIsConsumed_then200OK() throws IOException { - CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + void whenSecuredRestApiIsConsumed_then200OK() throws IOException { + int timeout = 20000; // milliseconds + + ConnectionConfig connConfig = ConnectionConfig.custom() + .setConnectTimeout(timeout, TimeUnit.MILLISECONDS) + .setSocketTimeout(timeout, TimeUnit.MILLISECONDS) + .build(); + + RequestConfig requestConfig = RequestConfig.custom() + .setConnectionRequestTimeout(Timeout.ofMilliseconds(20000L)) + .build(); - int timeout = 20; // seconds - RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(timeout * 1000) - .setConnectTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build(); HttpGet getMethod = new HttpGet("http://localhost:8082/httpclient-simple/api/bars/1"); getMethod.setConfig(requestConfig); - int hardTimeout = 5; // seconds + + BasicHttpClientConnectionManager cm = new BasicHttpClientConnectionManager(); + cm.setConnectionConfig(connConfig); + + int hardTimeout = 5000; // milliseconds TimerTask task = new TimerTask() { @Override public void run() { getMethod.abort(); } }; - new Timer(true).schedule(task, hardTimeout * 1000); + new Timer(true).schedule(task, hardTimeout); + + try (CloseableHttpClient client = HttpClientBuilder.create() + .setDefaultRequestConfig(requestConfig) + .setConnectionManager(cm) + .build(); + + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(getMethod, new CustomHttpClientResponseHandler())) { + + final int statusCode = response.getCode(); + System.out.println("HTTP Status of response: " + statusCode); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } - HttpResponse response = httpClient.execute(getMethod); - System.out.println("HTTP Status of response: " + response.getStatusLine().getStatusCode()); } } diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java new file mode 100644 index 0000000000..9bf523590e --- /dev/null +++ b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java @@ -0,0 +1,116 @@ +package com.baeldung.httpclient; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.io.IOException; +import java.util.Timer; +import java.util.TimerTask; + +import org.apache.http.HttpResponse; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.config.SocketConfig; +import org.apache.http.conn.ConnectTimeoutException; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +class HttpClientTimeoutV4LiveTest { + + private CloseableHttpResponse response; + + @AfterEach + public final void after() throws IllegalStateException, IOException { + ResponseUtil.closeResponse(response); + } + + + @Test + void givenUsingNewApi_whenSettingTimeoutViaRequestConfig_thenCorrect() throws IOException { + final int timeout = 2; + final RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build(); + final CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build(); + final HttpGet request = new HttpGet("http://www.github.com"); + + response = client.execute(request); + + assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + } + + @Test + void givenUsingNewApi_whenSettingTimeoutViaSocketConfig_thenCorrect() throws IOException { + final int timeout = 2; + + final SocketConfig config = SocketConfig.custom().setSoTimeout(timeout * 1000).build(); + final CloseableHttpClient client = HttpClientBuilder.create().setDefaultSocketConfig(config).build(); + + final HttpGet request = new HttpGet("http://www.github.com"); + + response = client.execute(request); + + assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + } + + @Test + void givenUsingNewApi_whenSettingTimeoutViaHighLevelApi_thenCorrect() throws IOException { + final int timeout = 5; + + final RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build(); + final CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build(); + + final HttpGet request = new HttpGet("http://www.github.com"); + + response = client.execute(request); + + assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + } + + /** + * This simulates a timeout against a domain with multiple routes/IPs to it (not a single raw IP) + */ + @Test + @Disabled + public final void givenTimeoutIsConfigured_whenTimingOut_thenTimeoutException() throws IOException { + final int timeout = 3; + + final RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build(); + final CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build(); + + final HttpGet request = new HttpGet("http://www.google.com:81"); + + assertThrows(ConnectTimeoutException.class, () -> { + client.execute(request); + }); + + } + + @Test + void whenSecuredRestApiIsConsumed_then200OK() throws IOException { + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + + int timeout = 20; // seconds + RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(timeout * 1000) + .setConnectTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build(); + HttpGet getMethod = new HttpGet("http://localhost:8082/httpclient-simple/api/bars/1"); + getMethod.setConfig(requestConfig); + + int hardTimeout = 5; // seconds + TimerTask task = new TimerTask() { + @Override + public void run() { + getMethod.abort(); + } + }; + new Timer(true).schedule(task, hardTimeout * 1000); + + HttpResponse response = httpClient.execute(getMethod); + System.out.println("HTTP Status of response: " + response.getStatusLine().getStatusCode()); + } + +} From 4b3a69326368118fe3a0e8f6540b89a30e5c2d41 Mon Sep 17 00:00:00 2001 From: hajarrs Date: Mon, 23 Jan 2023 14:34:39 +0100 Subject: [PATCH 335/592] Check If Command Line Arguments Are Null in Java (#13246) --- .../commandline/CommandLineWithErrorHandling.java | 12 ++++++++++++ .../commandline/CommandLineWithoutErrorHandling.java | 9 +++++++++ .../CommandLineWithoutErrorHandlingUnitTest.java | 12 ++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/commandline/CommandLineWithErrorHandling.java create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/commandline/CommandLineWithoutErrorHandling.java create mode 100644 core-java-modules/core-java-lang-5/src/test/java/com/baeldung/commandline/CommandLineWithoutErrorHandlingUnitTest.java diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/commandline/CommandLineWithErrorHandling.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/commandline/CommandLineWithErrorHandling.java new file mode 100644 index 0000000000..e80a2b46d9 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/commandline/CommandLineWithErrorHandling.java @@ -0,0 +1,12 @@ +package com.baeldung.commandline; + +public class CommandLineWithErrorHandling { + + public static void main(String[] args) { + if (args.length > 0) { + System.out.println(args[0]); + } else { + System.out.println("No command line arguments were provided."); + } + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/commandline/CommandLineWithoutErrorHandling.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/commandline/CommandLineWithoutErrorHandling.java new file mode 100644 index 0000000000..d761969bfd --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/commandline/CommandLineWithoutErrorHandling.java @@ -0,0 +1,9 @@ +package com.baeldung.commandline; + +public class CommandLineWithoutErrorHandling { + + public static void main(String[] args) { + + System.out.println(args[0]); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/commandline/CommandLineWithoutErrorHandlingUnitTest.java b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/commandline/CommandLineWithoutErrorHandlingUnitTest.java new file mode 100644 index 0000000000..197818631b --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/commandline/CommandLineWithoutErrorHandlingUnitTest.java @@ -0,0 +1,12 @@ +package com.baeldung.commandline; + +import org.junit.Test; +import static org.junit.Assert.fail; + +public class CommandLineWithoutErrorHandlingUnitTest { + + @Test(expected = NullPointerException.class) + public void givenNullCommandLineArgument_whenPassedToMainFunction_thenExpectNullPointerException() { + CommandLineWithoutErrorHandling.main(null); + } +} \ No newline at end of file From 8f620b22816de25cd36c20e7506f821f61825818 Mon Sep 17 00:00:00 2001 From: Hamid Reza Sharifi Date: Mon, 23 Jan 2023 18:14:23 +0330 Subject: [PATCH 336/592] Bael 6011: Spring Boot Logback and Log4j2 Extensions (#13327) --- spring-boot-modules/pom.xml | 1 + .../spring-boot-logging-log4j2/pom.xml | 4 ++ ...SpringBootLog4j2ExtensionsApplication.java | 25 +++++++++++++ .../application-log4j2-extensions.properties | 2 + .../src/main/resources/log4j2-spring.xml | 20 +++++++++- .../main/resources/log4j2.system.properties | 1 + .../spring-boot-logging-logback/.gitignore | 29 +++++++++++++++ .../spring-boot-logging-logback/README.md | 6 +++ .../spring-boot-logging-logback/pom.xml | 37 +++++++++++++++++++ ...pringBootLogbackExtensionsApplication.java | 22 +++++++++++ .../src/main/resources/application.properties | 1 + .../src/main/resources/logback-spring.xml | 33 +++++++++++++++++ 12 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 spring-boot-modules/spring-boot-logging-log4j2/src/main/java/com/baeldung/extensions/SpringBootLog4j2ExtensionsApplication.java create mode 100644 spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/application-log4j2-extensions.properties create mode 100644 spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/log4j2.system.properties create mode 100644 spring-boot-modules/spring-boot-logging-logback/.gitignore create mode 100644 spring-boot-modules/spring-boot-logging-logback/README.md create mode 100644 spring-boot-modules/spring-boot-logging-logback/pom.xml create mode 100644 spring-boot-modules/spring-boot-logging-logback/src/main/java/com/baeldung/extensions/SpringBootLogbackExtensionsApplication.java create mode 100644 spring-boot-modules/spring-boot-logging-logback/src/main/resources/application.properties create mode 100644 spring-boot-modules/spring-boot-logging-logback/src/main/resources/logback-spring.xml diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index e9da6eeca4..3ed9eea431 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -51,6 +51,7 @@ spring-boot-libraries spring-boot-libraries-2 spring-boot-process-automation + spring-boot-logging-logback spring-boot-logging-log4j2 spring-boot-mvc spring-boot-mvc-2 diff --git a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml index 7178aeca32..b2a6975964 100644 --- a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml +++ b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml @@ -55,6 +55,10 @@ org.springframework.boot spring-boot-starter-log4j2 + + org.apache.logging.log4j + log4j-spring-boot + org.projectlombok lombok diff --git a/spring-boot-modules/spring-boot-logging-log4j2/src/main/java/com/baeldung/extensions/SpringBootLog4j2ExtensionsApplication.java b/spring-boot-modules/spring-boot-logging-log4j2/src/main/java/com/baeldung/extensions/SpringBootLog4j2ExtensionsApplication.java new file mode 100644 index 0000000000..7802653c1c --- /dev/null +++ b/spring-boot-modules/spring-boot-logging-log4j2/src/main/java/com/baeldung/extensions/SpringBootLog4j2ExtensionsApplication.java @@ -0,0 +1,25 @@ +package com.baeldung.extensions; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.PropertySource; + +@SpringBootApplication +@PropertySource("classpath:application-log4j2-extensions.properties") +public class SpringBootLog4j2ExtensionsApplication { + + private static final Logger logger = LogManager.getLogger(SpringBootLog4j2ExtensionsApplication.class); + + public static void main(String[] args) { + SpringApplication.run(SpringBootLog4j2ExtensionsApplication.class, args); + + logger.trace("Trace log message"); + logger.debug("Debug log message"); + logger.info("Info log message"); + logger.error("Error log message"); + logger.warn("Warn log message"); + logger.fatal("Fatal log message"); + } +} diff --git a/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/application-log4j2-extensions.properties b/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/application-log4j2-extensions.properties new file mode 100644 index 0000000000..8db25c3ff5 --- /dev/null +++ b/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/application-log4j2-extensions.properties @@ -0,0 +1,2 @@ +logging.config=classpath:log4j2-spring.xml +spring.application.name=log4j2-extension \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/log4j2-spring.xml b/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/log4j2-spring.xml index 77a2074b30..c6906e1698 100644 --- a/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/log4j2-spring.xml +++ b/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/log4j2-spring.xml @@ -7,6 +7,11 @@ pattern="%style{%d{ISO8601}}{black} %highlight{%-5level }[%style{%t}{bright,blue}] %style{%C{1.}}{bright,yellow}: %msg%n%throwable" /> + + + + @@ -37,7 +42,20 @@ - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/log4j2.system.properties b/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/log4j2.system.properties new file mode 100644 index 0000000000..ba79a90a64 --- /dev/null +++ b/spring-boot-modules/spring-boot-logging-log4j2/src/main/resources/log4j2.system.properties @@ -0,0 +1 @@ +log4j2.debug=true \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-logging-logback/.gitignore b/spring-boot-modules/spring-boot-logging-logback/.gitignore new file mode 100644 index 0000000000..d129c74ec9 --- /dev/null +++ b/spring-boot-modules/spring-boot-logging-logback/.gitignore @@ -0,0 +1,29 @@ +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/logs/ +/bin/ +/mvnw +/mvnw.cmd diff --git a/spring-boot-modules/spring-boot-logging-logback/README.md b/spring-boot-modules/spring-boot-logging-logback/README.md new file mode 100644 index 0000000000..0a9d6d8bba --- /dev/null +++ b/spring-boot-modules/spring-boot-logging-logback/README.md @@ -0,0 +1,6 @@ +## Spring Boot Logging with Logback + +This module contains articles about logging in Spring Boot projects with Logback. + +### Relevant Articles: + diff --git a/spring-boot-modules/spring-boot-logging-logback/pom.xml b/spring-boot-modules/spring-boot-logging-logback/pom.xml new file mode 100644 index 0000000000..deb591c9f0 --- /dev/null +++ b/spring-boot-modules/spring-boot-logging-logback/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + spring-boot-logging-logback + spring-boot-logging-logback + jar + Demo project for Spring Boot Logging with Logback + + + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-logging-logback/src/main/java/com/baeldung/extensions/SpringBootLogbackExtensionsApplication.java b/spring-boot-modules/spring-boot-logging-logback/src/main/java/com/baeldung/extensions/SpringBootLogbackExtensionsApplication.java new file mode 100644 index 0000000000..28e455a7ea --- /dev/null +++ b/spring-boot-modules/spring-boot-logging-logback/src/main/java/com/baeldung/extensions/SpringBootLogbackExtensionsApplication.java @@ -0,0 +1,22 @@ +package com.baeldung.extensions; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootLogbackExtensionsApplication { + + private static final Logger logger = LoggerFactory.getLogger(SpringBootLogbackExtensionsApplication.class); + + public static void main(String[] args) { + SpringApplication.run(SpringBootLogbackExtensionsApplication.class, args); + + logger.debug("Debug log message"); + logger.info("Info log message"); + logger.error("Error log message"); + logger.warn("Warn log message"); + logger.trace("Trace log message"); + } +} diff --git a/spring-boot-modules/spring-boot-logging-logback/src/main/resources/application.properties b/spring-boot-modules/spring-boot-logging-logback/src/main/resources/application.properties new file mode 100644 index 0000000000..d4860d5765 --- /dev/null +++ b/spring-boot-modules/spring-boot-logging-logback/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=logback-extension \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-logging-logback/src/main/resources/logback-spring.xml b/spring-boot-modules/spring-boot-logging-logback/src/main/resources/logback-spring.xml new file mode 100644 index 0000000000..b2bf8bcd07 --- /dev/null +++ b/spring-boot-modules/spring-boot-logging-logback/src/main/resources/logback-spring.xml @@ -0,0 +1,33 @@ + + + + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + ${LOGS}/${application.name}.log + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + ${LOGS}/archived/${application.name}-%d{yyyy-MM-dd}.log + + + + + + + + From 189904b6d71b6ef88d9d9e25af21ea2d90b20d32 Mon Sep 17 00:00:00 2001 From: jsgrah-spring Date: Mon, 23 Jan 2023 16:04:07 +0100 Subject: [PATCH 337/592] Feature/java 14459 (#13336) * JAVA-14459, GitHub Issue: Reactive WebSocket App example no longer works. * JAVA-14459, Move spring5 reactive webflux filters to its own module. * JAVA-14459, Update README.md, remove links to irrelevant articles. Co-authored-by: jogra --- spring-reactive-modules/spring-5-reactive-filters/README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/spring-reactive-modules/spring-5-reactive-filters/README.md b/spring-reactive-modules/spring-5-reactive-filters/README.md index aa8d2800e2..815ca35442 100644 --- a/spring-reactive-modules/spring-5-reactive-filters/README.md +++ b/spring-reactive-modules/spring-5-reactive-filters/README.md @@ -7,9 +7,4 @@ 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) - [Spring WebFlux Filters](https://www.baeldung.com/spring-webflux-filters) -- [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) From 0162d98907d27b7e1a0c254b8d4bd2e27362ada7 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Mon, 23 Jan 2023 17:41:19 +0100 Subject: [PATCH 338/592] [bigDecimal-x-int] Multiply a BigDecimal By an Integer in Java (#13320) --- .../BigDecimalxIntegerUnitTest.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 core-java-modules/core-java-numbers-5/src/test/java/com/baeldung/bigdecimaltimesint/BigDecimalxIntegerUnitTest.java diff --git a/core-java-modules/core-java-numbers-5/src/test/java/com/baeldung/bigdecimaltimesint/BigDecimalxIntegerUnitTest.java b/core-java-modules/core-java-numbers-5/src/test/java/com/baeldung/bigdecimaltimesint/BigDecimalxIntegerUnitTest.java new file mode 100644 index 0000000000..afdf095f4e --- /dev/null +++ b/core-java-modules/core-java-numbers-5/src/test/java/com/baeldung/bigdecimaltimesint/BigDecimalxIntegerUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.bigdecimaltimesint; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.math.BigDecimal; + +import org.junit.jupiter.api.Test; + +public class BigDecimalxIntegerUnitTest { + private static final BigDecimal BIG = new BigDecimal("42.42"); + private static final int INT = 10; + private static final BigDecimal EXPECTED = new BigDecimal("424.2"); + + @Test + void givenBigDecimalAndInt_whenTimes_thenGetExpectedResult() { + BigDecimal result = BIG.multiply(BigDecimal.valueOf(INT)); + + assertEquals(0, EXPECTED.compareTo(result)); + assertThat(result).isEqualByComparingTo(EXPECTED); + } +} \ No newline at end of file From ea9bf9ebeb57dbbd2ff6ace8d608f0448dc63d6b Mon Sep 17 00:00:00 2001 From: timis1 Date: Mon, 23 Jan 2023 20:27:35 +0200 Subject: [PATCH 339/592] JAVA-17420 Update The transient Keyword in Java Article (#13321) Co-authored-by: Iulian Timis --- .../src/main/java/com/baeldung/transientkw/Book.java | 5 +++++ .../com/baeldung/transientkw/TransientUnitTest.java | 12 +++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-3/src/main/java/com/baeldung/transientkw/Book.java b/core-java-modules/core-java-lang-3/src/main/java/com/baeldung/transientkw/Book.java index 5822d83841..790747ec69 100644 --- a/core-java-modules/core-java-lang-3/src/main/java/com/baeldung/transientkw/Book.java +++ b/core-java-modules/core-java-lang-3/src/main/java/com/baeldung/transientkw/Book.java @@ -11,6 +11,8 @@ public class Book implements Serializable { private transient int copies; private final transient String bookCategory = "Fiction"; + private final transient String bookCategoryNewOperator = new String("Fiction with new Operator"); + public String getBookName() { return bookName; } @@ -39,4 +41,7 @@ public class Book implements Serializable { return bookCategory; } + public String getBookCategoryNewOperator() { + return bookCategoryNewOperator; + } } diff --git a/core-java-modules/core-java-lang-3/src/test/java/com/baeldung/transientkw/TransientUnitTest.java b/core-java-modules/core-java-lang-3/src/test/java/com/baeldung/transientkw/TransientUnitTest.java index a3ea77ec86..6c68896651 100644 --- a/core-java-modules/core-java-lang-3/src/test/java/com/baeldung/transientkw/TransientUnitTest.java +++ b/core-java-modules/core-java-lang-3/src/test/java/com/baeldung/transientkw/TransientUnitTest.java @@ -34,7 +34,17 @@ class TransientUnitTest { assertEquals("Fiction", book2.getBookCategory()); } - + + @Test + void givenFinalTransientWithNewOperator_whenSerDe_thenValuePersisted() throws Exception { + Book book = new Book(); + + BookSerDe.serialize(book); + Book book2 = BookSerDe.deserialize(); + + assertNull(book2.getBookCategoryNewOperator()); + } + @AfterAll public static void cleanup() { File file = new File(BookSerDe.fileName); From 69f6e110880f06e4b8e4ea1c8b39776aec1b31d2 Mon Sep 17 00:00:00 2001 From: Kilian Schneider <48420258+Basler182@users.noreply.github.com> Date: Mon, 23 Jan 2023 21:57:00 +0100 Subject: [PATCH 340/592] BAEL-6091 structured concurrency (#13297) --- .../JEP428StructuredConcurrencyUnitTest.java | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 core-java-modules/core-java-19/src/test/java/com/baeldung/features/JEP428StructuredConcurrencyUnitTest.java diff --git a/core-java-modules/core-java-19/src/test/java/com/baeldung/features/JEP428StructuredConcurrencyUnitTest.java b/core-java-modules/core-java-19/src/test/java/com/baeldung/features/JEP428StructuredConcurrencyUnitTest.java new file mode 100644 index 0000000000..64cd84ba01 --- /dev/null +++ b/core-java-modules/core-java-19/src/test/java/com/baeldung/features/JEP428StructuredConcurrencyUnitTest.java @@ -0,0 +1,122 @@ +package com.baeldung.features; + +import jdk.incubator.concurrent.StructuredTaskScope; +import org.junit.jupiter.api.Test; + +import java.time.Instant; +import java.util.List; +import java.util.concurrent.*; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +public class JEP428StructuredConcurrencyUnitTest { + + private static final String ERROR_MESSAGE = "Failed to get the result"; + + @Test + public void givenStructuredConcurrency_whenThrowingException_thenCorrect() { + assertThatThrownBy(() -> { + try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { + Future shelter = scope.fork(this::getShelter); + Future> dogs = scope.fork(this::getDogsWithException); + scope.throwIfFailed(e -> new RuntimeException(ERROR_MESSAGE)); + scope.join(); + Response response = new Response(shelter.resultNow(), dogs.resultNow()); + + assertThat(response).isNotNull(); + assertThat(response.shelter()).isNotNull(); + assertThat(response.dogs()).isNotNull(); + assertThat(response.dogs().size()).isEqualTo(2); + } + }).isInstanceOf(RuntimeException.class) + .hasMessage(ERROR_MESSAGE); + } + + @Test + public void givenStructuredConcurrency_whenSlowTasksReachesDeadline_thenCorrect() { + assertThatThrownBy(() -> { + try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { + Future shelter = scope.fork(this::getShelter); + Future> dogs = scope.fork(this::getDogsSlowly); + scope.throwIfFailed(e -> new RuntimeException(ERROR_MESSAGE)); + scope.join(); + scope.joinUntil(Instant.now().plusMillis(50)); + Response response = new Response(shelter.resultNow(), dogs.resultNow()); + + assertThat(response).isNotNull(); + assertThat(response.shelter()).isNotNull(); + assertThat(response.dogs()).isNotNull(); + assertThat(response.dogs().size()).isEqualTo(2); + + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }).isInstanceOf(IllegalStateException.class); + } + + @Test + public void givenStructuredConcurrency_whenResultNow_thenCorrect() { + try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { + Future shelter = scope.fork(this::getShelter); + Future> dogs = scope.fork(this::getDogs); + scope.join(); + + Response response = new Response(shelter.resultNow(), dogs.resultNow()); + + assertThat(response).isNotNull(); + assertThat(response.shelter()).isNotNull(); + assertThat(response.dogs()).isNotNull(); + assertThat(response.dogs().size()).isEqualTo(2); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + @Test + public void givenUnstructuredConcurrency_whenGet_thenCorrect() { + Future shelter; + Future> dogs; + try (ExecutorService executorService = Executors.newFixedThreadPool(3)) { + shelter = executorService.submit(this::getShelter); + dogs = executorService.submit(this::getDogs); + Shelter theShelter = shelter.get(); // Join the shelter + List theDogs = dogs.get(); // Join the dogs + Response response = new Response(theShelter, theDogs); + + assertThat(response).isNotNull(); + assertThat(response.shelter()).isNotNull(); + assertThat(response.dogs()).isNotNull(); + assertThat(response.dogs().size()).isEqualTo(2); + + } catch (ExecutionException | InterruptedException e) { + throw new RuntimeException(e); + } + } + + private Shelter getShelter() { + return new Shelter("Shelter"); + } + + private List getDogs() { + return List.of(new Dog("Buddy"), new Dog("Simba")); + } + + private List getDogsWithException() { + throw new RuntimeException(ERROR_MESSAGE); + } + + private List getDogsSlowly() throws InterruptedException { + Thread.sleep(1500); + throw new RuntimeException(ERROR_MESSAGE); + } + + record Shelter(String name) { + } + + record Dog(String name) { + } + + record Response(Shelter shelter, List dogs) { + } +} \ No newline at end of file From 3af60557bd3463ca56a1c7322569dc635dcf10d7 Mon Sep 17 00:00:00 2001 From: Gerard Klijs Date: Mon, 23 Jan 2023 23:24:35 +0100 Subject: [PATCH 341/592] BAEL-5856 Using and testing Axon applications via REST (#13134) Co-authored-by: Ashley Frieze --- axon/README.md | 3 +- axon/pom.xml | 13 +- .../gui/OrderRestEndpointIntegrationTest.java | 187 ++++++++++++++++++ 3 files changed, 200 insertions(+), 3 deletions(-) create mode 100644 axon/src/test/java/com/baeldung/axon/gui/OrderRestEndpointIntegrationTest.java diff --git a/axon/README.md b/axon/README.md index 2dad554110..9aeef05dd6 100644 --- a/axon/README.md +++ b/axon/README.md @@ -20,4 +20,5 @@ Two scripts are included to easily start middleware using Docker matching the pr - [Multi-Entity Aggregates in Axon](https://www.baeldung.com/java-axon-multi-entity-aggregates) - [Snapshotting Aggregates in Axon](https://www.baeldung.com/axon-snapshotting-aggregates) - [Dispatching Queries in Axon Framework](https://www.baeldung.com/axon-query-dispatching) -- [Persisting the Query Model](https://www.baeldung.com/axon-persisting-query-model) +- [Persisting the Query Model](https://www.baeldung.com/persisting-the-query-model) +- [Using and testing Axon applications via REST](https://www.baeldung.com/using-and-testing-axon-applications-via-rest) diff --git a/axon/pom.xml b/axon/pom.xml index cfdd24ff3c..42e32758ea 100644 --- a/axon/pom.xml +++ b/axon/pom.xml @@ -81,13 +81,22 @@ org.awaitility awaitility - 4.2.0 + test + + + org.springframework + spring-webflux + test + + + io.projectreactor.netty + reactor-netty-http test - 4.6.2 + 4.6.3 3.4.8 diff --git a/axon/src/test/java/com/baeldung/axon/gui/OrderRestEndpointIntegrationTest.java b/axon/src/test/java/com/baeldung/axon/gui/OrderRestEndpointIntegrationTest.java new file mode 100644 index 0000000000..a30e42766b --- /dev/null +++ b/axon/src/test/java/com/baeldung/axon/gui/OrderRestEndpointIntegrationTest.java @@ -0,0 +1,187 @@ +package com.baeldung.axon.gui; + +import com.baeldung.axon.OrderApplication; +import com.baeldung.axon.querymodel.OrderResponse; +import com.baeldung.axon.querymodel.OrderStatusResponse; + +import org.junit.jupiter.api.*; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.http.MediaType; +import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClientResponseException; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.netty.http.client.HttpClient; +import reactor.test.StepVerifier; + +import java.util.ArrayList; +import java.util.UUID; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest(classes = OrderApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class OrderRestEndpointIntegrationTest { + + @LocalServerPort + private int port; + + @Test + @DirtiesContext + void givenCreateOrderCalled_whenCallingAllOrders_thenOneCreatedOrderIsReturned() { + WebClient client = WebClient.builder() + .clientConnector(httpConnector()) + .build(); + createRandomNewOrder(client); + StepVerifier.create(retrieveListResponse(client.get() + .uri("http://localhost:" + port + "/all-orders"))) + .expectNextMatches(list -> 1 == list.size() && list.get(0) + .getOrderStatus() == OrderStatusResponse.CREATED) + .verifyComplete(); + } + + @Test + @DirtiesContext + void givenCreateOrderCalledThreeTimesAnd_whenCallingAllOrdersStreaming_thenTwoCreatedOrdersAreReturned() { + WebClient client = WebClient.builder() + .clientConnector(httpConnector()) + .build(); + for (int i = 0; i < 3; i++) { + createRandomNewOrder(client); + } + StepVerifier.create(retrieveStreamingResponse(client.get() + .uri("http://localhost:" + port + "/all-orders-streaming"))) + .expectNextMatches(o -> o.getOrderStatus() == OrderStatusResponse.CREATED) + .expectNextMatches(o -> o.getOrderStatus() == OrderStatusResponse.CREATED) + .expectNextMatches(o -> o.getOrderStatus() == OrderStatusResponse.CREATED) + .verifyComplete(); + } + + @Test + @DirtiesContext + void givenRuleExistThatNeedConfirmationBeforeShipping_whenCallingShipUnconfirmed_thenErrorReturned() { + WebClient client = WebClient.builder() + .clientConnector(httpConnector()) + .build(); + StepVerifier.create(retrieveResponse(client.post() + .uri("http://localhost:" + port + "/ship-unconfirmed-order"))) + .verifyError(WebClientResponseException.class); + } + + @Test + @DirtiesContext + void givenShipOrderCalled_whenCallingAllShippedChairs_then234PlusOneIsReturned() { + WebClient client = WebClient.builder() + .clientConnector(httpConnector()) + .build(); + verifyVoidPost(client, "http://localhost:" + port + "/ship-order"); + StepVerifier.create(retrieveIntegerResponse(client.get() + .uri("http://localhost:" + port + "/total-shipped/Deluxe Chair"))) + .assertNext(r -> assertEquals(235, r)) + .verifyComplete(); + } + + @Test + @DirtiesContext + void givenOrdersAreUpdated_whenCallingOrderUpdates_thenUpdatesReturned() { + WebClient updaterClient = WebClient.builder() + .clientConnector(httpConnector()) + .build(); + WebClient receiverClient = WebClient.builder() + .clientConnector(httpConnector()) + .build(); + String orderId = UUID.randomUUID() + .toString(); + String productId = UUID.randomUUID() + .toString(); + StepVerifier.create(retrieveResponse(updaterClient.post() + .uri("http://localhost:" + port + "/order/" + orderId))) + .assertNext(Assertions::assertNotNull) + .verifyComplete(); + ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); + executor.schedule(() -> addIncrementDecrementConfirmAndShipProduct(orderId, productId), 1L, TimeUnit.SECONDS); + try { + StepVerifier.create(retrieveStreamingResponse(receiverClient.get() + .uri("http://localhost:" + port + "/order-updates/" + orderId))) + .assertNext(p -> assertTrue(p.getProducts() + .isEmpty())) + .assertNext(p -> assertEquals(1, p.getProducts() + .get(productId))) + .assertNext(p -> assertEquals(2, p.getProducts() + .get(productId))) + .assertNext(p -> assertEquals(1, p.getProducts() + .get(productId))) + .assertNext(p -> assertEquals(OrderStatusResponse.CONFIRMED, p.getOrderStatus())) + .assertNext(p -> assertEquals(OrderStatusResponse.SHIPPED, p.getOrderStatus())) + .thenCancel() + .verify(); + } finally { + executor.shutdown(); + } + } + + private void addIncrementDecrementConfirmAndShipProduct(String orderId, String productId) { + WebClient client = WebClient.builder() + .clientConnector(httpConnector()) + .build(); + String base = "http://localhost:" + port + "/order/" + orderId; + verifyVoidPost(client, base + "/product/" + productId); + verifyVoidPost(client, base + "/product/" + productId + "/increment"); + verifyVoidPost(client, base + "/product/" + productId + "/decrement"); + verifyVoidPost(client, base + "/confirm"); + verifyVoidPost(client, base + "/ship"); + } + + private void createRandomNewOrder(WebClient client){ + StepVerifier.create(retrieveResponse(client.post() + .uri("http://localhost:" + port + "/order"))) + .assertNext(Assertions::assertNotNull) + .verifyComplete(); + } + + private void verifyVoidPost(WebClient client, String uri) { + StepVerifier.create(retrieveResponse(client.post() + .uri(uri))) + .verifyComplete(); + } + + private static ReactorClientHttpConnector httpConnector() { + HttpClient httpClient = HttpClient.create() + .wiretap(true); + return new ReactorClientHttpConnector(httpClient); + } + + private Mono retrieveResponse(WebClient.RequestBodySpec spec) { + return spec.retrieve() + .bodyToMono(String.class); + } + + private Mono retrieveListResponse(WebClient.RequestHeadersSpec spec) { + return spec.accept(MediaType.APPLICATION_JSON) + .retrieve() + .bodyToMono(ResponseList.class); + } + + private Mono retrieveIntegerResponse(WebClient.RequestHeadersSpec spec) { + return spec.retrieve() + .bodyToMono(Integer.class); + } + + private Flux retrieveStreamingResponse(WebClient.RequestHeadersSpec spec) { + return spec.retrieve() + .bodyToFlux(OrderResponse.class); + } + + private static class ResponseList extends ArrayList { + + private ResponseList() { + super(); + } + } +} From c4673219572b1b9e84102f82ae7ece8bcb5acde3 Mon Sep 17 00:00:00 2001 From: Stef Serban-Cristian Date: Tue, 24 Jan 2023 11:25:30 +0200 Subject: [PATCH 342/592] [BAEL-5788] Accessing Private Constructor --- .../README.md | 10 ++++ .../pom.xml | 60 +++++++++++++++++++ .../reflection/PrivateConstructorClass.java | 8 +++ .../PrivateConstructorUnitTest.java | 17 ++++++ 4 files changed, 95 insertions(+) create mode 100644 core-java-modules/core-java-reflection-private-constructor/README.md create mode 100644 core-java-modules/core-java-reflection-private-constructor/pom.xml create mode 100644 core-java-modules/core-java-reflection-private-constructor/src/main/java/com/baeldung/reflection/PrivateConstructorClass.java create mode 100644 core-java-modules/core-java-reflection-private-constructor/src/test/java/com/baeldung/reflection/PrivateConstructorUnitTest.java diff --git a/core-java-modules/core-java-reflection-private-constructor/README.md b/core-java-modules/core-java-reflection-private-constructor/README.md new file mode 100644 index 0000000000..a3c9d00b0a --- /dev/null +++ b/core-java-modules/core-java-reflection-private-constructor/README.md @@ -0,0 +1,10 @@ +### Relevant Articles: + +- [Reading the Value of ‘private’ Fields from a Different Class in Java](https://www.baeldung.com/java-reflection-read-private-field-value) +- [Set Field Value With Reflection](https://www.baeldung.com/java-set-private-field-value) +- [Checking If a Method is Static Using Reflection in Java](https://www.baeldung.com/java-check-method-is-static) +- [Checking if a Java Class is ‘abstract’ Using Reflection](https://www.baeldung.com/java-reflection-is-class-abstract) +- [Invoking a Private Method in Java](https://www.baeldung.com/java-call-private-method) +- [Finding All Classes in a Java Package](https://www.baeldung.com/java-find-all-classes-in-package) +- [Invoke a Static Method Using Java Reflection API](https://www.baeldung.com/java-invoke-static-method-reflection) +- [What Is the JDK com.sun.proxy.$Proxy Class?](https://www.baeldung.com/jdk-com-sun-proxy) diff --git a/core-java-modules/core-java-reflection-private-constructor/pom.xml b/core-java-modules/core-java-reflection-private-constructor/pom.xml new file mode 100644 index 0000000000..b53aa2c61b --- /dev/null +++ b/core-java-modules/core-java-reflection-private-constructor/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + core-java-reflection-private-constructor + 0.1.0-SNAPSHOT + core-java-reflection-private-constructor + 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-private-constructor + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${source.version} + ${target.version} + -parameters + + + + + + + 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-private-constructor/src/main/java/com/baeldung/reflection/PrivateConstructorClass.java b/core-java-modules/core-java-reflection-private-constructor/src/main/java/com/baeldung/reflection/PrivateConstructorClass.java new file mode 100644 index 0000000000..24e7d435c7 --- /dev/null +++ b/core-java-modules/core-java-reflection-private-constructor/src/main/java/com/baeldung/reflection/PrivateConstructorClass.java @@ -0,0 +1,8 @@ +package com.baeldung.reflection; + +public class PrivateConstructorClass { + + private PrivateConstructorClass() { + System.out.println("Used the private constructor!"); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-reflection-private-constructor/src/test/java/com/baeldung/reflection/PrivateConstructorUnitTest.java b/core-java-modules/core-java-reflection-private-constructor/src/test/java/com/baeldung/reflection/PrivateConstructorUnitTest.java new file mode 100644 index 0000000000..cd1f48d720 --- /dev/null +++ b/core-java-modules/core-java-reflection-private-constructor/src/test/java/com/baeldung/reflection/PrivateConstructorUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.reflection; + +import java.lang.reflect.Constructor; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class PrivateConstructorUnitTest { + + @Test + public void whenConstructorIsPrivate_thenInstanceSuccess() throws Exception { + Constructor pcc = PrivateConstructorClass.class.getDeclaredConstructor(); + pcc.setAccessible(true); + PrivateConstructorClass privateConstructorInstance = pcc.newInstance(); + Assertions.assertTrue(privateConstructorInstance instanceof PrivateConstructorClass); + } +} \ No newline at end of file From 3cba49e6bc269dbad799126323d9b7e37b39af2c Mon Sep 17 00:00:00 2001 From: cesarevalenti90 <50798547+cesarevalenti90@users.noreply.github.com> Date: Wed, 25 Jan 2023 17:35:49 +0100 Subject: [PATCH 343/592] BAEL-6088 - Ahead of Time Optimizations in Spring 6 (#13311) * BAEL-6057 - Implementing Retry In Kafka Consumer (moved code example to new module) * BAEL-6057 - Implementing Retry In Kafka Consumer (fix on README.md) * BAEL-6088 - Ahead of Time Optimizations in Spring 6 Co-authored-by: Cesare --- .../spring-boot-3-native/pom.xml | 24 +++++++++++++++---- spring-native/README.md | 1 + 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/spring-boot-modules/spring-boot-3-native/pom.xml b/spring-boot-modules/spring-boot-3-native/pom.xml index a70cc08755..5382b8413c 100644 --- a/spring-boot-modules/spring-boot-3-native/pom.xml +++ b/spring-boot-modules/spring-boot-3-native/pom.xml @@ -47,12 +47,26 @@ true - - - + + + + + + + - - + + diff --git a/spring-native/README.md b/spring-native/README.md index 0f193252d0..72308cb9d5 100644 --- a/spring-native/README.md +++ b/spring-native/README.md @@ -1,3 +1,4 @@ ## Relevant Articles: - [Introduction to Spring Native](https://www.baeldung.com/spring-native-intro) +- [Ahead of Time Optimizations in Spring 6](https://www.baeldung.com/aot-optimization-spring) \ No newline at end of file From 0e6cfe990980485c1e2bd32404653bbce2c2b2ee Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 26 Jan 2023 15:52:21 +0800 Subject: [PATCH 344/592] 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 95f48ad3f0..782adb7b34 100644 --- a/spring-boot-modules/spring-boot-mvc-5/README.md +++ b/spring-boot-modules/spring-boot-mvc-5/README.md @@ -4,3 +4,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) From 1a4312f22b4db684c0aa2d87971fa832747c3887 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 26 Jan 2023 15:57:56 +0800 Subject: [PATCH 345/592] Update README.md [skip ci] --- core-java-modules/core-java-lang-5/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-5/README.md b/core-java-modules/core-java-lang-5/README.md index 5ae3955bc8..d52a53905c 100644 --- a/core-java-modules/core-java-lang-5/README.md +++ b/core-java-modules/core-java-lang-5/README.md @@ -12,4 +12,4 @@ This module contains articles about core features in the Java language - [Infinity in Java](https://www.baeldung.com/java-infinity) - [Type Parameter vs Wildcard in Java Generics](https://www.baeldung.com/java-generics-type-parameter-vs-wildcard) - [Convert Between int and char in Java](https://www.baeldung.com/java-convert-int-char) -- +- [Converting a Number from One Base to Another in Java](https://www.baeldung.com/java-converting-a-number-from-one-base-to-another) From eb81632bc78863642914f787e646681324c4503c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 26 Jan 2023 16:03:26 +0800 Subject: [PATCH 346/592] Update README.md [skip ci] --- core-java-modules/core-java-exceptions-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-exceptions-4/README.md b/core-java-modules/core-java-exceptions-4/README.md index 9bd5d4b9bb..dc76b90fc7 100644 --- a/core-java-modules/core-java-exceptions-4/README.md +++ b/core-java-modules/core-java-exceptions-4/README.md @@ -9,4 +9,5 @@ This module contains articles about core java exceptions - [“Sneaky Throws” in Java](https://www.baeldung.com/java-sneaky-throws) - [Get the Current Stack Trace in Java](https://www.baeldung.com/java-get-current-stack-trace) - [Errors and Exceptions in Java](https://www.baeldung.com/java-errors-vs-exceptions) +- [Fix the IllegalArgumentException: No enum const class](https://www.baeldung.com/java-fix-no-enum-const-class) - [[<-- Prev]](../core-java-exceptions-3) From 53e5fc8d0a3331e8f0d6a95013509e8be298e594 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 26 Jan 2023 16:07:49 +0800 Subject: [PATCH 347/592] Update README.md [skip ci] --- spring-web-modules/spring-mvc-file/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-web-modules/spring-mvc-file/README.md b/spring-web-modules/spring-mvc-file/README.md index c1622f80c2..c4843031ff 100644 --- a/spring-web-modules/spring-mvc-file/README.md +++ b/spring-web-modules/spring-mvc-file/README.md @@ -6,4 +6,4 @@ ### Relevant Articles: - +- [Convert byte[] to MultipartFile in Java](https://www.baeldung.com/java-convert-byte-array-to-multipartfile) From 47698ae01c77b89b88b3110b427cc63e28123da3 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 26 Jan 2023 16:12:14 +0800 Subject: [PATCH 348/592] Update README.md [skip ci] --- core-java-modules/core-java-lang-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-5/README.md b/core-java-modules/core-java-lang-5/README.md index d52a53905c..b8deff199e 100644 --- a/core-java-modules/core-java-lang-5/README.md +++ b/core-java-modules/core-java-lang-5/README.md @@ -13,3 +13,4 @@ This module contains articles about core features in the Java language - [Type Parameter vs Wildcard in Java Generics](https://www.baeldung.com/java-generics-type-parameter-vs-wildcard) - [Convert Between int and char in Java](https://www.baeldung.com/java-convert-int-char) - [Converting a Number from One Base to Another in Java](https://www.baeldung.com/java-converting-a-number-from-one-base-to-another) +- [Check if Command-Line Arguments Are Null in Java](https://www.baeldung.com/java-check-command-line-args) From ba0889aa7254de22771edbf72f821a5277f149f4 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 26 Jan 2023 16:16:09 +0800 Subject: [PATCH 349/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-list-5/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-collections-list-5/README.md b/core-java-modules/core-java-collections-list-5/README.md index 4b7fbf8669..78959e7d5d 100644 --- a/core-java-modules/core-java-collections-list-5/README.md +++ b/core-java-modules/core-java-collections-list-5/README.md @@ -2,4 +2,5 @@ This module contains articles about the Java List collection -### Relevant Articles: \ No newline at end of file +### Relevant Articles: +- [Java List Interface](https://www.baeldung.com/java-list-interface) From ad451615555b1e32256c24c8305d700666171e06 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 26 Jan 2023 16:21:14 +0800 Subject: [PATCH 350/592] Update README.md [skip ci] --- core-java-modules/core-java-numbers-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-numbers-5/README.md b/core-java-modules/core-java-numbers-5/README.md index 714e808239..7a010e2fbf 100644 --- a/core-java-modules/core-java-numbers-5/README.md +++ b/core-java-modules/core-java-numbers-5/README.md @@ -6,3 +6,4 @@ - [List All Factors of a Number in Java](https://www.baeldung.com/java-list-factors-integer) - [Make Division of Two Integers Result in a Float](https://www.baeldung.com/java-integer-division-float-result) - [Creating Random Numbers With No Duplicates in Java](https://www.baeldung.com/java-unique-random-numbers) +- [Multiply a BigDecimal by an Integer in Java](https://www.baeldung.com/java-bigdecimal-multiply-integer) From 7d124ccc18c8b9d5675f82a8701c67159b2af7bc Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 26 Jan 2023 16:23:28 +0800 Subject: [PATCH 351/592] Create README.md [skip ci] --- persistence-modules/scylladb/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 persistence-modules/scylladb/README.md diff --git a/persistence-modules/scylladb/README.md b/persistence-modules/scylladb/README.md new file mode 100644 index 0000000000..b845051972 --- /dev/null +++ b/persistence-modules/scylladb/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Introduction to ScyllaDB with Java](https://www.baeldung.com/java-scylladb) From e04bb7bc9140efe6743e79b78cd0120670de4bd1 Mon Sep 17 00:00:00 2001 From: Amit Kumatr Date: Fri, 27 Jan 2023 00:32:13 +0530 Subject: [PATCH 352/592] added code of collections-vs-stream --- .../spring-data-jpa-query-3/pom.xml | 5 ++ .../data/jpa/collections/vsstream/User.java | 61 +++++++++++++++++++ .../collections/vsstream/UserRepository.java | 14 +++++ .../UserRepositoryIntegrationTest.java | 41 +++++++++++++ 4 files changed, 121 insertions(+) create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collections/vsstream/User.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collections/vsstream/UserRepository.java create mode 100644 persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/collections/vsstream/UserRepositoryIntegrationTest.java diff --git a/persistence-modules/spring-data-jpa-query-3/pom.xml b/persistence-modules/spring-data-jpa-query-3/pom.xml index 135d31aaba..a80b6349c9 100644 --- a/persistence-modules/spring-data-jpa-query-3/pom.xml +++ b/persistence-modules/spring-data-jpa-query-3/pom.xml @@ -22,6 +22,11 @@ com.h2database h2 + + com.github.javafaker + javafaker + 0.15 + org.springframework.boot spring-boot-starter-test diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collections/vsstream/User.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collections/vsstream/User.java new file mode 100644 index 0000000000..85843bd92b --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collections/vsstream/User.java @@ -0,0 +1,61 @@ +package com.baeldung.spring.data.jpa.collections.vsstream; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "_user") +public class User { + private String firstName; + private String lastName; + private int age; + @Id + private int id; + + public User() { + } + + public User(String firstName, String lastName, int age) { + this.firstName = firstName; + this.lastName = lastName; + this.age = age; + } + + public User(String firstName, String lastName, int age, int id) { + this(firstName, lastName, age); + this.id = id; + } + + public int getId() { + return id; + } + + public void setId(int 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 int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } +} diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collections/vsstream/UserRepository.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collections/vsstream/UserRepository.java new file mode 100644 index 0000000000..05acb84691 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collections/vsstream/UserRepository.java @@ -0,0 +1,14 @@ +package com.baeldung.spring.data.jpa.collections.vsstream; + +import java.util.List; +import java.util.stream.Stream; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserRepository extends JpaRepository { + Stream findAllByAgeGreaterThan(int age); + + List findByAgeGreaterThan(int age); +} diff --git a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/collections/vsstream/UserRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/collections/vsstream/UserRepositoryIntegrationTest.java new file mode 100644 index 0000000000..9bf3774999 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/collections/vsstream/UserRepositoryIntegrationTest.java @@ -0,0 +1,41 @@ +package com.baeldung.spring.data.jpa.query.collections.vsstream; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.data.jdbc.DataJdbcTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import com.baeldung.spring.data.jpa.collections.vsstream.User; +import com.baeldung.spring.data.jpa.collections.vsstream.UserRepository; + +@DataJpaTest +class UserRepositoryIntegrationTest { + + @Autowired + private UserRepository userRepository; + + @Test + public void whenAgeIs20_thenItShouldReturnAllUsersWhoseAgeIsGreaterThan20InAList() { + List users = userRepository.findByAgeGreaterThan(20); + assertThat(users).isNotEmpty(); + assertThat(users.stream() + .map(User::getAge) + .allMatch(age -> age > 20)).isTrue(); + } + + @Test + @Transactional + public void whenAgeIs20_thenItShouldReturnAllUsersWhoseAgeIsGreaterThan20InAStream() { + Stream users = userRepository.findAllByAgeGreaterThan(20); + assertThat(users).isNotNull(); + assertThat(users.map(User::getAge) + .allMatch(age -> age > 20)).isTrue(); + } +} From 83aae330ac08d37af8cb0d37799d23e03c358a37 Mon Sep 17 00:00:00 2001 From: Amit Kumatr Date: Fri, 27 Jan 2023 00:54:56 +0530 Subject: [PATCH 353/592] added setup and teardown method --- .../UserRepositoryIntegrationTest.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/collections/vsstream/UserRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/collections/vsstream/UserRepositoryIntegrationTest.java index 9bf3774999..be25a82126 100644 --- a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/collections/vsstream/UserRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/collections/vsstream/UserRepositoryIntegrationTest.java @@ -3,17 +3,20 @@ package com.baeldung.spring.data.jpa.query.collections.vsstream; import static org.assertj.core.api.Assertions.assertThat; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import java.util.stream.Stream; +import org.junit.jupiter.api.AfterEach; +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.data.jdbc.DataJdbcTest; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import com.baeldung.spring.data.jpa.collections.vsstream.User; import com.baeldung.spring.data.jpa.collections.vsstream.UserRepository; +import com.github.javafaker.Faker; @DataJpaTest class UserRepositoryIntegrationTest { @@ -21,6 +24,24 @@ class UserRepositoryIntegrationTest { @Autowired private UserRepository userRepository; + @BeforeEach + public void setup() { + Faker faker = new Faker(); + List people = IntStream.range(1, 100) + .parallel() + .mapToObj(i -> new User(faker.name() + .firstName(), faker.name() + .lastName(), faker.number() + .numberBetween(1, 100), i)) + .collect(Collectors.toList()); + userRepository.saveAll(people); + } + + @AfterEach + public void tearDown() { + userRepository.deleteAll(); + } + @Test public void whenAgeIs20_thenItShouldReturnAllUsersWhoseAgeIsGreaterThan20InAList() { List users = userRepository.findByAgeGreaterThan(20); From 7f3f70707720186afd14cec807c87d920c4780c5 Mon Sep 17 00:00:00 2001 From: Arman Sharif Date: Thu, 26 Jan 2023 16:29:47 -0800 Subject: [PATCH 354/592] BAEL-6164: Generate unit test data with Instancio (#13350) --- testing-modules/instancio/.gitignore | 14 ++ testing-modules/instancio/README.md | 1 + testing-modules/instancio/pom.xml | 58 ++++++ .../instancio/abstracttype/AbstractItem.java | 6 + .../com/baeldung/instancio/generics/Item.java | 18 ++ .../com/baeldung/instancio/generics/Pair.java | 20 ++ .../baeldung/instancio/generics/Triplet.java | 24 +++ .../instancio/student/model/Address.java | 31 ++++ .../instancio/student/model/ContactInfo.java | 28 +++ .../instancio/student/model/Course.java | 53 ++++++ .../student/model/EmergencyContact.java | 14 ++ .../instancio/student/model/Grade.java | 5 + .../instancio/student/model/Phone.java | 23 +++ .../instancio/student/model/Student.java | 57 ++++++ .../student/service/CourseService.java | 11 ++ .../student/service/EnrollmentException.java | 8 + .../student/service/EnrollmentService.java | 30 +++ .../instancio/util/PrettyToString.java | 21 +++ .../basics/CreateStudentUnitTest.java | 174 ++++++++++++++++++ .../UsingCustomGeneratorUnitTest.java | 57 ++++++ .../CreatingGenericTypesUnitTest.java | 100 ++++++++++ .../mockito/InstancioWithMockitoUnitTest.java | 45 +++++ .../ReproducingTestFailureUnitTest.java | 60 ++++++ .../selectors/SelectorScopesUnitTest.java | 76 ++++++++ .../selectors/SelectorsUnitTest.java | 104 +++++++++++ .../settings/CustomSettingsUnitTest.java | 67 +++++++ .../UsingInstancioPropertiesUnitTest.java | 50 +++++ .../instancio/subtype/SubtypeUnitTest.java | 54 ++++++ .../src/test/resources/instancio.properties | 2 + testing-modules/pom.xml | 1 + 30 files changed, 1212 insertions(+) create mode 100644 testing-modules/instancio/.gitignore create mode 100644 testing-modules/instancio/README.md create mode 100644 testing-modules/instancio/pom.xml create mode 100644 testing-modules/instancio/src/main/java/com/baeldung/instancio/abstracttype/AbstractItem.java create mode 100644 testing-modules/instancio/src/main/java/com/baeldung/instancio/generics/Item.java create mode 100644 testing-modules/instancio/src/main/java/com/baeldung/instancio/generics/Pair.java create mode 100644 testing-modules/instancio/src/main/java/com/baeldung/instancio/generics/Triplet.java create mode 100644 testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Address.java create mode 100644 testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/ContactInfo.java create mode 100644 testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Course.java create mode 100644 testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/EmergencyContact.java create mode 100644 testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Grade.java create mode 100644 testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Phone.java create mode 100644 testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Student.java create mode 100644 testing-modules/instancio/src/main/java/com/baeldung/instancio/student/service/CourseService.java create mode 100644 testing-modules/instancio/src/main/java/com/baeldung/instancio/student/service/EnrollmentException.java create mode 100644 testing-modules/instancio/src/main/java/com/baeldung/instancio/student/service/EnrollmentService.java create mode 100644 testing-modules/instancio/src/main/java/com/baeldung/instancio/util/PrettyToString.java create mode 100644 testing-modules/instancio/src/test/java/com/baeldung/instancio/basics/CreateStudentUnitTest.java create mode 100644 testing-modules/instancio/src/test/java/com/baeldung/instancio/generators/UsingCustomGeneratorUnitTest.java create mode 100644 testing-modules/instancio/src/test/java/com/baeldung/instancio/generics/CreatingGenericTypesUnitTest.java create mode 100644 testing-modules/instancio/src/test/java/com/baeldung/instancio/mockito/InstancioWithMockitoUnitTest.java create mode 100644 testing-modules/instancio/src/test/java/com/baeldung/instancio/reproducing/ReproducingTestFailureUnitTest.java create mode 100644 testing-modules/instancio/src/test/java/com/baeldung/instancio/selectors/SelectorScopesUnitTest.java create mode 100644 testing-modules/instancio/src/test/java/com/baeldung/instancio/selectors/SelectorsUnitTest.java create mode 100644 testing-modules/instancio/src/test/java/com/baeldung/instancio/settings/CustomSettingsUnitTest.java create mode 100644 testing-modules/instancio/src/test/java/com/baeldung/instancio/settings/UsingInstancioPropertiesUnitTest.java create mode 100644 testing-modules/instancio/src/test/java/com/baeldung/instancio/subtype/SubtypeUnitTest.java create mode 100644 testing-modules/instancio/src/test/resources/instancio.properties diff --git a/testing-modules/instancio/.gitignore b/testing-modules/instancio/.gitignore new file mode 100644 index 0000000000..7f300600e6 --- /dev/null +++ b/testing-modules/instancio/.gitignore @@ -0,0 +1,14 @@ +*.class + +.settings +.project + +#folders# +/target +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear diff --git a/testing-modules/instancio/README.md b/testing-modules/instancio/README.md new file mode 100644 index 0000000000..881477f036 --- /dev/null +++ b/testing-modules/instancio/README.md @@ -0,0 +1 @@ +### Relevant articles diff --git a/testing-modules/instancio/pom.xml b/testing-modules/instancio/pom.xml new file mode 100644 index 0000000000..137da91897 --- /dev/null +++ b/testing-modules/instancio/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + instancio + instancio + jar + + + com.baeldung + testing-modules + 1.0.0-SNAPSHOT + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} + + + + org.instancio + instancio-junit + ${instancio.version} + test + + + org.assertj + assertj-core + ${assertj.version} + + + org.junit.jupiter + junit-jupiter + ${junit-jupiter.version} + test + + + org.mockito + mockito-junit-jupiter + ${mockito.version} + test + + + + + 2.6.0 + 2.14.1 + 5.9.2 + + \ No newline at end of file diff --git a/testing-modules/instancio/src/main/java/com/baeldung/instancio/abstracttype/AbstractItem.java b/testing-modules/instancio/src/main/java/com/baeldung/instancio/abstracttype/AbstractItem.java new file mode 100644 index 0000000000..4dd21e6ffb --- /dev/null +++ b/testing-modules/instancio/src/main/java/com/baeldung/instancio/abstracttype/AbstractItem.java @@ -0,0 +1,6 @@ +package com.baeldung.instancio.abstracttype; + +public interface AbstractItem { + + T getValue(); +} diff --git a/testing-modules/instancio/src/main/java/com/baeldung/instancio/generics/Item.java b/testing-modules/instancio/src/main/java/com/baeldung/instancio/generics/Item.java new file mode 100644 index 0000000000..19450a936c --- /dev/null +++ b/testing-modules/instancio/src/main/java/com/baeldung/instancio/generics/Item.java @@ -0,0 +1,18 @@ +package com.baeldung.instancio.generics; + +import com.baeldung.instancio.abstracttype.AbstractItem; + +public class Item implements AbstractItem { + + private T value; + + @Override + public T getValue() { + return value; + } + + @Override + public String toString() { + return String.format("Item[value=%s]", value); + } +} \ No newline at end of file diff --git a/testing-modules/instancio/src/main/java/com/baeldung/instancio/generics/Pair.java b/testing-modules/instancio/src/main/java/com/baeldung/instancio/generics/Pair.java new file mode 100644 index 0000000000..48b43fe9aa --- /dev/null +++ b/testing-modules/instancio/src/main/java/com/baeldung/instancio/generics/Pair.java @@ -0,0 +1,20 @@ +package com.baeldung.instancio.generics; + +public class Pair { + + private L left; + private R right; + + public L getLeft() { + return left; + } + + public R getRight() { + return right; + } + + @Override + public String toString() { + return String.format("Pair[left=%s, right=%s]", left, right); + } +} \ No newline at end of file diff --git a/testing-modules/instancio/src/main/java/com/baeldung/instancio/generics/Triplet.java b/testing-modules/instancio/src/main/java/com/baeldung/instancio/generics/Triplet.java new file mode 100644 index 0000000000..528c4d7c98 --- /dev/null +++ b/testing-modules/instancio/src/main/java/com/baeldung/instancio/generics/Triplet.java @@ -0,0 +1,24 @@ +package com.baeldung.instancio.generics; + +public class Triplet { + private L left; + private M middle; + private R right; + + public L getLeft() { + return left; + } + + public M getMiddle() { + return middle; + } + + public R getRight() { + return right; + } + + @Override + public String toString() { + return String.format("Triplet[left=%s, middle=%s, right=%s]", left, right, middle); + } +} \ No newline at end of file diff --git a/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Address.java b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Address.java new file mode 100644 index 0000000000..cda34690e5 --- /dev/null +++ b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Address.java @@ -0,0 +1,31 @@ +package com.baeldung.instancio.student.model; + +import com.baeldung.instancio.util.PrettyToString; + +public class Address { + private String street; + private String city; + private String country; + + public String getStreet() { + return street; + } + + public String getCity() { + return city; + } + + public String getCountry() { + return country; + } + + public void setCountry(final String country) { + this.country = country; + } + + @Override + public String toString() { + return PrettyToString.toPrettyString(this); + } + +} diff --git a/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/ContactInfo.java b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/ContactInfo.java new file mode 100644 index 0000000000..71534192c6 --- /dev/null +++ b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/ContactInfo.java @@ -0,0 +1,28 @@ +package com.baeldung.instancio.student.model; + +import com.baeldung.instancio.util.PrettyToString; + +import java.util.List; + +public class ContactInfo { + private Address address; + private List phones; + private String email; + + public Address getAddress() { + return address; + } + + public List getPhones() { + return phones; + } + + public String getEmail() { + return email; + } + + @Override + public String toString() { + return PrettyToString.toPrettyString(this); + } +} diff --git a/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Course.java b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Course.java new file mode 100644 index 0000000000..543f6eaf4e --- /dev/null +++ b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Course.java @@ -0,0 +1,53 @@ +package com.baeldung.instancio.student.model; + +import com.baeldung.instancio.util.PrettyToString; + +import java.time.Duration; +import java.time.LocalDate; +import java.util.Objects; + +public class Course { + private String title; + private String code; + private LocalDate startDate; + private Duration duration; + private String instructor; + + public String getTitle() { + return title; + } + + public String getCode() { + return code; + } + + public LocalDate getStartDate() { + return startDate; + } + + public Duration getDuration() { + return duration; + } + + public String getInstructor() { + return instructor; + } + + @Override + public String toString() { + return PrettyToString.toPrettyString(this); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (!(o instanceof Course)) return false; + final Course course = (Course) o; + return Objects.equals(getCode(), course.getCode()); + } + + @Override + public int hashCode() { + return Objects.hash(getCode()); + } +} diff --git a/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/EmergencyContact.java b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/EmergencyContact.java new file mode 100644 index 0000000000..7c5ce21738 --- /dev/null +++ b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/EmergencyContact.java @@ -0,0 +1,14 @@ +package com.baeldung.instancio.student.model; + +public class EmergencyContact { + private String name; + private Phone phone; + + public String getName() { + return name; + } + + public Phone getPhone() { + return phone; + } +} diff --git a/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Grade.java b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Grade.java new file mode 100644 index 0000000000..8bd9341a18 --- /dev/null +++ b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Grade.java @@ -0,0 +1,5 @@ +package com.baeldung.instancio.student.model; + +public enum Grade { + A, B, C, D, F +} diff --git a/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Phone.java b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Phone.java new file mode 100644 index 0000000000..887cce5c7d --- /dev/null +++ b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Phone.java @@ -0,0 +1,23 @@ +package com.baeldung.instancio.student.model; + +import com.baeldung.instancio.util.PrettyToString; + +public class Phone { + + private String countryCode; + private String number; + + public String getCountryCode() { + return countryCode; + } + + public String getNumber() { + return number; + } + + @Override + public String toString() { + return PrettyToString.toPrettyString(this); + } + +} diff --git a/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Student.java b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Student.java new file mode 100644 index 0000000000..fd6b3cbc1c --- /dev/null +++ b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/model/Student.java @@ -0,0 +1,57 @@ +package com.baeldung.instancio.student.model; + + +import com.baeldung.instancio.util.PrettyToString; + +import java.time.LocalDate; +import java.time.Year; +import java.util.Map; +import java.util.UUID; + +public class Student { + private UUID id; + private String firstName; + private String lastName; + private LocalDate dateOfBirth; + private ContactInfo contactInfo; + private EmergencyContact emergencyContact; + private Year enrollmentYear; + private Map courseGrades; + + public UUID getId() { + return id; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public LocalDate getDateOfBirth() { + return dateOfBirth; + } + + public ContactInfo getContactInfo() { + return contactInfo; + } + + public EmergencyContact getEmergencyContact() { + return emergencyContact; + } + + public Year getEnrollmentYear() { + return enrollmentYear; + } + + public Map getCourseGrades() { + return courseGrades; + } + + @Override + public String toString() { + return PrettyToString.toPrettyString(this); + } +} diff --git a/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/service/CourseService.java b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/service/CourseService.java new file mode 100644 index 0000000000..e71da0b23e --- /dev/null +++ b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/service/CourseService.java @@ -0,0 +1,11 @@ +package com.baeldung.instancio.student.service; + +import com.baeldung.instancio.student.model.Course; + +public class CourseService { + + public Course getByCode(String courseCode) { + throw new UnsupportedOperationException( + "This class should be mocked. Persistence is not available in a unit test"); + } +} diff --git a/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/service/EnrollmentException.java b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/service/EnrollmentException.java new file mode 100644 index 0000000000..2398556b73 --- /dev/null +++ b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/service/EnrollmentException.java @@ -0,0 +1,8 @@ +package com.baeldung.instancio.student.service; + +public class EnrollmentException extends RuntimeException { + + public EnrollmentException(final String message) { + super(message); + } +} diff --git a/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/service/EnrollmentService.java b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/service/EnrollmentService.java new file mode 100644 index 0000000000..d505a5881c --- /dev/null +++ b/testing-modules/instancio/src/main/java/com/baeldung/instancio/student/service/EnrollmentService.java @@ -0,0 +1,30 @@ +package com.baeldung.instancio.student.service; + +import com.baeldung.instancio.student.model.Course; +import com.baeldung.instancio.student.model.Grade; +import com.baeldung.instancio.student.model.Student; + +import java.util.Collection; + +public class EnrollmentService { + + private CourseService courseService; + + public boolean enrollStudent(Student student, Course course) { + Collection grades = student.getCourseGrades().values(); + if (grades.contains(Grade.F)) { + throw new EnrollmentException(String.format("Student %s has at least 1 failed course", student.getId())); + } + // process enrollment... + return true; + } + + public boolean enrollStudent(Student student, String courseCode) { + Course course = courseService.getByCode(courseCode); + if (course == null) { + throw new EnrollmentException("Course not found: " + courseCode); + } + return enrollStudent(student, course); + } + +} diff --git a/testing-modules/instancio/src/main/java/com/baeldung/instancio/util/PrettyToString.java b/testing-modules/instancio/src/main/java/com/baeldung/instancio/util/PrettyToString.java new file mode 100644 index 0000000000..163f3673c7 --- /dev/null +++ b/testing-modules/instancio/src/main/java/com/baeldung/instancio/util/PrettyToString.java @@ -0,0 +1,21 @@ +package com.baeldung.instancio.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + +public class PrettyToString { + + private static final ObjectWriter objectWriter = new ObjectMapper() + .registerModules(new JavaTimeModule()) + .writerWithDefaultPrettyPrinter(); + + public static String toPrettyString(Object obj) { + try { + return objectWriter.writeValueAsString(obj); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } +} diff --git a/testing-modules/instancio/src/test/java/com/baeldung/instancio/basics/CreateStudentUnitTest.java b/testing-modules/instancio/src/test/java/com/baeldung/instancio/basics/CreateStudentUnitTest.java new file mode 100644 index 0000000000..524c8dbc91 --- /dev/null +++ b/testing-modules/instancio/src/test/java/com/baeldung/instancio/basics/CreateStudentUnitTest.java @@ -0,0 +1,174 @@ +package com.baeldung.instancio.basics; + +import com.baeldung.instancio.student.model.Address; +import com.baeldung.instancio.student.model.ContactInfo; +import com.baeldung.instancio.student.model.Course; +import com.baeldung.instancio.student.model.Grade; +import com.baeldung.instancio.student.model.Phone; +import com.baeldung.instancio.student.model.Student; +import org.instancio.Instancio; +import org.instancio.Model; +import org.instancio.junit.InstancioExtension; +import org.instancio.junit.InstancioSource; +import org.instancio.junit.Seed; +import org.instancio.junit.WithSettings; +import org.instancio.settings.Keys; +import org.instancio.settings.Settings; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; + +import java.time.LocalDate; +import java.time.Year; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.instancio.Select.all; +import static org.instancio.Select.field; + +/** + * Sample test class using Instancio to generate test objects. + * + *

    Note: using {@link InstancioExtension} is optional. The extension adds support for: + *

    + * - reporting seed value if a test fails + * - {@link Seed} annotation for reproducing failed tests + * - {@link WithSettings} for injecting custom settings, if needed + */ +@ExtendWith(InstancioExtension.class) +class CreateStudentUnitTest { + + /** + * Common settings to be used by all test methods. + */ + @WithSettings + private static final Settings settings = Settings.create() + .set(Keys.COLLECTION_MAX_SIZE, 3); + + /** + * A {@link Model} is a template for creating objects. + * Objects created from a model can be created as is, or customized, if needed. + */ + private static Model studentModel() { + return Instancio.of(Student.class) + .generate(field(Student::getDateOfBirth), gen -> gen.temporal().localDate().past()) + .generate(field(Student::getEnrollmentYear), gen -> gen.temporal().year().past()) + .generate(field(ContactInfo::getEmail), gen -> gen.text().pattern("#a#a#a#a#a#a@example.com")) + .generate(field(Phone::getCountryCode), gen -> gen.string().prefix("+").digits().maxLength(2)) + .withNullable(field(Student::getEmergencyContact)) + .toModel(); + } + + private static void assertModelProperties(Student student) { + assertThat(student.getDateOfBirth()).isBefore(LocalDate.now()); + assertThat(student.getEnrollmentYear()).isLessThan(Year.now()); + assertThat(student.getContactInfo().getEmail()).matches("^[a-zA-Z0-9]+@example.com$"); + assertThat(student.getContactInfo().getPhones()) + .extracting(Phone::getCountryCode) + .allSatisfy(countryCode -> assertThat(countryCode).matches("^\\+\\d\\d?$")); + } + + /** + * Generates random Student objects based on the Model. + */ + @Test + void whenGivenAModel_thenShouldCreateAStudentBasedOnModel() { + Student student = Instancio.create(studentModel()); + + assertModelProperties(student); + } + + /** + * Generate a list of international students based on the Model. + */ + @Test + void whenGivenAModel_thenShouldCreateAListOfStudents() { + // Given + final int numberOfStudents = 100; + final List countries = Arrays.asList( + "China", "Germany", "India", "Poland", "Romania", "Sweden", "Switzerland"); + + // When + List studentList = Instancio.ofList(studentModel()) + .size(numberOfStudents) + .generate(field(Address::getCountry), gen -> gen.oneOf(countries)) + .create(); + + // Then + assertThat(studentList).hasSize(numberOfStudents) + .allSatisfy(CreateStudentUnitTest::assertModelProperties) + .extracting(student -> student.getContactInfo().getAddress().getCountry()) + .allSatisfy(country -> assertThat(country).isIn(countries)); + } + + /** + * Use the Model to create a student with a failed course. + * This test also demonstrates how Instancio can provide + * arguments to parameterized tests. + * + * @param failedCourse provided by Instancio + */ + @InstancioSource + @ParameterizedTest + void whenGivenFailingGrade_thenStudentShouldHaveAFailedCourse(final Course failedCourse) { + // Given + final Model model = studentModel(); + final Grade failingGrade = Grade.F; + + // When + Student student = Instancio.of(model) + .generate(field(Student::getCourseGrades), gen -> gen.map().with(failedCourse, failingGrade)) + .create(); + + // Then + Map courseGrades = student.getCourseGrades(); + assertModelProperties(student); + assertThat(courseGrades).containsEntry(failedCourse, failingGrade); + } + + /** + * Generate a student with only Grades A and/or B. + */ + @Test + void whenGivenGoodGrades_thenCreatedStudentShouldHaveExpectedGrades() { + // Given + final int numOfCourses = 10; + final Grade[] grades = {Grade.A, Grade.B}; + + // When + Student student = Instancio.of(studentModel()) + .generate(all(Grade.class), gen -> gen.oneOf(grades)) + .generate(field(Student::getCourseGrades), gen -> gen.map().size(numOfCourses)) + .create(); + + // Then + Map courseGrades = student.getCourseGrades(); + assertModelProperties(student); + assertThat(courseGrades.values()) + .hasSize(numOfCourses) + .containsAnyOf(grades) + .doesNotContain(Grade.C, Grade.D, Grade.F); + } + + /** + * Generate String fields prefixed with the field's name. + */ + @Test + void whenGivenCustomSettings_thenStudentShouldBeCreatedUsingTheSettings() { + // Given + Settings customSettings = Settings.create() + .set(Keys.STRING_FIELD_PREFIX_ENABLED, true); + + // When + Student student = Instancio.of(studentModel()) + .withSettings(customSettings) + .create(); + + // Then + assertThat(student.getFirstName()).startsWith("firstName_"); + assertThat(student.getLastName()).startsWith("lastName_"); + assertThat(student.getContactInfo().getAddress().getCity()).startsWith("city_"); + } +} diff --git a/testing-modules/instancio/src/test/java/com/baeldung/instancio/generators/UsingCustomGeneratorUnitTest.java b/testing-modules/instancio/src/test/java/com/baeldung/instancio/generators/UsingCustomGeneratorUnitTest.java new file mode 100644 index 0000000000..8e5643baec --- /dev/null +++ b/testing-modules/instancio/src/test/java/com/baeldung/instancio/generators/UsingCustomGeneratorUnitTest.java @@ -0,0 +1,57 @@ +package com.baeldung.instancio.generators; + +import com.baeldung.instancio.student.model.Address; +import com.baeldung.instancio.student.model.ContactInfo; +import com.baeldung.instancio.student.model.Phone; +import com.baeldung.instancio.student.model.Student; +import org.instancio.Instancio; +import org.instancio.Random; +import org.instancio.generator.AfterGenerate; +import org.instancio.generator.Generator; +import org.instancio.generator.Hints; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.instancio.Select.all; +import static org.instancio.Select.field; + +class UsingCustomGeneratorUnitTest { + private static final String ARGENTINA = "Argentina"; + private static final int PHONES_SIZE = 5; + + private static final Generator

    ADDRESS_GENERATOR = new Generator
    () { + @Override + public Address generate(final Random random) { + Address address = new Address(); + address.setCountry(ARGENTINA); + return address; + } + + @Override + public Hints hints() { + // The hint telling the engine to populate any field that has a null value + return Hints.afterGenerate(AfterGenerate.POPULATE_NULLS); + } + }; + + @Test + void whenGivenAGenerator_objectShouldBeCreatedUsingCustomGenerator() { + Student student = Instancio.of(Student.class) + .supply(all(Address.class), ADDRESS_GENERATOR) + .generate(field(ContactInfo::getPhones), gen -> gen.collection().size(PHONES_SIZE)) + .create(); + + ContactInfo contactInfo = student.getContactInfo(); + Address address = contactInfo.getAddress(); + List phones = contactInfo.getPhones(); + + assertThat(phones).hasSize(PHONES_SIZE); + assertThat(address.getCountry()).isEqualTo(ARGENTINA); + // null fields were populated with random values + assertThat(address.getStreet()).isNotNull(); + assertThat(address.getCity()).isNotNull(); + } + +} diff --git a/testing-modules/instancio/src/test/java/com/baeldung/instancio/generics/CreatingGenericTypesUnitTest.java b/testing-modules/instancio/src/test/java/com/baeldung/instancio/generics/CreatingGenericTypesUnitTest.java new file mode 100644 index 0000000000..4ed22abeaf --- /dev/null +++ b/testing-modules/instancio/src/test/java/com/baeldung/instancio/generics/CreatingGenericTypesUnitTest.java @@ -0,0 +1,100 @@ +package com.baeldung.instancio.generics; + +import com.baeldung.instancio.student.model.Address; +import org.instancio.Instancio; +import org.instancio.TypeToken; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.instancio.Select.allLongs; +import static org.instancio.Select.allStrings; + +/** + * Examples of creating generic types using {@link TypeToken}. + */ +class CreatingGenericTypesUnitTest { + + + @Test + void whenGivenTypeToken_shouldCreateItem() { + Item item = Instancio.create(new TypeToken>() {}); + + assertThat(item.getValue()).isNotBlank(); + } + + @Test + void whenGivenTypeToken_shouldCreateCustomizedItem() { + Pair pair = Instancio.of(new TypeToken>() {}) + .generate(allStrings(), gen -> gen.oneOf("foo", "bar")) + .generate(allLongs(), gen -> gen.longs().range(5L, 10L)) + .create(); + + assertThat(pair.getLeft()).isIn("foo", "bar"); + assertThat(pair.getRight()).isBetween(5L, 10L); + } + + @Test + void whenGivenTypeToken_shouldCreateTriplet() { + Triplet triplet = Instancio.create(new TypeToken>() {}); + + assertThat(triplet.getLeft()).isNotBlank(); + assertThat(triplet.getMiddle()).isNotNull(); + assertThat(triplet.getRight()).isNotNull(); + } + + @Test + void whenGivenTypeToken_shouldCreateCollection() { + List list = Instancio.create(new TypeToken>() {}); + + assertThat(list).isNotEmpty().doesNotContainNull(); + } + + @Test + void whenGivenTypeToken_shouldCreateMap() { + Map map = Instancio.create(new TypeToken>() {}); + + assertThat(map).isNotEmpty(); + } + + /** + * Using type token to create more complex generic objects. + */ + @Test + void whenGivenTypeTokenWithNestGenerics_shouldCreateAnInstanceOfSpecifiedType() { + List>> list = Instancio.create( + new TypeToken>>>() {}); + + assertThat(list) + .isNotEmpty() + .allSatisfy(triplet -> { + assertThat(triplet.getLeft()).isInstanceOf(Integer.class); + assertThat(triplet.getMiddle()).isInstanceOf(LocalDate.class); + assertThat(triplet.getRight()) + .isInstanceOf(Item.class) + .satisfies(item -> assertThat(item.getValue()).isNotBlank()); + }); + + // Sample output + list.forEach(System.out::println); + } + + + /** + * Alternative way to create generic objects is using 'withTypeParameters'. + * However, this approach generates an "unchecked assignment" warning. + */ + @Test + @SuppressWarnings("unchecked") + void whenGivenClassWithTypeParameters_shouldCreateGenericType() { + Map map = Instancio.of(Map.class) + .withTypeParameters(UUID.class, Address.class) + .create(); + + assertThat(map).isNotEmpty(); + } +} diff --git a/testing-modules/instancio/src/test/java/com/baeldung/instancio/mockito/InstancioWithMockitoUnitTest.java b/testing-modules/instancio/src/test/java/com/baeldung/instancio/mockito/InstancioWithMockitoUnitTest.java new file mode 100644 index 0000000000..1382589a84 --- /dev/null +++ b/testing-modules/instancio/src/test/java/com/baeldung/instancio/mockito/InstancioWithMockitoUnitTest.java @@ -0,0 +1,45 @@ +package com.baeldung.instancio.mockito; + +import com.baeldung.instancio.student.model.Course; +import com.baeldung.instancio.student.model.Grade; +import com.baeldung.instancio.student.model.Student; +import com.baeldung.instancio.student.service.CourseService; +import com.baeldung.instancio.student.service.EnrollmentService; +import org.instancio.Instancio; +import org.instancio.junit.InstancioExtension; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.instancio.Select.all; +import static org.mockito.Mockito.when; + +@ExtendWith({MockitoExtension.class, InstancioExtension.class}) +class InstancioWithMockitoUnitTest { + + @Mock + private CourseService courseService; + + @InjectMocks + private EnrollmentService enrollmentService; + + @Test + void givenStudentWithoutGradeF_thenShouldEnrollStudentInCourse() { + // Given + Student student = Instancio.of(Student.class) + .generate(all(Grade.class), gen -> gen.enumOf(Grade.class).excluding(Grade.F)) + .create(); + + Course course = Instancio.create(Course.class); + when(courseService.getByCode(course.getCode())).thenReturn(course); + + // When + boolean isEnrolled = enrollmentService.enrollStudent(student, course.getCode()); + + // Then + assertThat(isEnrolled).isTrue(); + } +} diff --git a/testing-modules/instancio/src/test/java/com/baeldung/instancio/reproducing/ReproducingTestFailureUnitTest.java b/testing-modules/instancio/src/test/java/com/baeldung/instancio/reproducing/ReproducingTestFailureUnitTest.java new file mode 100644 index 0000000000..0d6c8cfa9a --- /dev/null +++ b/testing-modules/instancio/src/test/java/com/baeldung/instancio/reproducing/ReproducingTestFailureUnitTest.java @@ -0,0 +1,60 @@ +package com.baeldung.instancio.reproducing; + +import com.baeldung.instancio.student.model.Course; +import com.baeldung.instancio.student.model.Student; +import com.baeldung.instancio.student.service.EnrollmentService; +import org.instancio.Instancio; +import org.instancio.junit.InstancioExtension; +import org.instancio.junit.Seed; +import org.instancio.junit.WithSettings; +import org.instancio.settings.Keys; +import org.instancio.settings.Settings; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import static org.assertj.core.api.Assertions.assertThat; + +@ExtendWith(InstancioExtension.class) +class ReproducingTestFailureUnitTest { + + @WithSettings + private static final Settings settings = Settings.create() + .set(Keys.COLLECTION_MIN_SIZE, 50) + .set(Keys.COLLECTION_MAX_SIZE, 100) + .lock(); + + private final EnrollmentService enrollmentService = new EnrollmentService(); + + /** + * This test fails because the {@code enrollInCourse()} method + * throws an exception if the student has at least one grade F. + * + *

    Sample error message generated by {@link InstancioExtension}: + * + *

    +     * timestamp = 2023-01-24T13:50:12.436704221, Instancio = Test method 'enrollStudent' failed with seed: 1234
    +     * 
    + *

    + * Using the reported seed value we can reproduce the test failure. + */ + @Test + @Seed(1234) + @Disabled("This test fails on purpose to demonstrate failure reporting by InstancioExtension") + void whenGivenNoFailingGrades_thenShouldEnrollStudentInCourse() { + // Given + Course course = Instancio.create(Course.class); + Student student = Instancio.of(Student.class) + // The test can be fixed by uncommenting the line below: + //.generate(all(Grade.class), gen -> gen.enumOf(Grade.class).excluding(Grade.F)) + .create(); + + System.out.println(student); // same data generated on each run + + // When + boolean isEnrolled = enrollmentService.enrollStudent(student, course); + + // Then + assertThat(isEnrolled).isTrue(); + } +} diff --git a/testing-modules/instancio/src/test/java/com/baeldung/instancio/selectors/SelectorScopesUnitTest.java b/testing-modules/instancio/src/test/java/com/baeldung/instancio/selectors/SelectorScopesUnitTest.java new file mode 100644 index 0000000000..683b510f0c --- /dev/null +++ b/testing-modules/instancio/src/test/java/com/baeldung/instancio/selectors/SelectorScopesUnitTest.java @@ -0,0 +1,76 @@ +package com.baeldung.instancio.selectors; + +import com.baeldung.instancio.student.model.ContactInfo; +import com.baeldung.instancio.student.model.EmergencyContact; +import com.baeldung.instancio.student.model.Phone; +import com.baeldung.instancio.student.model.Student; +import org.instancio.Instancio; +import org.instancio.Scope; +import org.instancio.Select; +import org.instancio.TargetSelector; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.instancio.Select.allStrings; +import static org.instancio.Select.scope; + +/** + * Examples of various selector {@link Scope}. + * Scopes allow narrowing down selector targets. + */ +class SelectorScopesUnitTest { + + /** + * Prefix all String fields in Phone class with "phone_". + */ + @Test + void whenGivenClassScope_shouldSelectTargetsWithinClass() { + // Given + final String prefix = "phone_"; + final Scope phoneClass = scope(Phone.class); + + // When + Student student = Instancio.of(Student.class) + .generate(allStrings().within(phoneClass), gen -> gen.string().prefix(prefix)) + .create(); + + // Then + + // matches phone numbers + Phone emergencyContactPhone = student.getEmergencyContact().getPhone(); + assertThat(emergencyContactPhone.getCountryCode()).startsWith(prefix); + assertThat(emergencyContactPhone.getNumber()).startsWith(prefix); + assertThat(student.getContactInfo().getPhones()).allSatisfy(phone -> { + assertThat(phone.getCountryCode()).startsWith(prefix); + assertThat(phone.getNumber()).startsWith(prefix); + }); + + // does not match other fields + assertThat(student.getContactInfo().getAddress().getCity()).doesNotStartWith(prefix); + } + + /** + * Using scope to set student's and their emergency contact's + * phone number to different values. + */ + @Test + void whenGivenFieldScope_shouldSelectTargetsWithinField() { + // Given + TargetSelector studentPhone = Select.field(Phone::getNumber).within(scope(ContactInfo.class)); + TargetSelector emergencyPhone = Select.field(Phone::getNumber).within(scope(EmergencyContact.class)); + + // When + Student student = Instancio.of(Student.class) + .set(studentPhone, "student") + .set(emergencyPhone, "emergency") + .create(); + + // Then + assertThat(student.getContactInfo().getPhones()) + .isNotEmpty() + .allSatisfy(phone -> assertThat(phone.getNumber()).isEqualTo("student")); + + assertThat(student.getEmergencyContact().getPhone().getNumber()) + .isEqualTo("emergency"); + } +} diff --git a/testing-modules/instancio/src/test/java/com/baeldung/instancio/selectors/SelectorsUnitTest.java b/testing-modules/instancio/src/test/java/com/baeldung/instancio/selectors/SelectorsUnitTest.java new file mode 100644 index 0000000000..fe6b9cc3f4 --- /dev/null +++ b/testing-modules/instancio/src/test/java/com/baeldung/instancio/selectors/SelectorsUnitTest.java @@ -0,0 +1,104 @@ +package com.baeldung.instancio.selectors; + +import com.baeldung.instancio.student.model.Address; +import com.baeldung.instancio.student.model.ContactInfo; +import com.baeldung.instancio.student.model.Phone; +import com.baeldung.instancio.student.model.Student; +import org.instancio.FieldSelectorBuilder; +import org.instancio.Instancio; +import org.instancio.Select; +import org.instancio.Selector; +import org.instancio.SelectorGroup; +import org.instancio.TargetSelector; +import org.junit.jupiter.api.Test; + +import java.util.Collection; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.instancio.Select.all; +import static org.instancio.Select.field; +import static org.instancio.Select.fields; +import static org.instancio.Select.types; + +/** + * Examples of various types of selectors provided by the {@link Select} class. + */ +class SelectorsUnitTest { + + @Test + void whenGivenFieldSelector_shouldCustomizeSelectedField() { + Address address = Instancio.of(Address.class) + .set(field(Address::getCity), "London") + .set(field(Address.class, "country"), "UK") + .create(); + + assertThat(address.getCity()).isEqualTo("London"); + assertThat(address.getCountry()).isEqualTo("UK"); + } + + @Test + void whenGivenClassSelector_shouldCustomizeSelectedClass() { + // Given + final Selector allStrings = all(String.class); + final String prefix = "test_"; + + // When + Address address = Instancio.of(Address.class) + .generate(allStrings, gen -> gen.string().prefix(prefix)) + .create(); + + // Then + assertThat(address.getCity()).startsWith(prefix); + assertThat(address.getCountry()).startsWith(prefix); + } + + @Test + void whenGivenPredicateFieldSelector_shouldCustomizeMatchingFields() { + // Given: regie matching 'city' and 'country' fields + final FieldSelectorBuilder fieldsMatchingRegex = fields().matching("c.*y"); + + // When + Address address = Instancio.of(Address.class) + .ignore(fieldsMatchingRegex) + .create(); + + // Then + assertThat(address.getCity()).isNull(); + assertThat(address.getCountry()).isNull(); + assertThat(address.getStreet()).isNotBlank(); + } + + @Test + void whenGivenPredicateClassSelector_shouldCustomizeMatchingClasses() { + // Given + final TargetSelector allTypesOfCollections = types().of(Collection.class); + final int size = 3; + + // When + ContactInfo contactInfo = Instancio.of(ContactInfo.class) + .generate(allTypesOfCollections, gen -> gen.collection().size(size)) + .create(); + + // Then + List phones = contactInfo.getPhones(); + assertThat(phones).hasSize(size); + } + + @Test + void whenGivenSelectorGroup_shouldCustomizeSelectedFields() { + // Given + SelectorGroup ignoredFields = all( + field(Student::getId), + field(Student::getDateOfBirth)); + + // When + Student student = Instancio.of(Student.class) + .ignore(ignoredFields) + .create(); + + // Then + assertThat(student.getId()).isNull(); + assertThat(student.getDateOfBirth()).isNull(); + } +} diff --git a/testing-modules/instancio/src/test/java/com/baeldung/instancio/settings/CustomSettingsUnitTest.java b/testing-modules/instancio/src/test/java/com/baeldung/instancio/settings/CustomSettingsUnitTest.java new file mode 100644 index 0000000000..b9b8b4ac6d --- /dev/null +++ b/testing-modules/instancio/src/test/java/com/baeldung/instancio/settings/CustomSettingsUnitTest.java @@ -0,0 +1,67 @@ +package com.baeldung.instancio.settings; + +import com.baeldung.instancio.student.model.ContactInfo; +import com.baeldung.instancio.student.model.Phone; +import org.instancio.Instancio; +import org.instancio.junit.InstancioExtension; +import org.instancio.junit.WithSettings; +import org.instancio.settings.Keys; +import org.instancio.settings.Settings; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * {@link InstancioExtension} allows injecting custom settings + * using the {@link WithSettings} annotation. + */ +@ExtendWith(InstancioExtension.class) +class CustomSettingsUnitTest { + + private static final int MIN_SIZE = 0; + private static final int MAX_SIZE = 3; + + /** + * Common settings to be used by all test methods. + */ + @WithSettings + private static final Settings settings = Settings.create() + .set(Keys.COLLECTION_MIN_SIZE, MIN_SIZE) + .set(Keys.COLLECTION_MAX_SIZE, MAX_SIZE) + .lock(); + + + @Test + void whenGivenInjectedSettings_shouldUseCustomSettings() { + ContactInfo info = Instancio.create(ContactInfo.class); + + List phones = info.getPhones(); + assertThat(phones).hasSizeBetween(MIN_SIZE, MAX_SIZE); + } + + @Test + void whenSettingsOverridden_shouldUseTheOverrides() { + // Given + final int collectionSize = 50; + Settings additionalSettings = Settings.create() + .set(Keys.STRING_FIELD_PREFIX_ENABLED, true) + .set(Keys.COLLECTION_MIN_SIZE, collectionSize) + .set(Keys.COLLECTION_MAX_SIZE, collectionSize); + + // When + ContactInfo info = Instancio.of(ContactInfo.class) + .withSettings(additionalSettings) + .create(); + + // Then + assertThat(info.getPhones()) + .hasSize(collectionSize) + .allSatisfy(phone -> { + assertThat(phone.getCountryCode()).startsWith("countryCode_"); + assertThat(phone.getNumber()).startsWith("number_"); + }); + } +} diff --git a/testing-modules/instancio/src/test/java/com/baeldung/instancio/settings/UsingInstancioPropertiesUnitTest.java b/testing-modules/instancio/src/test/java/com/baeldung/instancio/settings/UsingInstancioPropertiesUnitTest.java new file mode 100644 index 0000000000..6a14d8dc88 --- /dev/null +++ b/testing-modules/instancio/src/test/java/com/baeldung/instancio/settings/UsingInstancioPropertiesUnitTest.java @@ -0,0 +1,50 @@ +package com.baeldung.instancio.settings; + +import org.instancio.Instancio; +import org.instancio.settings.Keys; +import org.instancio.settings.Settings; +import org.junit.jupiter.api.Test; + +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + +class UsingInstancioPropertiesUnitTest { + + /** + * Instancio automatically loads {@code instancio.properties} file, + * if it's present, from the root of the classpath. + * + *

    Float range was overridden to [0, 100]. + * See: {@code src/test/resources/instancio.properties} + */ + @Test + void whenInstancioPropertiesAreOnClasspath_shouldUseConfiguredProperties() { + Set floats = Instancio.ofSet(Float.class).create(); + + assertThat(floats) + .isNotEmpty() + .allSatisfy(f -> assertThat(f).isBetween(0f, 100f)); + } + + /** + * We can override global configuration using {@link Settings}. + */ + @Test + void whenCustomSettingsAreProvided_shouldOverrideInstancioProperties() { + // Given + Settings settings = Settings.create() + .set(Keys.FLOAT_MIN, 100f) + .set(Keys.FLOAT_MAX, 200f); + + // When + Set floats = Instancio.ofSet(Float.class) + .withSettings(settings) + .create(); + + // Then + assertThat(floats) + .isNotEmpty() + .allSatisfy(f -> assertThat(f).isBetween(100f, 200f)); + } +} diff --git a/testing-modules/instancio/src/test/java/com/baeldung/instancio/subtype/SubtypeUnitTest.java b/testing-modules/instancio/src/test/java/com/baeldung/instancio/subtype/SubtypeUnitTest.java new file mode 100644 index 0000000000..7bbfaa497f --- /dev/null +++ b/testing-modules/instancio/src/test/java/com/baeldung/instancio/subtype/SubtypeUnitTest.java @@ -0,0 +1,54 @@ +package com.baeldung.instancio.subtype; + +import com.baeldung.instancio.abstracttype.AbstractItem; +import com.baeldung.instancio.generics.Item; +import com.baeldung.instancio.student.model.ContactInfo; +import com.baeldung.instancio.student.model.Student; +import org.instancio.Instancio; +import org.instancio.TypeToken; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; +import java.util.LinkedList; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.instancio.Select.all; +import static org.instancio.Select.field; + +/** + * Using {@code subtype()} method we can specify a specific implementation + * class for an abstract type, or a specialized subclass for a concrete class. + */ +class SubtypeUnitTest { + + @Test + void whenGivenCollectionSubtype_shouldUseSpecifiedCollectionClass() { + // Given + final Class subtype = LinkedList.class; + + // When + Student student = Instancio.of(Student.class) + .subtype(field(ContactInfo::getPhones), subtype) + .create(); + + // Then + assertThat(student.getContactInfo().getPhones()) + .isNotEmpty() + .isExactlyInstanceOf(subtype); + } + + @Test + void whenGivenSubtypeForGenericAbstractType_shouldUseSpecifiedConcreteClass() { + // Given + final Class subtype = Item.class; + + // When + AbstractItem abstractItem = Instancio.of(new TypeToken>() {}) + .subtype(all(AbstractItem.class), subtype) + .create(); + + // Then + assertThat(abstractItem).isExactlyInstanceOf(subtype); + assertThat(abstractItem.getValue()).isNotNull(); + } +} diff --git a/testing-modules/instancio/src/test/resources/instancio.properties b/testing-modules/instancio/src/test/resources/instancio.properties new file mode 100644 index 0000000000..a314af0a3f --- /dev/null +++ b/testing-modules/instancio/src/test/resources/instancio.properties @@ -0,0 +1,2 @@ +float.min=1 +float.max=100 diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index f237d2d6fc..64546b5064 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -22,6 +22,7 @@ gatling groovy-spock hamcrest + instancio junit-4 junit-5-advanced junit-5-basics From 3b521d448fd284b3a11e4c00fb7bdcb303f6bdd0 Mon Sep 17 00:00:00 2001 From: lucaCambi77 Date: Fri, 27 Jan 2023 03:42:54 +0100 Subject: [PATCH 355/592] [ BAEL-6068 ] - Communicating with Docker containers on the same machine (#13343) * fix: build clean up * feat: add docker compose 2 module, add communication same machine docker compose * fix: remove unused package lock file --- .../multi-module-caching/pom.xml | 5 +-- .../single-module-caching/pom.xml | 5 +-- docker-modules/docker-compose-2/README.md | 1 + .../communication_same_machine/Dockerfile | 3 ++ .../Dockerfile.node | 7 ++++ .../dns/docker-compose.yml | 20 +++++++++++ .../host_docker_internal/docker-compose.yml | 29 +++++++++++++++ .../host_docker_internal/index.js | 10 ++++++ .../host_docker_internal/package.json | 14 ++++++++ .../static_ip_bridge/docker-compose.yml | 34 ++++++++++++++++++ .../static_ip_macvlan/docker-compose.yml | 36 +++++++++++++++++++ docker-modules/docker-compose-2/pom.xml | 16 +++++++++ docker-modules/pom.xml | 1 + 13 files changed, 177 insertions(+), 4 deletions(-) create mode 100644 docker-modules/docker-compose-2/README.md create mode 100644 docker-modules/docker-compose-2/communication_same_machine/Dockerfile create mode 100644 docker-modules/docker-compose-2/communication_same_machine/Dockerfile.node create mode 100644 docker-modules/docker-compose-2/communication_same_machine/dns/docker-compose.yml create mode 100644 docker-modules/docker-compose-2/communication_same_machine/host_docker_internal/docker-compose.yml create mode 100644 docker-modules/docker-compose-2/communication_same_machine/host_docker_internal/index.js create mode 100644 docker-modules/docker-compose-2/communication_same_machine/host_docker_internal/package.json create mode 100644 docker-modules/docker-compose-2/communication_same_machine/static_ip_bridge/docker-compose.yml create mode 100644 docker-modules/docker-compose-2/communication_same_machine/static_ip_macvlan/docker-compose.yml create mode 100644 docker-modules/docker-compose-2/pom.xml diff --git a/docker-modules/docker-caching/multi-module-caching/pom.xml b/docker-modules/docker-caching/multi-module-caching/pom.xml index f85f00a28d..94a370453c 100644 --- a/docker-modules/docker-caching/multi-module-caching/pom.xml +++ b/docker-modules/docker-caching/multi-module-caching/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 multi-module-caching @@ -25,6 +25,7 @@ + UTF-8 1.8 31.1-jre diff --git a/docker-modules/docker-caching/single-module-caching/pom.xml b/docker-modules/docker-caching/single-module-caching/pom.xml index aa9720a273..4a4e53f1d3 100644 --- a/docker-modules/docker-caching/single-module-caching/pom.xml +++ b/docker-modules/docker-caching/single-module-caching/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 single-module-caching @@ -48,6 +48,7 @@ 8 8 + UTF-8 31.1-jre diff --git a/docker-modules/docker-compose-2/README.md b/docker-modules/docker-compose-2/README.md new file mode 100644 index 0000000000..729105e3fd --- /dev/null +++ b/docker-modules/docker-compose-2/README.md @@ -0,0 +1 @@ +## Relevant Articles: diff --git a/docker-modules/docker-compose-2/communication_same_machine/Dockerfile b/docker-modules/docker-compose-2/communication_same_machine/Dockerfile new file mode 100644 index 0000000000..a0c4ebe59a --- /dev/null +++ b/docker-modules/docker-compose-2/communication_same_machine/Dockerfile @@ -0,0 +1,3 @@ +FROM alpine:latest +MAINTAINER baeldung.com +RUN apk update && apk add iputils && apk add bash && apk add curl \ No newline at end of file diff --git a/docker-modules/docker-compose-2/communication_same_machine/Dockerfile.node b/docker-modules/docker-compose-2/communication_same_machine/Dockerfile.node new file mode 100644 index 0000000000..6d8f0eff81 --- /dev/null +++ b/docker-modules/docker-compose-2/communication_same_machine/Dockerfile.node @@ -0,0 +1,7 @@ +FROM node:8.16.1-alpine +WORKDIR /app +COPY host_docker_internal/package.json /app +COPY host_docker_internal/index.js /app +RUN npm install +CMD node index.js +EXPOSE 8080 \ No newline at end of file diff --git a/docker-modules/docker-compose-2/communication_same_machine/dns/docker-compose.yml b/docker-modules/docker-compose-2/communication_same_machine/dns/docker-compose.yml new file mode 100644 index 0000000000..0a06993241 --- /dev/null +++ b/docker-modules/docker-compose-2/communication_same_machine/dns/docker-compose.yml @@ -0,0 +1,20 @@ +services: + alpine-app-1: + container_name: alpine-app-1 + image: alpine-app-1 + build: + context: .. + dockerfile: Dockerfile + tty: true + ports: + - 8081:8081 + + alpine-app-2: + container_name: alpine-app-2 + image: alpine-app-2 + build: + context: .. + dockerfile: Dockerfile + tty: true + ports: + - 8080:8080 diff --git a/docker-modules/docker-compose-2/communication_same_machine/host_docker_internal/docker-compose.yml b/docker-modules/docker-compose-2/communication_same_machine/host_docker_internal/docker-compose.yml new file mode 100644 index 0000000000..8e7174a9a1 --- /dev/null +++ b/docker-modules/docker-compose-2/communication_same_machine/host_docker_internal/docker-compose.yml @@ -0,0 +1,29 @@ +services: + alpine-app-1: + container_name: alpine-app-1 + extra_hosts: # for linux hosts since version 20.10 + - host.docker.internal:host-gateway + build: + context: .. + dockerfile: Dockerfile + image: alpine-app-1 + tty: true + networks: + - first-network + + node-app: + container_name: node-app + build: + context: .. + dockerfile: Dockerfile.node + image: node-app + ports: + - 8080:8080 + networks: + - second-network + +networks: + first-network: + driver: bridge + second-network: + driver: bridge \ No newline at end of file diff --git a/docker-modules/docker-compose-2/communication_same_machine/host_docker_internal/index.js b/docker-modules/docker-compose-2/communication_same_machine/host_docker_internal/index.js new file mode 100644 index 0000000000..cefae028e5 --- /dev/null +++ b/docker-modules/docker-compose-2/communication_same_machine/host_docker_internal/index.js @@ -0,0 +1,10 @@ +var express = require('express') +var app = express() + +app.get('/', function (req, res) { + res.send('Hello World!') +}) + +app.listen(8080, function () { + console.log('app listening on port 8080!') +}) \ No newline at end of file diff --git a/docker-modules/docker-compose-2/communication_same_machine/host_docker_internal/package.json b/docker-modules/docker-compose-2/communication_same_machine/host_docker_internal/package.json new file mode 100644 index 0000000000..cde98b1cfd --- /dev/null +++ b/docker-modules/docker-compose-2/communication_same_machine/host_docker_internal/package.json @@ -0,0 +1,14 @@ +{ + "name": "host_docker_internal", + "version": "1.0.0", + "description": "node js app", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Baeldung", + "license": "ISC", + "dependencies": { + "express": "^4.18.2" + } +} diff --git a/docker-modules/docker-compose-2/communication_same_machine/static_ip_bridge/docker-compose.yml b/docker-modules/docker-compose-2/communication_same_machine/static_ip_bridge/docker-compose.yml new file mode 100644 index 0000000000..0193bd72fb --- /dev/null +++ b/docker-modules/docker-compose-2/communication_same_machine/static_ip_bridge/docker-compose.yml @@ -0,0 +1,34 @@ +services: + alpine-app-1: + container_name: alpine-app-1 + build: + context: .. + dockerfile: Dockerfile + image: alpine-app-1 + tty: true + ports: + - 8080:8080 + networks: + network-example: + ipv4_address: 10.5.0.2 + + alpine-app-2: + container_name: alpine-app-2 + build: + context: .. + dockerfile: Dockerfile + image: alpine-app-2 + tty: true + ports: + - 8081:8081 + networks: + network-example: + ipv4_address: 10.5.0.3 + +networks: + network-example: + driver: bridge + ipam: + config: + - subnet: 10.5.0.0/16 + gateway: 10.5.0.1 \ No newline at end of file diff --git a/docker-modules/docker-compose-2/communication_same_machine/static_ip_macvlan/docker-compose.yml b/docker-modules/docker-compose-2/communication_same_machine/static_ip_macvlan/docker-compose.yml new file mode 100644 index 0000000000..cef1a0b5cb --- /dev/null +++ b/docker-modules/docker-compose-2/communication_same_machine/static_ip_macvlan/docker-compose.yml @@ -0,0 +1,36 @@ +services: + alpine-app-1: + container_name: alpine-app-1 + build: + context: .. + dockerfile: Dockerfile + image: alpine-app-1 + tty: true + ports: + - 8080:8080 + networks: + network-example: + ipv4_address: 192.168.2.2 + + alpine-app-2: + container_name: alpine-app-2 + build: + context: .. + dockerfile: Dockerfile + image: alpine-app-2 + tty: true + ports: + - 8081:8081 + networks: + network-example: + ipv4_address: 192.168.2.3 + +networks: + network-example: + driver: macvlan + driver_opts: + parent: enp0s3 + ipam: + config: + - subnet: 192.168.2.0/24 + gateway: 192.168.2.1 \ No newline at end of file diff --git a/docker-modules/docker-compose-2/pom.xml b/docker-modules/docker-compose-2/pom.xml new file mode 100644 index 0000000000..851742309d --- /dev/null +++ b/docker-modules/docker-compose-2/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + docker-compose-2 + Demo project for Spring Boot and Docker - Module docker-compose-2 + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + \ No newline at end of file diff --git a/docker-modules/pom.xml b/docker-modules/pom.xml index e71307b7e0..1a87fa5d1c 100644 --- a/docker-modules/pom.xml +++ b/docker-modules/pom.xml @@ -18,6 +18,7 @@ docker-caching docker-compose + docker-compose-2 docker-containers docker-images docker-spring-boot From b5d8f4e93cda10e49b15d06ad667e3bafda47809 Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Fri, 27 Jan 2023 08:22:01 +0100 Subject: [PATCH 356/592] BAEL-5952-Java HttpClient - Map Json Response to Java Class (#13234) * Java HttpClient - Map Json Response to Java Class * BAEL-5952-Java HttpClient - Map Json Response to Java Class * BAEL-5952-Java HttpClient - Map Json Response to Java Class * Java HttpClient - Map Json Response to Java Class * Java HttpClient - Map Json Response to Java Class * Java HttpClient - Map Json Response to Java Class * Java HttpClient - Map Json Response to Java Class * Java HttpClient - Map Json Response to Java Class * Java HttpClient - Map Json Response to Java Class * Java HttpClient - Map Json Response to Java Class * Java HttpClient - Map Json Response to Java Class * Java HttpClient - Map Json Response to Java Class * Java HttpClient - Map Json Response to Java Class * Java HttpClient - Map Json Response to Java Class * Java HttpClient - Map Json Response to Java Class * Java HttpClient - Map Json Response to Java Class * Java HttpClient - Map Json Response to Java Class * Java HttpClient - Map Json Response to Java Class --- core-java-modules/core-java-11-3/pom.xml | 16 +++ .../main/java/com/baeldung/httppojo/Todo.java | 73 ++++++++++++ .../com/baeldung/httppojo/TodoAppClient.java | 107 ++++++++++++++++++ .../httppojo/HttpClientPojoClassUnitTest.java | 45 ++++++++ 4 files changed, 241 insertions(+) create mode 100644 core-java-modules/core-java-11-3/src/main/java/com/baeldung/httppojo/Todo.java create mode 100644 core-java-modules/core-java-11-3/src/main/java/com/baeldung/httppojo/TodoAppClient.java create mode 100644 core-java-modules/core-java-11-3/src/test/java/com/baeldung/httppojo/HttpClientPojoClassUnitTest.java diff --git a/core-java-modules/core-java-11-3/pom.xml b/core-java-modules/core-java-11-3/pom.xml index b4a4591b28..ccccae5ba1 100644 --- a/core-java-modules/core-java-11-3/pom.xml +++ b/core-java-modules/core-java-11-3/pom.xml @@ -14,6 +14,20 @@ 1.0.0-SNAPSHOT ../../pom.xml + + + + com.google.code.gson + gson + ${gson.version} + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + @@ -32,6 +46,8 @@ 11 11 + 2.14.1 + 2.10 \ No newline at end of file diff --git a/core-java-modules/core-java-11-3/src/main/java/com/baeldung/httppojo/Todo.java b/core-java-modules/core-java-11-3/src/main/java/com/baeldung/httppojo/Todo.java new file mode 100644 index 0000000000..01a1ee5c52 --- /dev/null +++ b/core-java-modules/core-java-11-3/src/main/java/com/baeldung/httppojo/Todo.java @@ -0,0 +1,73 @@ +package com.baeldung.httppojo; + +import java.util.Objects; + +public class Todo { + + int userId; + int id; + String title; + boolean completed; + + public Todo() { + } + + public Todo(int userId, int id, String title, boolean completed) { + this.userId = userId; + this.id = id; + this.title = title; + this.completed = completed; + } + + public int getUserId() { + return userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public boolean isCompleted() { + return completed; + } + + public void setCompleted(boolean completed) { + this.completed = completed; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Todo todo = (Todo) o; + return userId == todo.userId && id == todo.id && completed == todo.completed && Objects.equals(title, todo.title); + } + + @Override + public int hashCode() { + return Objects.hash(userId, id, title, completed); + } + + @Override + public String toString() { + return "{" + "userId=" + userId + ", id=" + id + ", title='" + title + '\'' + ", completed=" + completed + '}'; + } +} diff --git a/core-java-modules/core-java-11-3/src/main/java/com/baeldung/httppojo/TodoAppClient.java b/core-java-modules/core-java-11-3/src/main/java/com/baeldung/httppojo/TodoAppClient.java new file mode 100644 index 0000000000..c2295d97ce --- /dev/null +++ b/core-java-modules/core-java-11-3/src/main/java/com/baeldung/httppojo/TodoAppClient.java @@ -0,0 +1,107 @@ +package com.baeldung.httppojo; + +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.net.http.HttpResponse.BodyHandlers; +import java.util.List; +import java.util.concurrent.CompletionException; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; + +public class TodoAppClient { + + ObjectMapper objectMapper = new ObjectMapper(); + + Gson gson = new GsonBuilder().create(); + + public String sampleApiRequest() throws Exception { + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("https://jsonplaceholder.typicode.com/todos")) + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + + return response.body(); + + } + + public Todo syncGson() throws Exception { + String response = sampleApiRequest(); + + List todo = gson.fromJson(response, new TypeToken>() { + }.getType()); + + return todo.get(1); + + } + + public Todo syncJackson() throws Exception { + String response = sampleApiRequest(); + + Todo[] todo = objectMapper.readValue(response, Todo[].class); + + return todo[1]; + + } + + public Todo asyncJackson() throws Exception { + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("https://jsonplaceholder.typicode.com/todos")) + .build(); + + TodoAppClient todoAppClient = new TodoAppClient(); + + List todo = HttpClient.newHttpClient() + .sendAsync(request, BodyHandlers.ofString()) + .thenApply(HttpResponse::body) + .thenApply(todoAppClient::readValueJackson) + .get(); + + return todo.get(1); + + } + + public Todo asyncGson() throws Exception { + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("https://jsonplaceholder.typicode.com/todos")) + .build(); + TodoAppClient todoAppClient = new TodoAppClient(); + + List todo = HttpClient.newHttpClient() + .sendAsync(request, BodyHandlers.ofString()) + .thenApply(HttpResponse::body) + .thenApply(todoAppClient::readValueGson) + .get(); + + return todo.get(1); + + } + + List readValueJackson(String content) { + + try { + return objectMapper.readValue(content, new TypeReference>() { + }); + } catch (IOException ioe) { + throw new CompletionException(ioe); + } + } + + List readValueGson(String content) { + + return gson.fromJson(content, new TypeToken>() { + }.getType()); + + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-11-3/src/test/java/com/baeldung/httppojo/HttpClientPojoClassUnitTest.java b/core-java-modules/core-java-11-3/src/test/java/com/baeldung/httppojo/HttpClientPojoClassUnitTest.java new file mode 100644 index 0000000000..a364a8d27e --- /dev/null +++ b/core-java-modules/core-java-11-3/src/test/java/com/baeldung/httppojo/HttpClientPojoClassUnitTest.java @@ -0,0 +1,45 @@ +package com.baeldung.httppojo; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class HttpClientPojoClassUnitTest { + + Todo expectedTodo = new Todo(1, 2, "quis ut nam facilis et officia qui", false); + + @Test + public void givenSampleApiCall_whenResponseIsMappedByGson_thenCompareResponseMappedByGson() throws Exception { + TodoAppClient sampleGson = new TodoAppClient(); + + assertEquals(expectedTodo, sampleGson.syncGson()); + + } + + @Test + public void givenSampleApiCall_whenResponseIsMappedByJackson_thenCompareResponseMappedByJackson() throws Exception { + TodoAppClient sampleJackson = new TodoAppClient(); + + assertEquals(expectedTodo, sampleJackson.syncJackson()); + } + + @Test + public void givenSampleRestApi_whenApiIsConsumedByHttpClient_thenCompareJsonString() throws Exception { + TodoAppClient sampleTest = new TodoAppClient(); + assertNotNull(sampleTest.sampleApiRequest()); + + } + + @Test + public void givenSampleApiAsyncCall_whenResponseIsMappedByJackson_thenCompareResponseMappedByJackson() throws Exception { + TodoAppClient sampleAsynJackson = new TodoAppClient(); + assertEquals(expectedTodo, sampleAsynJackson.asyncJackson()); + } + + @Test + public void givenSampleApiAsyncCall_whenResponseIsMappedByGson_thenCompareResponseMappedByGson() throws Exception { + TodoAppClient sampleAsynGson = new TodoAppClient(); + assertEquals(expectedTodo, sampleAsynGson.asyncGson()); + } + +} From b389ecad460657db1c060cd8aa9e484e9d2acecb Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Fri, 27 Jan 2023 13:32:59 -0300 Subject: [PATCH 357/592] inverting condition to match the article --- .../inmemorycompilation/InMemoryCompilationUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-jvm-3/src/test/java/com/baeldung/inmemorycompilation/InMemoryCompilationUnitTest.java b/core-java-modules/core-java-jvm-3/src/test/java/com/baeldung/inmemorycompilation/InMemoryCompilationUnitTest.java index 410bdca866..f1470879eb 100644 --- a/core-java-modules/core-java-jvm-3/src/test/java/com/baeldung/inmemorycompilation/InMemoryCompilationUnitTest.java +++ b/core-java-modules/core-java-jvm-3/src/test/java/com/baeldung/inmemorycompilation/InMemoryCompilationUnitTest.java @@ -41,7 +41,7 @@ public class InMemoryCompilationUnitTest { boolean result = task.call(); - if (result) { + if (!result) { diagnostics.getDiagnostics() .forEach(d -> LOGGER.error(String.valueOf(d))); } else { From d7e857f427ed9378d92dc250aa83c6672911a28e Mon Sep 17 00:00:00 2001 From: Olu <56642018+olu-damilare@users.noreply.github.com> Date: Fri, 27 Jan 2023 21:37:47 +0100 Subject: [PATCH 358/592] BAEL 5932 - Callback Functions in Java (#13335) --- .../core-java-functional/pom.xml | 26 +++++++++++++++++++ .../callbackfunctions/ConsumerCallback.java | 17 ++++++++++++ .../callbackfunctions/EventListener.java | 12 +++++++++ .../AsynchronousEventConsumer.java | 21 +++++++++++++++ .../AsynchronousEventListenerImpl.java | 19 ++++++++++++++ .../synchronous/SynchronousEventConsumer.java | 22 ++++++++++++++++ .../SynchronousEventListenerImpl.java | 18 +++++++++++++ .../AsynchronousCallbackUnitTest.java | 22 ++++++++++++++++ .../ConsumerCallbackUnitTest.java | 20 ++++++++++++++ .../SynchronousCallbackUnitTest.java | 22 ++++++++++++++++ 10 files changed, 199 insertions(+) create mode 100644 core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/ConsumerCallback.java create mode 100644 core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/EventListener.java create mode 100644 core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/asynchronous/AsynchronousEventConsumer.java create mode 100644 core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/asynchronous/AsynchronousEventListenerImpl.java create mode 100644 core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/synchronous/SynchronousEventConsumer.java create mode 100644 core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/synchronous/SynchronousEventListenerImpl.java create mode 100644 core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/AsynchronousCallbackUnitTest.java create mode 100644 core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/ConsumerCallbackUnitTest.java create mode 100644 core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/SynchronousCallbackUnitTest.java diff --git a/core-java-modules/core-java-functional/pom.xml b/core-java-modules/core-java-functional/pom.xml index 52d74035a5..9ad47f8133 100644 --- a/core-java-modules/core-java-functional/pom.xml +++ b/core-java-modules/core-java-functional/pom.xml @@ -14,4 +14,30 @@ 0.0.1-SNAPSHOT + + + org.mockito + mockito-inline + ${mockito-inline.version} + test + + + + + core-java-functional + + + src/main/resources + true + + + + + + 3.8.0 + 3.22.0 + 3.12.0 + 0.10.4 + + \ No newline at end of file diff --git a/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/ConsumerCallback.java b/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/ConsumerCallback.java new file mode 100644 index 0000000000..f3086b8cef --- /dev/null +++ b/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/ConsumerCallback.java @@ -0,0 +1,17 @@ +package com.baeldung.callbackfunctions; + +import java.util.function.Consumer; + +public class ConsumerCallback { + public void getAge(int initialAge, Consumer callback) { + callback.accept(initialAge); + } + + public void increaseAge(int initialAge, int ageDifference, Consumer callback) { + System.out.println("===== Increase age ===="); + + int newAge = initialAge + ageDifference; + callback.accept(newAge); + + } +} diff --git a/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/EventListener.java b/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/EventListener.java new file mode 100644 index 0000000000..dceba7a931 --- /dev/null +++ b/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/EventListener.java @@ -0,0 +1,12 @@ +package com.baeldung.callbackfunctions; + +public interface EventListener { + + String onTrigger(); + + void respondToTrigger(); +} + + + + diff --git a/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/asynchronous/AsynchronousEventConsumer.java b/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/asynchronous/AsynchronousEventConsumer.java new file mode 100644 index 0000000000..d2f3732679 --- /dev/null +++ b/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/asynchronous/AsynchronousEventConsumer.java @@ -0,0 +1,21 @@ +package com.baeldung.callbackfunctions.asynchronous; + +import com.baeldung.callbackfunctions.EventListener; + +public class AsynchronousEventConsumer{ + + private EventListener listener; + + public AsynchronousEventConsumer(EventListener listener) { + this.listener = listener; + } + + public void doAsynchronousOperation() + { + System.out.println("Performing operation in Asynchronous Task"); + + new Thread(() -> listener.onTrigger()).start(); + } + + +} diff --git a/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/asynchronous/AsynchronousEventListenerImpl.java b/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/asynchronous/AsynchronousEventListenerImpl.java new file mode 100644 index 0000000000..a6e43797f5 --- /dev/null +++ b/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/asynchronous/AsynchronousEventListenerImpl.java @@ -0,0 +1,19 @@ +package com.baeldung.callbackfunctions.asynchronous; + +import com.baeldung.callbackfunctions.EventListener; + +public class AsynchronousEventListenerImpl implements EventListener { + + @Override + public String onTrigger() + { + respondToTrigger(); + return "Asynchronously running callback function"; + } + + @Override + public void respondToTrigger(){ + System.out.println("This is a side effect of the asynchronous trigger."); + } + +} diff --git a/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/synchronous/SynchronousEventConsumer.java b/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/synchronous/SynchronousEventConsumer.java new file mode 100644 index 0000000000..9b06151854 --- /dev/null +++ b/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/synchronous/SynchronousEventConsumer.java @@ -0,0 +1,22 @@ +package com.baeldung.callbackfunctions.synchronous; + +import com.baeldung.callbackfunctions.EventListener; + +public class SynchronousEventConsumer { + + private final EventListener eventListener; + + public SynchronousEventConsumer(EventListener listener) + { + this.eventListener = listener; + } + + public String doSynchronousOperation() + { + System.out.println("Performing callback before synchronous Task"); + + return eventListener.onTrigger(); + } + + +} diff --git a/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/synchronous/SynchronousEventListenerImpl.java b/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/synchronous/SynchronousEventListenerImpl.java new file mode 100644 index 0000000000..156f7857c3 --- /dev/null +++ b/core-java-modules/core-java-functional/src/main/java/com/baeldung/callbackfunctions/synchronous/SynchronousEventListenerImpl.java @@ -0,0 +1,18 @@ +package com.baeldung.callbackfunctions.synchronous; + +import com.baeldung.callbackfunctions.EventListener; + +public class SynchronousEventListenerImpl implements EventListener { + + @Override + public String onTrigger() + { + return "Synchronously running callback function"; + } + + @Override + public void respondToTrigger(){ + System.out.println("Response to trigger"); + } + +} diff --git a/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/AsynchronousCallbackUnitTest.java b/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/AsynchronousCallbackUnitTest.java new file mode 100644 index 0000000000..494d7365d3 --- /dev/null +++ b/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/AsynchronousCallbackUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.callbackfunctions; + +import org.junit.Test; +import org.mockito.Mockito; +import com.baeldung.callbackfunctions.EventListener; +import com.baeldung.callbackfunctions.asynchronous.AsynchronousEventConsumer; +import com.baeldung.callbackfunctions.asynchronous.AsynchronousEventListenerImpl; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +public class AsynchronousCallbackUnitTest { + + @Test + public void whenCallbackIsInvokedAsynchronously_shouldRunAsynchronousOperation(){ + EventListener listener = Mockito.mock(AsynchronousEventListenerImpl.class); + AsynchronousEventConsumer asynchronousEventListenerConsumer = new AsynchronousEventConsumer(listener); + asynchronousEventListenerConsumer.doAsynchronousOperation(); + + verify(listener, times(1)).onTrigger(); + } +} diff --git a/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/ConsumerCallbackUnitTest.java b/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/ConsumerCallbackUnitTest.java new file mode 100644 index 0000000000..ba09a7e50c --- /dev/null +++ b/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/ConsumerCallbackUnitTest.java @@ -0,0 +1,20 @@ +package com.baeldung.callbackfunctions; + +import org.junit.jupiter.api.Test; +import com.baeldung.callbackfunctions.ConsumerCallback; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ConsumerCallbackUnitTest { + + @Test + public void whenIncreasingInitialAgeByGivenValueThroughCallback_shouldIncreaseAge(){ + ConsumerCallback consumerCallback = new ConsumerCallback(); + consumerCallback.getAge(20, (initialAge) -> { + int ageDifference = 10; + consumerCallback.increaseAge(initialAge, ageDifference, (newAge) -> { + assertEquals(initialAge + ageDifference, newAge); + }); + }); + } +} diff --git a/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/SynchronousCallbackUnitTest.java b/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/SynchronousCallbackUnitTest.java new file mode 100644 index 0000000000..0c270524b7 --- /dev/null +++ b/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/SynchronousCallbackUnitTest.java @@ -0,0 +1,22 @@ +package callbackFunctions; + +import org.junit.jupiter.api.Test; +import com.baeldung.callbackfunctions.EventListener; +import com.baeldung.callbackfunctions.synchronous.SynchronousEventConsumer; +import com.baeldung.callbackfunctions.synchronous.SynchronousEventListenerImpl; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class SynchronousCallbackUnitTest { + + @Test + public void whenCallbackIsInvokedSynchronously_shouldRunSynchronousOperation(){ + EventListener listener = new SynchronousEventListenerImpl(); + SynchronousEventConsumer synchronousEventConsumer = new SynchronousEventConsumer(listener); + String result = synchronousEventConsumer.doSynchronousOperation(); + + assertNotNull(result); + assertEquals("Synchronously running callback function", result); + } +} From 185093c26ad831b3883a3f720dfa2a6f431af3d3 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sat, 28 Jan 2023 03:56:13 +0100 Subject: [PATCH 359/592] [comp-str-enum] Comparing a String to an Enum Value in Java (#13349) --- .../CompareStringAndEnumUnitTest.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/comparestrenum/CompareStringAndEnumUnitTest.java diff --git a/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/comparestrenum/CompareStringAndEnumUnitTest.java b/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/comparestrenum/CompareStringAndEnumUnitTest.java new file mode 100644 index 0000000000..6ce3bc7bdc --- /dev/null +++ b/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/comparestrenum/CompareStringAndEnumUnitTest.java @@ -0,0 +1,78 @@ +package com.baeldung.enums.comparestrenum; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Optional; + +import static com.baeldung.enums.comparestrenum.Weekday.Fri; +import static com.baeldung.enums.comparestrenum.Weekday.Sat; +import static org.junit.jupiter.api.Assertions.*; + +enum Weekday { + Mon("Monday"), + Tue("Tuesday"), + Wed("Wednesday"), + Thu("Thursday"), + Fri("Friday"), + Sat("Saturday"); + + private String fullName; + + Weekday(String fullName) { + this.fullName = fullName; + } + + public String getFullName() { + return fullName; + } + + + static Optional byFullNameIgnoreCase(String givenFullName) { + return Arrays.stream(values()).filter(it -> it.fullName.equalsIgnoreCase(givenFullName)).findAny(); + } + + static Optional byNameIgnoreCase(String givenName) { + return Arrays.stream(values()).filter(it -> it.name().equalsIgnoreCase(givenName)).findAny(); + } +} + +public class CompareStringAndEnumUnitTest { + private static final String SAT = "sAt"; + private static final String SATURDAY = "sAtuRdAy"; + private static final String TYPO_FRI = "ffri"; + private static final String TYPO_FRIDAY = "ffriday"; + + @Test + void givenAString_whenCompareEnumWithName_thenGetExpectedResult() { + assertTrue(SAT.equalsIgnoreCase(Sat.name())); + assertFalse(TYPO_FRI.equalsIgnoreCase(Fri.name())); + } + + @Test + void givenAString_whenCompareEnumWithProperty_thenGetExpectedResult() { + assertTrue(SATURDAY.equalsIgnoreCase(Sat.getFullName())); + assertFalse(TYPO_FRI.equalsIgnoreCase(Fri.getFullName())); + } + + @Test + void givenAString_whenFindEnumByName_thenGetExpectedResult() { + Optional optResult = Weekday.byNameIgnoreCase(SAT); + assertTrue(optResult.isPresent()); + assertEquals(Sat, optResult.get()); + + Optional optResult2 = Weekday.byNameIgnoreCase(TYPO_FRI); + assertFalse(optResult2.isPresent()); + } + + @Test + void givenAString_whenFindEnumByProperty_thenGetExpectedResult() { + Optional optResult = Weekday.byFullNameIgnoreCase(SATURDAY); + assertTrue(optResult.isPresent()); + assertEquals(Sat, optResult.get()); + + Optional optResult2 = Weekday.byFullNameIgnoreCase(TYPO_FRIDAY); + assertFalse(optResult2.isPresent()); + } + +} \ No newline at end of file From 2db1dd4a609d6f7defa5cdd7a42db58513a6b496 Mon Sep 17 00:00:00 2001 From: Iulian Timis Date: Sat, 28 Jan 2023 12:47:15 +0200 Subject: [PATCH 360/592] JAVA-17293 Update Java Mail articles --- .../core-java-networking-2/pom.xml | 16 ++++++++---- .../java/com/baeldung/mail/EmailService.java | 21 ++++++++------- .../MailWithAttachmentService.java | 26 ++++++++++--------- .../download/FileDownloadIntegrationTest.java | 11 ++++---- .../baeldung/mail/EmailServiceLiveTest.java | 16 +++++++----- .../MailWithAttachmentServiceLiveTest.java | 22 +++++++--------- 6 files changed, 61 insertions(+), 51 deletions(-) diff --git a/core-java-modules/core-java-networking-2/pom.xml b/core-java-modules/core-java-networking-2/pom.xml index 77f23be97c..35872ce3fc 100644 --- a/core-java-modules/core-java-networking-2/pom.xml +++ b/core-java-modules/core-java-networking-2/pom.xml @@ -25,15 +25,20 @@ ${commons-lang3.version} - javax.mail - mail - ${javax.mail.version} + org.eclipse.angus + angus-mail + ${angus.mail.version} org.asynchttpclient async-http-client ${async-http-client.version} + + jakarta.xml.bind + jakarta.xml.bind-api + ${jakarta.bind.version} + com.icegreen greenmail @@ -48,9 +53,10 @@ 4.5.9 - 1.5.0-b01 + 2.0.1 2.4.5 - 1.5.8 + 4.0.0 + 2.0.0-alpha-3 \ No newline at end of file diff --git a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java index 3e40cf53f7..b2d8e6b710 100644 --- a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java +++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java @@ -1,19 +1,20 @@ package com.baeldung.mail; -import javax.mail.Authenticator; -import javax.mail.Message; -import javax.mail.Multipart; -import javax.mail.PasswordAuthentication; -import javax.mail.Session; -import javax.mail.Transport; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; import java.io.File; import java.net.URI; import java.util.Properties; +import jakarta.mail.Authenticator; +import jakarta.mail.Message; +import jakarta.mail.Multipart; +import jakarta.mail.PasswordAuthentication; +import jakarta.mail.Session; +import jakarta.mail.Transport; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeBodyPart; +import jakarta.mail.internet.MimeMessage; +import jakarta.mail.internet.MimeMultipart; + public class EmailService { private String username; diff --git a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/mailwithattachment/MailWithAttachmentService.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/mailwithattachment/MailWithAttachmentService.java index fbe8a54bbe..66e1372ac1 100644 --- a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/mailwithattachment/MailWithAttachmentService.java +++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/mailwithattachment/MailWithAttachmentService.java @@ -1,21 +1,23 @@ package com.baeldung.mail.mailwithattachment; -import javax.mail.BodyPart; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.Multipart; -import javax.mail.PasswordAuthentication; -import javax.mail.Session; -import javax.mail.Transport; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; import java.io.File; import java.io.IOException; import java.net.URI; import java.util.Properties; +import jakarta.mail.Authenticator; +import jakarta.mail.BodyPart; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; +import jakarta.mail.Multipart; +import jakarta.mail.PasswordAuthentication; +import jakarta.mail.Session; +import jakarta.mail.Transport; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeBodyPart; +import jakarta.mail.internet.MimeMessage; +import jakarta.mail.internet.MimeMultipart; + public class MailWithAttachmentService { private final String username; @@ -37,7 +39,7 @@ public class MailWithAttachmentService { props.put("mail.smtp.host", this.host); props.put("mail.smtp.port", this.port); - return Session.getInstance(props, new javax.mail.Authenticator() { + return Session.getInstance(props, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java index 8fe50efd69..8fc84577e3 100644 --- a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java +++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java @@ -1,10 +1,7 @@ package com.baeldung.download; -import org.junit.After; -import org.junit.BeforeClass; -import org.junit.Test; +import static org.junit.Assert.assertTrue; -import javax.xml.bind.DatatypeConverter; import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.Files; @@ -13,7 +10,11 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.concurrent.ExecutionException; -import static org.junit.Assert.assertTrue; +import org.junit.After; +import org.junit.BeforeClass; +import org.junit.Test; + +import jakarta.xml.bind.DatatypeConverter; public class FileDownloadIntegrationTest { diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/EmailServiceLiveTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/EmailServiceLiveTest.java index cec4cfcb55..184df8428a 100644 --- a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/EmailServiceLiveTest.java +++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/EmailServiceLiveTest.java @@ -1,17 +1,19 @@ package com.baeldung.mail; -import com.icegreen.greenmail.junit.GreenMailRule; -import com.icegreen.greenmail.util.ServerSetupTest; +import static org.junit.Assert.assertEquals; + +import java.io.IOException; + import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import javax.mail.MessagingException; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; -import java.io.IOException; +import com.icegreen.greenmail.junit.GreenMailRule; +import com.icegreen.greenmail.util.ServerSetupTest; -import static org.junit.Assert.assertEquals; +import jakarta.mail.MessagingException; +import jakarta.mail.internet.MimeMessage; +import jakarta.mail.internet.MimeMultipart; public class EmailServiceLiveTest { diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/mailwithattachment/MailWithAttachmentServiceLiveTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/mailwithattachment/MailWithAttachmentServiceLiveTest.java index 04ad47875f..c6850461ae 100644 --- a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/mailwithattachment/MailWithAttachmentServiceLiveTest.java +++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/mailwithattachment/MailWithAttachmentServiceLiveTest.java @@ -1,20 +1,20 @@ package com.baeldung.mail.mailwithattachment; +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + import com.icegreen.greenmail.configuration.GreenMailConfiguration; import com.icegreen.greenmail.junit.GreenMailRule; import com.icegreen.greenmail.util.GreenMailUtil; import com.icegreen.greenmail.util.ServerSetupTest; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import javax.annotation.Resource; -import javax.mail.MessagingException; -import javax.mail.Session; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; - -import static org.junit.Assert.assertEquals; +import jakarta.mail.MessagingException; +import jakarta.mail.Session; +import jakarta.mail.internet.MimeMessage; +import jakarta.mail.internet.MimeMultipart; public class MailWithAttachmentServiceLiveTest { @@ -29,7 +29,6 @@ public class MailWithAttachmentServiceLiveTest { .withUser(USERNAME, PASSWORD) ); - @Resource private MailWithAttachmentService emailService; @Before @@ -73,5 +72,4 @@ public class MailWithAttachmentServiceLiveTest { return GreenMailUtil.getBody(((MimeMultipart) receivedMessage.getContent()) .getBodyPart(2)); } - } From 35fd9e473a6b8c0fb3007f241067337f8d0c0c2e Mon Sep 17 00:00:00 2001 From: Daniel Strmecki Date: Sat, 28 Jan 2023 12:01:25 +0100 Subject: [PATCH 361/592] Feature/bael 6083 http interface (#13251) * BAEL-6083: Update Spring Boot, initial tests * BAEL-6083: Fix tests * BAEL-6083: Add post method * BAEL-6083: Failing POST test * BAEL-6083: Remove POST test * BAEL-6083: Fix POST tests * BAEL-6083: Add delete method * BAEL-6083: Add id field * BAEL-6083: Exception handling * BAEL-6083: Refactor * BAEL-6083: Use Java 17 * BAEL-6083: Update Mockito to use BDD and deep mocks * BAEL-6083: Unused vars --- spring-core-6/pom.xml | 44 +++- .../java/com/baeldung/httpinterface/Book.java | 3 + .../baeldung/httpinterface/BooksClient.java | 23 ++ .../baeldung/httpinterface/BooksService.java | 26 +++ .../reinitializebean/cache/ConfigManager.java | 1 - .../BooksServiceMockServerTest.java | 217 ++++++++++++++++++ .../BooksServiceMockitoTest.java | 88 +++++++ .../httpinterface/MyServiceException.java | 9 + 8 files changed, 399 insertions(+), 12 deletions(-) create mode 100644 spring-core-6/src/main/java/com/baeldung/httpinterface/Book.java create mode 100644 spring-core-6/src/main/java/com/baeldung/httpinterface/BooksClient.java create mode 100644 spring-core-6/src/main/java/com/baeldung/httpinterface/BooksService.java create mode 100644 spring-core-6/src/test/java/com/baeldung/httpinterface/BooksServiceMockServerTest.java create mode 100644 spring-core-6/src/test/java/com/baeldung/httpinterface/BooksServiceMockitoTest.java create mode 100644 spring-core-6/src/test/java/com/baeldung/httpinterface/MyServiceException.java diff --git a/spring-core-6/pom.xml b/spring-core-6/pom.xml index 2df7167ca1..a3dda0374f 100644 --- a/spring-core-6/pom.xml +++ b/spring-core-6/pom.xml @@ -10,27 +10,39 @@ http://www.baeldung.com - com.baeldung - parent-modules - 1.0.0-SNAPSHOT + org.springframework.boot + spring-boot-starter-parent + 3.0.1 + org.springframework.boot spring-boot-starter-web - ${spring.boot.version} + + + org.springframework.boot + spring-boot-starter-webflux + + + org.mock-server + mockserver-netty + ${mockserver.version} + + + org.mock-server + mockserver-client-java + ${mockserver.version} org.springframework.boot spring-boot-starter-test - ${spring.boot.version} test - org.junit.jupiter - junit-jupiter-api - ${junit-jupiter.version} + io.projectreactor + reactor-test test @@ -76,13 +88,23 @@ + + + org.apache.maven.plugins + maven-compiler-plugin + + 17 + 17 + + + UTF-8 - 11 - 11 - 2.7.5 + 17 + 17 + 5.14.0 \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/httpinterface/Book.java b/spring-core-6/src/main/java/com/baeldung/httpinterface/Book.java new file mode 100644 index 0000000000..a38085852e --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/httpinterface/Book.java @@ -0,0 +1,3 @@ +package com.baeldung.httpinterface; + +public record Book(long id, String title, String author, int year) {} diff --git a/spring-core-6/src/main/java/com/baeldung/httpinterface/BooksClient.java b/spring-core-6/src/main/java/com/baeldung/httpinterface/BooksClient.java new file mode 100644 index 0000000000..3034f4f528 --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/httpinterface/BooksClient.java @@ -0,0 +1,23 @@ +package com.baeldung.httpinterface; + +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.support.WebClientAdapter; +import org.springframework.web.service.invoker.HttpServiceProxyFactory; + +@Component +public class BooksClient { + + private final BooksService booksService; + + public BooksClient(WebClient webClient) { + HttpServiceProxyFactory httpServiceProxyFactory = + HttpServiceProxyFactory.builder(WebClientAdapter.forClient(webClient)) + .build(); + booksService = httpServiceProxyFactory.createClient(BooksService.class); + } + + public BooksService getBooksService() { + return booksService; + } +} diff --git a/spring-core-6/src/main/java/com/baeldung/httpinterface/BooksService.java b/spring-core-6/src/main/java/com/baeldung/httpinterface/BooksService.java new file mode 100644 index 0000000000..a9cf6ec58a --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/httpinterface/BooksService.java @@ -0,0 +1,26 @@ +package com.baeldung.httpinterface; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.service.annotation.DeleteExchange; +import org.springframework.web.service.annotation.GetExchange; +import org.springframework.web.service.annotation.PostExchange; + +import java.util.List; + +interface BooksService { + + @GetExchange("/books") + List getBooks(); + + @GetExchange("/books/{id}") + Book getBook(@PathVariable long id); + + @PostExchange("/books") + Book saveBook(@RequestBody Book book); + + @DeleteExchange("/books/{id}") + ResponseEntity deleteBook(@PathVariable long id); + +} diff --git a/spring-core-6/src/main/java/com/baeldung/reinitializebean/cache/ConfigManager.java b/spring-core-6/src/main/java/com/baeldung/reinitializebean/cache/ConfigManager.java index 1e4dee6cc4..240fb350c2 100644 --- a/spring-core-6/src/main/java/com/baeldung/reinitializebean/cache/ConfigManager.java +++ b/spring-core-6/src/main/java/com/baeldung/reinitializebean/cache/ConfigManager.java @@ -5,7 +5,6 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import javax.annotation.PostConstruct; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; diff --git a/spring-core-6/src/test/java/com/baeldung/httpinterface/BooksServiceMockServerTest.java b/spring-core-6/src/test/java/com/baeldung/httpinterface/BooksServiceMockServerTest.java new file mode 100644 index 0000000000..22e00c16ae --- /dev/null +++ b/spring-core-6/src/test/java/com/baeldung/httpinterface/BooksServiceMockServerTest.java @@ -0,0 +1,217 @@ +package com.baeldung.httpinterface; + +import org.apache.http.HttpException; +import org.apache.http.HttpStatus; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.mockserver.client.MockServerClient; +import org.mockserver.integration.ClientAndServer; +import org.mockserver.configuration.Configuration; + +import java.io.IOException; +import java.net.ServerSocket; +import java.util.List; + +import org.mockserver.model.HttpRequest; +import org.mockserver.model.MediaType; +import org.mockserver.verify.VerificationTimes; +import org.slf4j.event.Level; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.ResponseEntity; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClientResponseException; +import reactor.core.publisher.Mono; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockserver.integration.ClientAndServer.startClientAndServer; +import static org.mockserver.matchers.Times.exactly; +import static org.mockserver.model.HttpRequest.request; +import static org.mockserver.model.HttpResponse.response; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class BooksServiceMockServerTest { + + private static final String SERVER_ADDRESS = "localhost"; + private static final String PATH = "/books"; + + private static int serverPort; + private static ClientAndServer mockServer; + private static String serviceUrl; + + @BeforeAll + static void startServer() throws IOException { + serverPort = getFreePort(); + serviceUrl = "http://" + SERVER_ADDRESS + ":" + serverPort; + + Configuration config = Configuration.configuration().logLevel(Level.WARN); + mockServer = startClientAndServer(config, serverPort); + + mockAllBooksRequest(); + mockBookByIdRequest(); + mockSaveBookRequest(); + mockDeleteBookRequest(); + } + + @AfterAll + static void stopServer() { + mockServer.stop(); + } + + @Test + void givenMockedGetResponse_whenGetBooksServiceMethodIsCalled_thenTwoBooksAreReturned() { + BooksClient booksClient = new BooksClient(WebClient.builder().baseUrl(serviceUrl).build()); + BooksService booksService = booksClient.getBooksService(); + + List books = booksService.getBooks(); + assertEquals(2, books.size()); + + mockServer.verify( + HttpRequest.request() + .withMethod(HttpMethod.GET.name()) + .withPath(PATH), + VerificationTimes.exactly(1) + ); + } + + @Test + void givenMockedGetResponse_whenGetExistingBookServiceMethodIsCalled_thenCorrectBookIsReturned() { + BooksClient booksClient = new BooksClient(WebClient.builder().baseUrl(serviceUrl).build()); + BooksService booksService = booksClient.getBooksService(); + + Book book = booksService.getBook(1); + assertEquals("Book_1", book.title()); + + mockServer.verify( + HttpRequest.request() + .withMethod(HttpMethod.GET.name()) + .withPath(PATH + "/1"), + VerificationTimes.exactly(1) + ); + } + + @Test + void givenMockedGetResponse_whenGetNonExistingBookServiceMethodIsCalled_thenCorrectBookIsReturned() { + BooksClient booksClient = new BooksClient(WebClient.builder().baseUrl(serviceUrl).build()); + BooksService booksService = booksClient.getBooksService(); + + assertThrows(WebClientResponseException.class, () -> booksService.getBook(9)); + } + + @Test + void givenCustomErrorHandlerIsSet_whenGetNonExistingBookServiceMethodIsCalled_thenCustomExceptionIsThrown() { + BooksClient booksClient = new BooksClient(WebClient.builder() + .defaultStatusHandler(HttpStatusCode::isError, resp -> + Mono.just(new MyServiceException("Custom exception"))) + .baseUrl(serviceUrl) + .build()); + + BooksService booksService = booksClient.getBooksService(); + assertThrows(MyServiceException.class, () -> booksService.getBook(9)); + } + + @Test + void givenMockedPostResponse_whenSaveBookServiceMethodIsCalled_thenCorrectBookIsReturned() { + BooksClient booksClient = new BooksClient(WebClient.builder().baseUrl(serviceUrl).build()); + BooksService booksService = booksClient.getBooksService(); + + Book book = booksService.saveBook(new Book(3, "Book_3", "Author_3", 2000)); + assertEquals("Book_3", book.title()); + + mockServer.verify( + HttpRequest.request() + .withMethod(HttpMethod.POST.name()) + .withPath(PATH), + VerificationTimes.exactly(1) + ); + } + + @Test + void givenMockedDeleteResponse_whenDeleteBookServiceMethodIsCalled_thenCorrectCodeIsReturned() { + BooksClient booksClient = new BooksClient(WebClient.builder().baseUrl(serviceUrl).build()); + BooksService booksService = booksClient.getBooksService(); + + ResponseEntity response = booksService.deleteBook(3); + assertEquals(HttpStatusCode.valueOf(200), response.getStatusCode()); + + mockServer.verify( + HttpRequest.request() + .withMethod(HttpMethod.DELETE.name()) + .withPath(PATH + "/3"), + VerificationTimes.exactly(1) + ); + } + + private static int getFreePort () throws IOException { + try (ServerSocket serverSocket = new ServerSocket(0)) { + return serverSocket.getLocalPort(); + } + } + + private static void mockAllBooksRequest() { + new MockServerClient(SERVER_ADDRESS, serverPort) + .when( + request() + .withPath(PATH) + .withMethod(HttpMethod.GET.name()), + exactly(1) + ) + .respond( + response() + .withStatusCode(HttpStatus.SC_OK) + .withContentType(MediaType.APPLICATION_JSON) + .withBody("[{\"id\":1,\"title\":\"Book_1\",\"author\":\"Author_1\",\"year\":1998},{\"id\":2,\"title\":\"Book_2\",\"author\":\"Author_2\",\"year\":1999}]") + ); + } + + private static void mockBookByIdRequest() { + new MockServerClient(SERVER_ADDRESS, serverPort) + .when( + request() + .withPath(PATH + "/1") + .withMethod(HttpMethod.GET.name()), + exactly(1) + ) + .respond( + response() + .withStatusCode(HttpStatus.SC_OK) + .withContentType(MediaType.APPLICATION_JSON) + .withBody("{\"id\":1,\"title\":\"Book_1\",\"author\":\"Author_1\",\"year\":1998}") + ); + } + + private static void mockSaveBookRequest() { + new MockServerClient(SERVER_ADDRESS, serverPort) + .when( + request() + .withPath(PATH) + .withMethod(HttpMethod.POST.name()) + .withContentType(MediaType.APPLICATION_JSON) + .withBody("{\"id\":3,\"title\":\"Book_3\",\"author\":\"Author_3\",\"year\":2000}"), + exactly(1) + ) + .respond( + response() + .withStatusCode(HttpStatus.SC_OK) + .withContentType(MediaType.APPLICATION_JSON) + .withBody("{\"id\":3,\"title\":\"Book_3\",\"author\":\"Author_3\",\"year\":2000}") + ); + } + + private static void mockDeleteBookRequest() { + new MockServerClient(SERVER_ADDRESS, serverPort) + .when( + request() + .withPath(PATH + "/3") + .withMethod(HttpMethod.DELETE.name()), + exactly(1) + ) + .respond( + response() + .withStatusCode(HttpStatus.SC_OK) + ); + } + +} diff --git a/spring-core-6/src/test/java/com/baeldung/httpinterface/BooksServiceMockitoTest.java b/spring-core-6/src/test/java/com/baeldung/httpinterface/BooksServiceMockitoTest.java new file mode 100644 index 0000000000..7a82835ef3 --- /dev/null +++ b/spring-core-6/src/test/java/com/baeldung/httpinterface/BooksServiceMockitoTest.java @@ -0,0 +1,88 @@ +package com.baeldung.httpinterface; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Answers; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.ResponseEntity; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import static org.mockito.BDDMockito.*; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@ExtendWith(MockitoExtension.class) +class BooksServiceMockitoTest { + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private WebClient webClient; + + @InjectMocks + private BooksClient booksClient; + + @Test + void givenMockedWebClientReturnsTwoBooks_whenGetBooksServiceMethodIsCalled_thenListOfTwoBooksIsReturned() { + given(webClient.method(HttpMethod.GET) + .uri(anyString(), anyMap()) + .retrieve() + .bodyToMono(new ParameterizedTypeReference>(){})) + .willReturn(Mono.just(List.of( + new Book(1,"Book_1", "Author_1", 1998), + new Book(2, "Book_2", "Author_2", 1999) + ))); + + BooksService booksService = booksClient.getBooksService(); + List books = booksService.getBooks(); + assertEquals(2, books.size()); + } + + @Test + void givenMockedWebClientReturnsBook_whenGetBookServiceMethodIsCalled_thenBookIsReturned() { + given(webClient.method(HttpMethod.GET) + .uri(anyString(), anyMap()) + .retrieve() + .bodyToMono(new ParameterizedTypeReference(){})) + .willReturn(Mono.just(new Book(1,"Book_1", "Author_1", 1998))); + + BooksService booksService = booksClient.getBooksService(); + Book book = booksService.getBook(1); + assertEquals("Book_1", book.title()); + } + + @Test + void givenMockedWebClientReturnsBook_whenSaveBookServiceMethodIsCalled_thenBookIsReturned() { + given(webClient.method(HttpMethod.POST) + .uri(anyString(), anyMap()) + .retrieve() + .bodyToMono(new ParameterizedTypeReference(){})) + .willReturn(Mono.just(new Book(3, "Book_3", "Author_3", 2000))); + + BooksService booksService = booksClient.getBooksService(); + Book book = booksService.saveBook(new Book(3, "Book_3", "Author_3", 2000)); + assertEquals("Book_3", book.title()); + } + + @Test + void givenMockedWebClientReturnsOk_whenDeleteBookServiceMethodIsCalled_thenOkCodeIsReturned() { + given(webClient.method(HttpMethod.DELETE) + .uri(anyString(), anyMap()) + .retrieve() + .toBodilessEntity() + .block(any()) + .getStatusCode()) + .willReturn(HttpStatusCode.valueOf(200)); + + BooksService booksService = booksClient.getBooksService(); + ResponseEntity response = booksService.deleteBook(3); + assertEquals(HttpStatusCode.valueOf(200), response.getStatusCode()); + } + +} diff --git a/spring-core-6/src/test/java/com/baeldung/httpinterface/MyServiceException.java b/spring-core-6/src/test/java/com/baeldung/httpinterface/MyServiceException.java new file mode 100644 index 0000000000..e09335a211 --- /dev/null +++ b/spring-core-6/src/test/java/com/baeldung/httpinterface/MyServiceException.java @@ -0,0 +1,9 @@ +package com.baeldung.httpinterface; + +public class MyServiceException extends RuntimeException { + + MyServiceException(String msg) { + super(msg); + } + +} From 601af9b61ae53eeb6f0c7a4f91e1dcda1cc57cb1 Mon Sep 17 00:00:00 2001 From: Iulian Timis Date: Sat, 28 Jan 2023 13:15:21 +0200 Subject: [PATCH 362/592] JAVA-17293 Update Java Mail articles for core-java-networking-3 --- .../core-java-networking-3/pom.xml | 8 +++---- .../DownloadEmailAttachments.java | 24 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/core-java-modules/core-java-networking-3/pom.xml b/core-java-modules/core-java-networking-3/pom.xml index 4f373238ee..6d0374c598 100644 --- a/core-java-modules/core-java-networking-3/pom.xml +++ b/core-java-modules/core-java-networking-3/pom.xml @@ -30,9 +30,9 @@ ${tomcat.embeded.version} - com.sun.mail - javax.mail - ${javax.mail.version} + org.eclipse.angus + angus-mail + ${angus.mail.version} @@ -95,7 +95,7 @@ 5.3.3 1.32 0.17 - 1.6.2 + 2.0.1 1.7 diff --git a/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/downloadattachments/DownloadEmailAttachments.java b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/downloadattachments/DownloadEmailAttachments.java index 4030f3b983..de726f6cbf 100644 --- a/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/downloadattachments/DownloadEmailAttachments.java +++ b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/downloadattachments/DownloadEmailAttachments.java @@ -6,16 +6,16 @@ import java.util.ArrayList; import java.util.List; import java.util.Properties; -import javax.mail.Address; -import javax.mail.Folder; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.Multipart; -import javax.mail.NoSuchProviderException; -import javax.mail.Part; -import javax.mail.Session; -import javax.mail.Store; -import javax.mail.internet.MimeBodyPart; +import jakarta.mail.Address; +import jakarta.mail.Folder; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; +import jakarta.mail.Multipart; +import jakarta.mail.NoSuchProviderException; +import jakarta.mail.Part; +import jakarta.mail.Session; +import jakarta.mail.Store; +import jakarta.mail.internet.MimeBodyPart; public class DownloadEmailAttachments { private String downloadDirectory; @@ -24,7 +24,7 @@ public class DownloadEmailAttachments { this.downloadDirectory = dir; } - public void downloadEmailAttachments(String host, String port, String userName, String password) throws NoSuchProviderException, MessagingException, IOException { + public void downloadEmailAttachments(String host, String port, String userName, String password) throws MessagingException, IOException { Properties properties = setMailServerProperties(host, port); Store store = setSessionStoreProperties(userName, password, properties); Folder inbox = store.getFolder("INBOX"); @@ -67,7 +67,7 @@ public class DownloadEmailAttachments { return downloadedAttachments; } - public Store setSessionStoreProperties(String userName, String password, Properties properties) throws NoSuchProviderException, MessagingException { + public Store setSessionStoreProperties(String userName, String password, Properties properties) throws MessagingException { Session session = Session.getDefaultInstance(properties); Store store = session.getStore("pop3"); From 08da652ca298050fe09ebd7e1da45c8d80c9fa2b Mon Sep 17 00:00:00 2001 From: Iulian Timis Date: Sat, 28 Jan 2023 14:08:43 +0200 Subject: [PATCH 363/592] JAVA-17293 Update Java Mail articles for logback --- logging-modules/logback/pom.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/logging-modules/logback/pom.xml b/logging-modules/logback/pom.xml index 937a88da09..bef4b25f1b 100644 --- a/logging-modules/logback/pom.xml +++ b/logging-modules/logback/pom.xml @@ -65,14 +65,14 @@ - com.sun.mail - javax.mail - ${javax.mail.version} + org.eclipse.angus + angus-mail + ${angus.mail.version} - javax.activation - javax.activation-api - ${javax.activation.version} + org.eclipse.angus + angus-activation + ${angus.activation.version} runtime @@ -116,8 +116,8 @@ 20180130 0.1.5 3.3.5 - 1.6.2 - 1.2.0 + 2.0.1 + 2.0.0 1.3.5 2.0.4 From de1c28073615ef9f085097937da6af6c5b5778df Mon Sep 17 00:00:00 2001 From: Iulian Timis Date: Sat, 28 Jan 2023 16:14:02 +0200 Subject: [PATCH 364/592] JAVA-17293 Fix java version problem for java bind --- core-java-modules/core-java-networking-2/pom.xml | 2 +- .../com/baeldung/download/FileDownloadIntegrationTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-networking-2/pom.xml b/core-java-modules/core-java-networking-2/pom.xml index 35872ce3fc..982f4fa346 100644 --- a/core-java-modules/core-java-networking-2/pom.xml +++ b/core-java-modules/core-java-networking-2/pom.xml @@ -55,7 +55,7 @@ 4.5.9 2.0.1 2.4.5 - 4.0.0 + 2.3.3 2.0.0-alpha-3 diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java index 8fc84577e3..a8670bb01e 100644 --- a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java +++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java @@ -10,12 +10,12 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.concurrent.ExecutionException; +import javax.xml.bind.DatatypeConverter; + import org.junit.After; import org.junit.BeforeClass; import org.junit.Test; -import jakarta.xml.bind.DatatypeConverter; - public class FileDownloadIntegrationTest { static String FILE_URL = "https://s3.amazonaws.com/baeldung.com/Do+JSON+with+Jackson.pdf?__s=vatuzcrazsqopnn7finb"; From 7605f8474c94897782739b6f06ff32ac088425e4 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sat, 28 Jan 2023 18:29:20 +0100 Subject: [PATCH 365/592] [int-zero-or-null] Check if an Integer Value is null or Zero in Java (#13332) --- .../java/com/baeldung/IntegerNullOrZero.java | 26 +++++++ .../IntegerNullOrZeroUnitTest.java | 69 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 core-java-modules/core-java-numbers-5/src/main/java/com/baeldung/IntegerNullOrZero.java create mode 100644 core-java-modules/core-java-numbers-5/src/test/java/com/baeldung/intnullorzero/IntegerNullOrZeroUnitTest.java diff --git a/core-java-modules/core-java-numbers-5/src/main/java/com/baeldung/IntegerNullOrZero.java b/core-java-modules/core-java-numbers-5/src/main/java/com/baeldung/IntegerNullOrZero.java new file mode 100644 index 0000000000..5fbc428b90 --- /dev/null +++ b/core-java-modules/core-java-numbers-5/src/main/java/com/baeldung/IntegerNullOrZero.java @@ -0,0 +1,26 @@ +package com.baeldung; + +import java.util.Optional; +import org.apache.commons.lang3.ObjectUtils; + +public class IntegerNullOrZero { + private IntegerNullOrZero() { + throw new RuntimeException("This class cannot be instantiated."); + } + + public static boolean usingStandardWay(Integer num) { + return num == null || num == 0; + } + + public static boolean usingTernaryOperator(Integer num) { + return 0 == (num == null ? 0 : num); + } + + public static boolean usingOptional(Integer num) { + return Optional.ofNullable(num).orElse(0) == 0; + } + + public static boolean usingObjectUtils(Integer num) { + return ObjectUtils.defaultIfNull(num, 0) == 0; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-numbers-5/src/test/java/com/baeldung/intnullorzero/IntegerNullOrZeroUnitTest.java b/core-java-modules/core-java-numbers-5/src/test/java/com/baeldung/intnullorzero/IntegerNullOrZeroUnitTest.java new file mode 100644 index 0000000000..6926289536 --- /dev/null +++ b/core-java-modules/core-java-numbers-5/src/test/java/com/baeldung/intnullorzero/IntegerNullOrZeroUnitTest.java @@ -0,0 +1,69 @@ +package com.baeldung.intnullorzero; + +import static com.baeldung.IntegerNullOrZero.usingObjectUtils; +import static com.baeldung.IntegerNullOrZero.usingOptional; +import static com.baeldung.IntegerNullOrZero.usingStandardWay; +import static com.baeldung.IntegerNullOrZero.usingTernaryOperator; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +public class IntegerNullOrZeroUnitTest { + + @Test + void givenInts_whenUsingStandardWay_thenGetExpectedResult() { + int n0 = 0; + boolean result0 = usingStandardWay(n0); + assertTrue(result0); + + boolean resultNull = usingStandardWay(null); + assertTrue(resultNull); + + int n42 = 42; + boolean result42 = usingStandardWay(n42); + assertFalse(result42); + } + + @Test + void givenInts_whenUsingTernaryOperator_thenGetExpectedResult() { + int n0 = 0; + boolean result0 = usingTernaryOperator(n0); + assertTrue(result0); + + boolean resultNull = usingTernaryOperator(null); + assertTrue(resultNull); + + int n42 = 42; + boolean result42 = usingTernaryOperator(n42); + assertFalse(result42); + } + + @Test + void givenInts_whenUsingOptional_thenGetExpectedResult() { + int n0 = 0; + boolean result0 = usingOptional(n0); + assertTrue(result0); + + boolean resultNull = usingOptional(null); + assertTrue(resultNull); + + int n42 = 42; + boolean result42 = usingOptional(n42); + assertFalse(result42); + } + + @Test + void givenInts_whenUsingObjectUtils_thenGetExpectedResult() { + int n0 = 0; + boolean result0 = usingObjectUtils(n0); + assertTrue(result0); + + boolean resultNull = usingObjectUtils(null); + assertTrue(resultNull); + + int n42 = 42; + boolean result42 = usingObjectUtils(n42); + assertFalse(result42); + } +} \ No newline at end of file From aecdc1a38d283d503d47d66c5b17e57e87068a5a Mon Sep 17 00:00:00 2001 From: Honey Kakkar Date: Sun, 29 Jan 2023 13:51:18 -0500 Subject: [PATCH 366/592] Fix link to the previous article in README.md Currently, "prev" points to "/core-java-modules/core-java-collections-1" which is not a valid relative directory in repository. --- core-java-modules/core-java-collections-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-collections-2/README.md b/core-java-modules/core-java-collections-2/README.md index 644cc93be7..5a9bae8f9f 100644 --- a/core-java-modules/core-java-collections-2/README.md +++ b/core-java-modules/core-java-collections-2/README.md @@ -13,4 +13,4 @@ - [Getting the Size of an Iterable in Java](https://www.baeldung.com/java-iterable-size) - [Java Null-Safe Streams from Collections](https://www.baeldung.com/java-null-safe-streams-from-collections) - [Differences Between Iterator and Iterable and How to Use Them?](https://www.baeldung.com/java-iterator-vs-iterable) -- More articles: [[<-- prev]](/core-java-modules/core-java-collections-1) [[next -->]](/core-java-modules/core-java-collections-3) \ No newline at end of file +- More articles: [[<-- prev]](/core-java-modules/core-java-collections) [[next -->]](/core-java-modules/core-java-collections-3) From 068d3cc439f20e202810a2587f572f8365687741 Mon Sep 17 00:00:00 2001 From: Alexandru Borza Date: Mon, 30 Jan 2023 00:51:12 +0200 Subject: [PATCH 367/592] BAEL-6146 - Initialize an ArrayList with All Zeroes or Null in Java (#13368) * initialize arraylist with null or zeros * configure pom parent * move code * delete module --- .../InitializeArrayListWithNullOrZeros.java | 15 ++++ ...alizeArrayListWithNullOrZerosUnitTest.java | 74 +++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/initializearraylistwithnullorzeros/InitializeArrayListWithNullOrZeros.java create mode 100644 core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/initializearraylistwithnullorzeros/InitializeArrayListWithNullOrZerosUnitTest.java diff --git a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/initializearraylistwithnullorzeros/InitializeArrayListWithNullOrZeros.java b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/initializearraylistwithnullorzeros/InitializeArrayListWithNullOrZeros.java new file mode 100644 index 0000000000..66862791aa --- /dev/null +++ b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/initializearraylistwithnullorzeros/InitializeArrayListWithNullOrZeros.java @@ -0,0 +1,15 @@ +package com.baeldung.initializearraylistwithnullorzeros; + +import java.util.ArrayList; + +public class InitializeArrayListWithNullOrZeros { + + public static void main(String[] args) { + + ArrayList arrayList = new ArrayList<>(); + for (int i = 0; i< 10; i++) { + arrayList.add(null); + } + } +} + diff --git a/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/initializearraylistwithnullorzeros/InitializeArrayListWithNullOrZerosUnitTest.java b/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/initializearraylistwithnullorzeros/InitializeArrayListWithNullOrZerosUnitTest.java new file mode 100644 index 0000000000..00987fa198 --- /dev/null +++ b/core-java-modules/core-java-collections-array-list/src/test/java/com/baeldung/initializearraylistwithnullorzeros/InitializeArrayListWithNullOrZerosUnitTest.java @@ -0,0 +1,74 @@ +package com.baeldung.initializearraylistwithnullorzeros; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public class InitializeArrayListWithNullOrZerosUnitTest { + + @Test + public void whenInitializingListWithNCopies_thenListIsCorrectlyPopulated() { + // when + ArrayList list = IntStream.of(new int[10]) + .boxed() + .collect(Collectors.toCollection(ArrayList::new)); + + // then + Assertions.assertEquals(10, list.size()); + Assertions.assertTrue(list.stream().allMatch(elem -> elem == 0)); + } + + @Test + public void whenInitializingListWithStream_thenListIsCorrectlyPopulated() { + + // when + ArrayList listWithZeros = Stream.generate(() -> 0) + .limit(10).collect(Collectors.toCollection(ArrayList::new)); + + ArrayList listWithNulls = Stream.generate(() -> null) + .limit(10).collect(Collectors.toCollection(ArrayList::new)); + + // then + Assertions.assertEquals(10, listWithZeros.size()); + Assertions.assertTrue(listWithZeros.stream().allMatch(elem -> elem == 0)); + + Assertions.assertEquals(10, listWithNulls.size()); + Assertions.assertTrue(listWithNulls.stream().allMatch(Objects::isNull)); + } + + @Test public void whenInitializingListWithIntStream_thenListIsCorrectlyPopulated() { + // when + ArrayList list = IntStream.of(new int[10]) + .boxed() + .collect(Collectors.toCollection(ArrayList::new)); + + // then + Assertions.assertEquals(10, list.size()); + Assertions.assertTrue(list.stream().allMatch(elem -> elem == 0)); } + + @Test + public void whenInitializingListWithAsList_thenListIsCorrectlyPopulated() { + // when + Integer[] integers = new Integer[10]; + Arrays.fill(integers, 0); + List integerList = new ArrayList<>(Arrays.asList(integers)); + + // then + Assertions.assertEquals(10, integerList.size()); + Assertions.assertTrue(integerList.stream().allMatch(elem -> elem == 0)); + } + + @Test + public void whenInitializingListWithVector_thenListIsCorrectlyPopulated() { + // when + List integerList = new Vector<>() {{setSize(10);}}; + + // then + Assertions.assertEquals(10, integerList.size()); + Assertions.assertTrue(integerList.stream().allMatch(Objects::isNull)); + } +} From b40a0619695dc2051a30e6a9616a7cc469eea686 Mon Sep 17 00:00:00 2001 From: alemoles Date: Mon, 30 Jan 2023 14:19:57 -0300 Subject: [PATCH 368/592] BAEL-5924 Java 8 Stream with Batch Processing Support (#13366) --- .../baeldung/streams/processing/CustomBatchIterator.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/processing/CustomBatchIterator.java b/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/processing/CustomBatchIterator.java index b5407b7283..bfc7ffae3b 100644 --- a/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/processing/CustomBatchIterator.java +++ b/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/processing/CustomBatchIterator.java @@ -14,20 +14,20 @@ public class CustomBatchIterator implements Iterator> { private List currentBatch; private final Iterator iterator; - public CustomBatchIterator(Iterator sourceIterator, int batchSize) { + private CustomBatchIterator(Iterator sourceIterator, int batchSize) { this.batchSize = batchSize; this.iterator = sourceIterator; } @Override public List next() { + prepareNextBatch(); return currentBatch; } @Override public boolean hasNext() { - prepareNextBatch(); - return currentBatch != null && !currentBatch.isEmpty(); + return iterator.hasNext(); } public static Stream> batchStreamOf(Stream stream, int batchSize) { From 9d3667ac77998ae856beaadca63e3b05fa0f482e Mon Sep 17 00:00:00 2001 From: Bhaskar Ghosh Dastidar Date: Tue, 31 Jan 2023 08:16:11 +0530 Subject: [PATCH 369/592] [JAVA-5783] stream to iterable (#13369) * [JAVA-5783] stream to iterable * [JAVA-5783] tests refactor --------- Co-authored-by: Bhaskar --- .../streamtoiterable/StreamToIterable.java | 42 ++++++++++++++++ .../StreamToIterableUnitTest.java | 48 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/streamtoiterable/StreamToIterable.java create mode 100644 core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/streamtoiterable/StreamToIterableUnitTest.java diff --git a/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/streamtoiterable/StreamToIterable.java b/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/streamtoiterable/StreamToIterable.java new file mode 100644 index 0000000000..cdba5ea91f --- /dev/null +++ b/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/streamtoiterable/StreamToIterable.java @@ -0,0 +1,42 @@ +package com.baeldung.streams.streamtoiterable; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import joptsimple.internal.Strings; + +public class StreamToIterable { + public String streamToIterableLambda(List listOfStrings) { + Stream stringStream = listOfStrings.stream(); + StringBuilder sentence = new StringBuilder(); + for (String eachString : (Iterable) () -> stringStream.iterator()) { + doSomethingOnString(eachString, sentence); + } + return sentence.toString(); + } + + public String streamToIterableMethodReference(List listOfStrings) { + Stream stringStream = listOfStrings.stream(); + StringBuilder sentence = new StringBuilder(); + for (String eachString : (Iterable) stringStream::iterator) { + doSomethingOnString(eachString, sentence); + } + return sentence.toString(); + } + + public String streamToList(List listOfStrings) { + Stream stringStream = listOfStrings.stream(); + StringBuilder sentence = new StringBuilder(); + for (String eachString : stringStream.collect(Collectors.toList())) { + doSomethingOnString(eachString, sentence); + } + return sentence.toString(); + } + + private void doSomethingOnString(String s, StringBuilder sentence) { + if (!Strings.isNullOrEmpty(s)) { + sentence.append(s); + } + } +} diff --git a/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/streamtoiterable/StreamToIterableUnitTest.java b/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/streamtoiterable/StreamToIterableUnitTest.java new file mode 100644 index 0000000000..6715477cc3 --- /dev/null +++ b/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/streamtoiterable/StreamToIterableUnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.streams.streamtoiterable; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; + +public class StreamToIterableUnitTest { + + @Test + public void givenList_whenLambdaIsUsed_ThenStreamAsIterable(){ + StreamToIterable streamToIterable = new StreamToIterable(); + String actualString = streamToIterable.streamToIterableLambda(getListOfStrings()); + String expectedString = "Thisisasentencewithnospaces"; + Assert.assertEquals(expectedString, actualString); + } + + @Test + public void givenList_whenMethodReferenceIsUsed_ThenStreamAsIterable(){ + StreamToIterable streamToIterable = new StreamToIterable(); + String actualString = streamToIterable.streamToIterableMethodReference(getListOfStrings()); + String expectedString = "Thisisasentencewithnospaces"; + Assert.assertEquals(expectedString, actualString); + } + + @Test + public void givenList_whenCollectedToList_ThenStreamAsIterable(){ + StreamToIterable streamToIterable = new StreamToIterable(); + String actualString = streamToIterable.streamToList(getListOfStrings()); + String expectedString = "Thisisasentencewithnospaces"; + Assert.assertEquals(expectedString, actualString); + } + + private List getListOfStrings(){ + List listOfStrings = new ArrayList<>(); + listOfStrings.add("This"); + listOfStrings.add("is"); + listOfStrings.add("a"); + listOfStrings.add(null); + listOfStrings.add("sentence"); + listOfStrings.add("with"); + listOfStrings.add("no"); + listOfStrings.add(null); + listOfStrings.add("spaces"); + return listOfStrings; + } +} From 38b983f705f608fd523d643ba09e7875c64b2443 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Tue, 31 Jan 2023 12:58:44 +0200 Subject: [PATCH 370/592] JAVA-14471 remove extra dependency, set start class, upgrade --- spring-boot-modules/spring-boot-keycloak/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spring-boot-modules/spring-boot-keycloak/pom.xml b/spring-boot-modules/spring-boot-keycloak/pom.xml index d13ef22345..2b259346c3 100644 --- a/spring-boot-modules/spring-boot-keycloak/pom.xml +++ b/spring-boot-modules/spring-boot-keycloak/pom.xml @@ -18,10 +18,6 @@ - - org.springframework.boot - spring-boot-starter - org.springframework.boot spring-boot-starter-oauth2-resource-server @@ -81,7 +77,7 @@ org.codehaus.mojo jaxb2-maven-plugin - 2.3.1 + 2.5.0 xjc @@ -100,5 +96,9 @@ + + + com.baeldung.keycloak.SpringBoot + \ No newline at end of file From 848ae207b776eea48e32f33a4d87e66aa6e8891f Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Tue, 31 Jan 2023 14:57:08 +0200 Subject: [PATCH 371/592] JAVA-16890 GitHub Issue: FindBugs should be SpotBugs (#13388) Co-authored-by: timis1 --- testing-modules/testing-libraries/pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/testing-modules/testing-libraries/pom.xml b/testing-modules/testing-libraries/pom.xml index f9443fa792..b7c9b8c0bd 100644 --- a/testing-modules/testing-libraries/pom.xml +++ b/testing-modules/testing-libraries/pom.xml @@ -90,6 +90,11 @@ + + org.codehaus.mojo + findbugs-maven-plugin + ${findbugs-plugin.version} + @@ -111,8 +116,9 @@ 4.8.0 3.0.0 1.19.0 - 1.0.0 + 1.2.1 2.4.3 + 3.0.5 \ No newline at end of file From 7be973e5aa29c375d343190f4443f363e4103c42 Mon Sep 17 00:00:00 2001 From: Amit Kumatr Date: Tue, 31 Jan 2023 18:30:43 +0530 Subject: [PATCH 372/592] rename the package --- .../spring-data-jpa-query-3/pom.xml | 5 ++++- .../ListVsStreamQueryApplication.java | 15 +++++++++++++++ .../vsstream => collectionsvsstream}/User.java | 2 +- .../UserRepository.java | 2 +- .../UserRepositoryIntegrationTest.java | 6 +++--- 5 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collectionsvsstream/ListVsStreamQueryApplication.java rename persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/{collections/vsstream => collectionsvsstream}/User.java (95%) rename persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/{collections/vsstream => collectionsvsstream}/UserRepository.java (85%) rename persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/{query/collections/vsstream => collectionsvsstream}/UserRepositoryIntegrationTest.java (89%) diff --git a/persistence-modules/spring-data-jpa-query-3/pom.xml b/persistence-modules/spring-data-jpa-query-3/pom.xml index a80b6349c9..18df57fe14 100644 --- a/persistence-modules/spring-data-jpa-query-3/pom.xml +++ b/persistence-modules/spring-data-jpa-query-3/pom.xml @@ -5,6 +5,9 @@ 4.0.0 spring-data-jpa-query-3 spring-data-jpa-query-3 + + 0.15 + com.baeldung @@ -25,7 +28,7 @@ com.github.javafaker javafaker - 0.15 + ${javafaker.version} org.springframework.boot diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collectionsvsstream/ListVsStreamQueryApplication.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collectionsvsstream/ListVsStreamQueryApplication.java new file mode 100644 index 0000000000..2585aa0497 --- /dev/null +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collectionsvsstream/ListVsStreamQueryApplication.java @@ -0,0 +1,15 @@ +package com.baeldung.spring.data.jpa.collectionsvsstream; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ListVsStreamQueryApplication { + + @Autowired private UserRepository userRepository; + + public static void main(String[] args) { + SpringApplication.run(ListVsStreamQueryApplication.class, args); + } +} diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collections/vsstream/User.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collectionsvsstream/User.java similarity index 95% rename from persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collections/vsstream/User.java rename to persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collectionsvsstream/User.java index 85843bd92b..d2174c343f 100644 --- a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collections/vsstream/User.java +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collectionsvsstream/User.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.data.jpa.collections.vsstream; +package com.baeldung.spring.data.jpa.collectionsvsstream; import javax.persistence.Entity; import javax.persistence.Id; diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collections/vsstream/UserRepository.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collectionsvsstream/UserRepository.java similarity index 85% rename from persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collections/vsstream/UserRepository.java rename to persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collectionsvsstream/UserRepository.java index 05acb84691..ed37cb7036 100644 --- a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collections/vsstream/UserRepository.java +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collectionsvsstream/UserRepository.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.data.jpa.collections.vsstream; +package com.baeldung.spring.data.jpa.collectionsvsstream; import java.util.List; import java.util.stream.Stream; diff --git a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/collections/vsstream/UserRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/collectionsvsstream/UserRepositoryIntegrationTest.java similarity index 89% rename from persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/collections/vsstream/UserRepositoryIntegrationTest.java rename to persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/collectionsvsstream/UserRepositoryIntegrationTest.java index be25a82126..415bfcfc41 100644 --- a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/query/collections/vsstream/UserRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/collectionsvsstream/UserRepositoryIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.data.jpa.query.collections.vsstream; +package com.baeldung.spring.data.jpa.collectionsvsstream; import static org.assertj.core.api.Assertions.assertThat; @@ -14,8 +14,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.transaction.annotation.Transactional; -import com.baeldung.spring.data.jpa.collections.vsstream.User; -import com.baeldung.spring.data.jpa.collections.vsstream.UserRepository; +import com.baeldung.spring.data.jpa.collectionsvsstream.User; +import com.baeldung.spring.data.jpa.collectionsvsstream.UserRepository; import com.github.javafaker.Faker; @DataJpaTest From bc446e25d40278683b7107ca4a9a9913aa325693 Mon Sep 17 00:00:00 2001 From: Amit Kumatr Date: Tue, 31 Jan 2023 18:31:35 +0530 Subject: [PATCH 373/592] removed unwanted code --- .../ListVsStreamQueryApplication.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collectionsvsstream/ListVsStreamQueryApplication.java b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collectionsvsstream/ListVsStreamQueryApplication.java index 2585aa0497..58123afa6c 100644 --- a/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collectionsvsstream/ListVsStreamQueryApplication.java +++ b/persistence-modules/spring-data-jpa-query-3/src/main/java/com/baeldung/spring/data/jpa/collectionsvsstream/ListVsStreamQueryApplication.java @@ -1,15 +1,12 @@ package com.baeldung.spring.data.jpa.collectionsvsstream; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ListVsStreamQueryApplication { - @Autowired private UserRepository userRepository; - - public static void main(String[] args) { - SpringApplication.run(ListVsStreamQueryApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(ListVsStreamQueryApplication.class, args); + } } From c84564a200ff1e2c8778df0109faa300676d3ba4 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Tue, 31 Jan 2023 19:10:03 +0200 Subject: [PATCH 374/592] BAEL-5856 mark manual test --- ...ntIntegrationTest.java => OrderRestEndpointManualTest.java} | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) rename axon/src/test/java/com/baeldung/axon/gui/{OrderRestEndpointIntegrationTest.java => OrderRestEndpointManualTest.java} (98%) diff --git a/axon/src/test/java/com/baeldung/axon/gui/OrderRestEndpointIntegrationTest.java b/axon/src/test/java/com/baeldung/axon/gui/OrderRestEndpointManualTest.java similarity index 98% rename from axon/src/test/java/com/baeldung/axon/gui/OrderRestEndpointIntegrationTest.java rename to axon/src/test/java/com/baeldung/axon/gui/OrderRestEndpointManualTest.java index a30e42766b..3b5c130c89 100644 --- a/axon/src/test/java/com/baeldung/axon/gui/OrderRestEndpointIntegrationTest.java +++ b/axon/src/test/java/com/baeldung/axon/gui/OrderRestEndpointManualTest.java @@ -27,7 +27,8 @@ import java.util.concurrent.TimeUnit; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest(classes = OrderApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -class OrderRestEndpointIntegrationTest { +//marked as manual as the test is unstable on Jenkins due to low resources +class OrderRestEndpointManualTest { @LocalServerPort private int port; From 91c73a097e389fb751464be7ae07bef7e388ab68 Mon Sep 17 00:00:00 2001 From: Amit Kumatr Date: Wed, 1 Feb 2023 02:06:26 +0530 Subject: [PATCH 375/592] removed transactional annotation --- .../collectionsvsstream/UserRepositoryIntegrationTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/collectionsvsstream/UserRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/collectionsvsstream/UserRepositoryIntegrationTest.java index 415bfcfc41..009ace0f9c 100644 --- a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/collectionsvsstream/UserRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/collectionsvsstream/UserRepositoryIntegrationTest.java @@ -12,10 +12,7 @@ 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.orm.jpa.DataJpaTest; -import org.springframework.transaction.annotation.Transactional; -import com.baeldung.spring.data.jpa.collectionsvsstream.User; -import com.baeldung.spring.data.jpa.collectionsvsstream.UserRepository; import com.github.javafaker.Faker; @DataJpaTest @@ -52,7 +49,6 @@ class UserRepositoryIntegrationTest { } @Test - @Transactional public void whenAgeIs20_thenItShouldReturnAllUsersWhoseAgeIsGreaterThan20InAStream() { Stream users = userRepository.findAllByAgeGreaterThan(20); assertThat(users).isNotNull(); From 9f8926d2aa4c965d50f29a8e0387a6a54a5dbac9 Mon Sep 17 00:00:00 2001 From: Cesare Date: Tue, 31 Jan 2023 23:14:47 +0100 Subject: [PATCH 376/592] BAEL-6125 Migrate Application from Spring Boot 2 to Spring Boot 3 --- .../sample/boundary/ServerConfiguration.java | 21 +++++++++++++++++++ .../sample/boundary/TodosController.java | 10 +++++++++ .../sample/boundary/WebConfiguration.java | 13 ++++++++++++ .../TodosControllerApiIntegrationTest.java | 14 +++++++++++++ 4 files changed, 58 insertions(+) create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/boundary/ServerConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/boundary/WebConfiguration.java diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/boundary/ServerConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/boundary/ServerConfiguration.java new file mode 100644 index 0000000000..5533fe1b7d --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/boundary/ServerConfiguration.java @@ -0,0 +1,21 @@ +package com.baeldung.sample.boundary; + +import org.apache.catalina.connector.Connector; +import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.boot.web.server.WebServerFactoryCustomizer; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ServerConfiguration implements WebServerFactoryCustomizer { + + @Override + public void customize(TomcatServletWebServerFactory factory) { + factory.addConnectorCustomizers(new TomcatConnectorCustomizer() { + @Override + public void customize(Connector connector) { + connector.setProperty("maxHttpResponseHeaderSize", "100000"); + } + }); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/boundary/TodosController.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/boundary/TodosController.java index 7efa7dfee3..104dc80210 100644 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/boundary/TodosController.java +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/boundary/TodosController.java @@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.RestController; import java.net.URI; import java.util.Collection; +import java.util.List; import java.util.stream.Collectors; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; @@ -35,6 +36,14 @@ public class TodosController { // Mapping zwischen den Schichten private final TodoDtoMapper mapper; + + @GetMapping(value = {"/name"},produces = DEFAULT_MEDIA_TYPE) + public List findAllName(){ + return List.of("Hello", "World"); + + } + + @GetMapping(produces = DEFAULT_MEDIA_TYPE) public Collection findAll() { return service.findAll().stream() @@ -80,4 +89,5 @@ public class TodosController { service.delete(id); } + } diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/boundary/WebConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/boundary/WebConfiguration.java new file mode 100644 index 0000000000..24bbc223ae --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/boundary/WebConfiguration.java @@ -0,0 +1,13 @@ +package com.baeldung.sample.boundary; + +import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +public class WebConfiguration implements WebMvcConfigurer { + + @Override + public void configurePathMatch(PathMatchConfigurer configurer) { + configurer.setUseTrailingSlashMatch(true); + } + +} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/sample/boundary/TodosControllerApiIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/sample/boundary/TodosControllerApiIntegrationTest.java index 680b6c85bb..d809c5f9c9 100644 --- a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/sample/boundary/TodosControllerApiIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/sample/boundary/TodosControllerApiIntegrationTest.java @@ -215,4 +215,18 @@ class TodosControllerApiIntegrationTest { .andExpect(status().isNotFound()); } + @Test + void testGetSlashMatchingNotExisting() throws Exception { + mvc + .perform(get(BASEURL + "/name/").contentType(DEFAULT_MEDIA_TYPE)) + .andExpect(status().isNotFound()); + } + + @Test + void testGetNameExists() throws Exception { + mvc + .perform(get(BASEURL + "/name").contentType(DEFAULT_MEDIA_TYPE)) + .andExpect(status().isOk()); + } + } From 226fa47606b2bc329ae3537cd0f4e4d152aa4de9 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Wed, 1 Feb 2023 03:11:14 +0100 Subject: [PATCH 377/592] [strArrayToIntArray] convert str array to int array (#13217) --- .../StringArrayToIntArrayUnitTest.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/StringArrayToIntArrayUnitTest.java diff --git a/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/StringArrayToIntArrayUnitTest.java b/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/StringArrayToIntArrayUnitTest.java new file mode 100644 index 0000000000..3675778f90 --- /dev/null +++ b/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/StringArrayToIntArrayUnitTest.java @@ -0,0 +1,63 @@ +package com.baeldung.array.conversions; + +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + + +public class StringArrayToIntArrayUnitTest { + private final String[] stringArray = new String[] { "1", "2", "3", "4", "5", "6", "42" }; + private final int[] expected = new int[] { 1, 2, 3, 4, 5, 6, 42 }; + + private final String[] stringArrayWithInvalidNum = new String[] { "1", "2", "hello", "4", "world", "6", "42" }; + private final int[] expectedWithInvalidInput = new int[] { 1, 2, Integer.MIN_VALUE, 4, Integer.MIN_VALUE, 6, 42 }; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Test + void givenStringArray_whenUseStreamApi_shouldGetExpectedIntArray() { + int[] result = Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray(); + assertArrayEquals(expected, result); + } + + @Test + void givenStringArrayWithInvalidNum_whenUseStreamApi_shouldGetExpectedIntArray() { + int[] result = Arrays.stream(stringArrayWithInvalidNum).mapToInt(s -> { + try { + return Integer.parseInt(s); + } catch (NumberFormatException ex) { + logger.warn("Invalid number format detected: {}, use Int.MinValue as the fallback", s); + return Integer.MIN_VALUE; + } + }).toArray(); + assertArrayEquals(expectedWithInvalidInput, result); + } + + @Test + void givenStringArray_whenConvertInLoop_shouldGetExpectedIntArray() { + int[] result = new int[stringArray.length]; + for (int i = 0; i < stringArray.length; i++) { + result[i] = Integer.parseInt(stringArray[i]); + } + assertArrayEquals(expected, result); + } + + @Test + void givenStringArrayWithInvalidNum_whenConvertInLoop_shouldGetExpectedIntArray() { + int[] result = new int[stringArrayWithInvalidNum.length]; + for (int i = 0; i < stringArrayWithInvalidNum.length; i++) { + try { + result[i] = Integer.parseInt(stringArrayWithInvalidNum[i]); + } catch (NumberFormatException exception) { + logger.warn("Invalid number format detected: [{}], use Int.MinValue as the fallback", stringArrayWithInvalidNum[i]); + result[i] = Integer.MIN_VALUE; + } + } + + assertArrayEquals(expectedWithInvalidInput, result); + } +} From c919c5e70c21c644dcf63aa611d2e530a5d4b91e Mon Sep 17 00:00:00 2001 From: Olu <56642018+olu-damilare@users.noreply.github.com> Date: Wed, 1 Feb 2023 08:04:40 +0100 Subject: [PATCH 378/592] BAEL 5932 - Callback Functions in Java (#13364) --- .../AsynchronousCallbackUnitTest.java | 5 ++--- .../ConsumerCallbackUnitTest.java | 15 +++++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/AsynchronousCallbackUnitTest.java b/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/AsynchronousCallbackUnitTest.java index 494d7365d3..de9e386395 100644 --- a/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/AsynchronousCallbackUnitTest.java +++ b/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/AsynchronousCallbackUnitTest.java @@ -6,8 +6,7 @@ import com.baeldung.callbackfunctions.EventListener; import com.baeldung.callbackfunctions.asynchronous.AsynchronousEventConsumer; import com.baeldung.callbackfunctions.asynchronous.AsynchronousEventListenerImpl; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.*; public class AsynchronousCallbackUnitTest { @@ -17,6 +16,6 @@ public class AsynchronousCallbackUnitTest { AsynchronousEventConsumer asynchronousEventListenerConsumer = new AsynchronousEventConsumer(listener); asynchronousEventListenerConsumer.doAsynchronousOperation(); - verify(listener, times(1)).onTrigger(); + verify(listener, timeout(1000).times(1)).onTrigger(); } } diff --git a/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/ConsumerCallbackUnitTest.java b/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/ConsumerCallbackUnitTest.java index ba09a7e50c..9ba5cdb6ef 100644 --- a/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/ConsumerCallbackUnitTest.java +++ b/core-java-modules/core-java-functional/src/test/java/com/baeldung/callbackfunctions/ConsumerCallbackUnitTest.java @@ -3,18 +3,25 @@ package com.baeldung.callbackfunctions; import org.junit.jupiter.api.Test; import com.baeldung.callbackfunctions.ConsumerCallback; +import java.util.concurrent.atomic.AtomicInteger; + import static org.junit.jupiter.api.Assertions.assertEquals; public class ConsumerCallbackUnitTest { @Test - public void whenIncreasingInitialAgeByGivenValueThroughCallback_shouldIncreaseAge(){ + void whenIncreasingInitialAgeByGivenValueThroughCallback_shouldIncreaseAge(){ ConsumerCallback consumerCallback = new ConsumerCallback(); - consumerCallback.getAge(20, (initialAge) -> { - int ageDifference = 10; + int ageDifference = 10; + AtomicInteger newAge1 = new AtomicInteger(); + int initialAge = 20; + consumerCallback.getAge(initialAge, (initialAge1) -> { consumerCallback.increaseAge(initialAge, ageDifference, (newAge) -> { - assertEquals(initialAge + ageDifference, newAge); + System.out.printf("New age ==> %s", newAge); + newAge1.set(newAge); + }); }); + assertEquals(initialAge + ageDifference, newAge1.get()); } } From cb98df168b1fcd54c8ac3c39be4af4b96f9907fa Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Thu, 2 Feb 2023 04:01:09 +0100 Subject: [PATCH 379/592] [abs-int-diff] Return Absolute Difference Between Two Integers in Java (#13379) --- .../AbsoluteDifferenceOfTwoIntUnitTest.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 core-java-modules/core-java-numbers-5/src/test/java/com/baeldung/absintdiff/AbsoluteDifferenceOfTwoIntUnitTest.java diff --git a/core-java-modules/core-java-numbers-5/src/test/java/com/baeldung/absintdiff/AbsoluteDifferenceOfTwoIntUnitTest.java b/core-java-modules/core-java-numbers-5/src/test/java/com/baeldung/absintdiff/AbsoluteDifferenceOfTwoIntUnitTest.java new file mode 100644 index 0000000000..eec3924202 --- /dev/null +++ b/core-java-modules/core-java-numbers-5/src/test/java/com/baeldung/absintdiff/AbsoluteDifferenceOfTwoIntUnitTest.java @@ -0,0 +1,58 @@ +package com.baeldung.absintdiff; + +import static com.baeldung.absintdiff.IntDiffUtil.absDiff; +import static com.baeldung.absintdiff.IntDiffUtil.absDiff2; +import static com.baeldung.absintdiff.IntDiffUtil.absDiffAsLong; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +class IntDiffUtil { + static int absDiff(int num1, int num2) { + int result = Math.abs(num1 - num2); + System.out.println("Absolute diff: " + result); + return result; + } + + static int absDiff2(int num1, int num2) { + return Math.abs(Math.subtractExact(num1, num2)); + } + + static long absDiffAsLong(int num1, int num2) { + return Math.abs((long) num1 - num2); + } +} + +public class AbsoluteDifferenceOfTwoIntUnitTest { + + @Test + void givenTwoIntegers_whenCallingAbsDiff_shouldGetExpectedResult() { + int diff1 = absDiff(100, -200); + assertEquals(300, diff1); + + int diff2 = absDiff(100, 200); + assertEquals(100, diff2); + + //integer overflow! output: Absolute diff: 2147483449 + //absDiff(Integer.MAX_VALUE, -200); + } + + @Test + void givenTwoIntegers_whenCallingAbsDiff2_shouldThrowException() { + int diff1 = absDiff2(100, -200); + assertEquals(300, diff1); + + int diff2 = absDiff2(100, 200); + assertEquals(100, diff2); + + //overflow -> exception + assertThrows(ArithmeticException.class, () -> absDiff2(Integer.MAX_VALUE, -200)); + } + + @Test + void givenTwoIntegers_whenCallingAbsDiffAsLong_shouldThrowException() { + long diff = absDiffAsLong(Integer.MAX_VALUE, -200); + assertEquals(Integer.MAX_VALUE + 200L, diff); + } +} \ No newline at end of file From be4a0dedf7490faf6a9ad64ff0d83c1d80fba688 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 2 Feb 2023 11:01:37 +0200 Subject: [PATCH 380/592] update tests to use junit5, mark live test --- persistence-modules/spring-data-redis/pom.xml | 5 ----- ...ngContextTest.java => SpringContextLiveTest.java} | 12 ++++++------ 2 files changed, 6 insertions(+), 11 deletions(-) rename persistence-modules/spring-data-redis/src/test/java/com/baeldung/{SpringContextTest.java => SpringContextLiveTest.java} (83%) diff --git a/persistence-modules/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml index 330f0d975a..ab133192a0 100644 --- a/persistence-modules/spring-data-redis/pom.xml +++ b/persistence-modules/spring-data-redis/pom.xml @@ -42,11 +42,6 @@ spring-boot-starter-test test - - org.junit.platform - junit-platform-runner - test - cglib cglib-nodep diff --git a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/SpringContextTest.java b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/SpringContextLiveTest.java similarity index 83% rename from persistence-modules/spring-data-redis/src/test/java/com/baeldung/SpringContextTest.java rename to persistence-modules/spring-data-redis/src/test/java/com/baeldung/SpringContextLiveTest.java index 5167e63721..c370fdfecf 100644 --- a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/SpringContextTest.java +++ b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/SpringContextLiveTest.java @@ -1,8 +1,8 @@ package com.baeldung; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; @@ -13,17 +13,17 @@ import redis.embedded.RedisServerBuilder; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringRedisApplication.class) @DirtiesContext(classMode = ClassMode.BEFORE_CLASS) -public class SpringContextTest { +public class SpringContextLiveTest { private static redis.embedded.RedisServer redisServer; - @BeforeClass + @BeforeAll public static void startRedisServer() { redisServer = new RedisServerBuilder().port(6379).setting("maxmemory 256M").build(); redisServer.start(); } - @AfterClass + @AfterAll public static void stopRedisServer() { redisServer.stop(); } From dba7084dbf6cb40a53f406ba18a2d2282a08cf06 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 2 Feb 2023 11:03:11 +0200 Subject: [PATCH 381/592] update path to xml file --- spring-boot-modules/spring-boot-keycloak/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-keycloak/pom.xml b/spring-boot-modules/spring-boot-keycloak/pom.xml index 2b259346c3..a59a1e6874 100644 --- a/spring-boot-modules/spring-boot-keycloak/pom.xml +++ b/spring-boot-modules/spring-boot-keycloak/pom.xml @@ -89,7 +89,7 @@ com.baeldung - src/main/resources/products.xsd + ${project.basedir}/src/main/resources/products.xsd From 51058e940b15800afbd4f3034d1da3f24230ae5e Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 2 Feb 2023 14:25:53 +0200 Subject: [PATCH 382/592] match boot version, update path --- spring-boot-modules/spring-boot-keycloak/pom.xml | 2 +- testing-modules/zerocode/pom.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-keycloak/pom.xml b/spring-boot-modules/spring-boot-keycloak/pom.xml index a59a1e6874..1a2c1232b5 100644 --- a/spring-boot-modules/spring-boot-keycloak/pom.xml +++ b/spring-boot-modules/spring-boot-keycloak/pom.xml @@ -89,7 +89,7 @@ com.baeldung - ${project.basedir}/src/main/resources/products.xsd + /${project.basedir}/src/main/resources/products.xsd diff --git a/testing-modules/zerocode/pom.xml b/testing-modules/zerocode/pom.xml index bcd51bea85..15ef45be63 100644 --- a/testing-modules/zerocode/pom.xml +++ b/testing-modules/zerocode/pom.xml @@ -37,6 +37,7 @@ org.springframework.boot spring-boot-maven-plugin + ${spring.boot.version} it From e07a0205c2ed60c48eae25608f0b075aa3397949 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 2 Feb 2023 16:20:16 +0200 Subject: [PATCH 383/592] downgrade jaxb plugin --- spring-boot-modules/spring-boot-keycloak/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-keycloak/pom.xml b/spring-boot-modules/spring-boot-keycloak/pom.xml index 1a2c1232b5..34e93299ae 100644 --- a/spring-boot-modules/spring-boot-keycloak/pom.xml +++ b/spring-boot-modules/spring-boot-keycloak/pom.xml @@ -77,7 +77,7 @@ org.codehaus.mojo jaxb2-maven-plugin - 2.5.0 + 2.3.1 xjc From dfd175c5c8243677b82b37f13a70f22113e55ff2 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 2 Feb 2023 22:34:44 +0800 Subject: [PATCH 384/592] Update README.md [skip ci] --- spring-boot-modules/spring-boot-3-native/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-3-native/README.md b/spring-boot-modules/spring-boot-3-native/README.md index 6f46263257..025a40c1d0 100644 --- a/spring-boot-modules/spring-boot-3-native/README.md +++ b/spring-boot-modules/spring-boot-3-native/README.md @@ -1,2 +1,3 @@ ## Relevant Articles - [Native Images with Spring Boot and GraalVM](https://www.baeldung.com/spring-native-intro) +- [Ahead of Time Optimizations in Spring 6](https://www.baeldung.com/spring-6-ahead-of-time-optimizations) From 04ad33b9ba6a57fc48ca1c0ad07b974100e439b6 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 2 Feb 2023 22:37:10 +0800 Subject: [PATCH 385/592] Update README.md [skip ci] --- core-java-modules/core-java-19/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-19/README.md b/core-java-modules/core-java-19/README.md index 9663296da0..6a9c6c7fdd 100644 --- a/core-java-modules/core-java-19/README.md +++ b/core-java-modules/core-java-19/README.md @@ -1,2 +1,3 @@ ## Relevant Articles - [Record Patterns in Java 19](https://www.baeldung.com/java-19-record-patterns) +- [Structured Concurrency in Java 19](https://www.baeldung.com/java-structured-concurrency) From dec4804734051ad4b67a42ac2503dd81aab87f8d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 2 Feb 2023 22:42:42 +0800 Subject: [PATCH 386/592] Update README.md [skip ci] --- docker-modules/docker-compose-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-modules/docker-compose-2/README.md b/docker-modules/docker-compose-2/README.md index 729105e3fd..353b85f154 100644 --- a/docker-modules/docker-compose-2/README.md +++ b/docker-modules/docker-compose-2/README.md @@ -1 +1,2 @@ ## Relevant Articles: +- [Communicating With Docker Containers on the Same Machine](https://www.baeldung.com/ops/docker-communicating-with-containers-on-same-machine) From 6c90868613eb8a9f6ad9ed6fe1e053a9db42212b Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 2 Feb 2023 22:55:14 +0800 Subject: [PATCH 387/592] Update README.md [skip ci] --- core-java-modules/core-java-11-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-11-3/README.md b/core-java-modules/core-java-11-3/README.md index e77e5b7f3d..4f5eb3ea56 100644 --- a/core-java-modules/core-java-11-3/README.md +++ b/core-java-modules/core-java-11-3/README.md @@ -5,3 +5,4 @@ This module contains articles about Java 11 core features ### Relevant articles - [Adding Parameters to Java HttpClient Requests](https://www.baeldung.com/java-httpclient-request-parameters) - [Writing a List of Strings Into a Text File](https://www.baeldung.com/java-list-to-text-file) +- [Java HttpClient – Map JSON Response to Java Class](https://www.baeldung.com/java-httpclient-map-json-response) From ccd2927e3a103c2072bccdf39f34d2d33f34be03 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 2 Feb 2023 23:00:22 +0800 Subject: [PATCH 388/592] 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 61b2853af9..ca8742d6c0 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 @@ -8,3 +8,4 @@ This module contains articles about types in Java - [Check if an Enum Value Exists in Java](https://www.baeldung.com/java-search-enum-values) - [Generate a Random Value From an Enum](https://www.baeldung.com/java-enum-random-value) - [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) From f230853409e8fca90de83d8b70be8b9cf169d5b4 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 2 Feb 2023 23:10:18 +0800 Subject: [PATCH 389/592] Update README.md [skip ci] --- spring-boot-modules/spring-boot-logging-log4j2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-logging-log4j2/README.md b/spring-boot-modules/spring-boot-logging-log4j2/README.md index 9688f8f83c..45d6c0a2f5 100644 --- a/spring-boot-modules/spring-boot-logging-log4j2/README.md +++ b/spring-boot-modules/spring-boot-logging-log4j2/README.md @@ -7,3 +7,4 @@ This module contains articles about logging in Spring Boot projects with Log4j 2 - [Logging to Graylog with Spring Boot](https://www.baeldung.com/graylog-with-spring-boot) - [Log Groups in Spring Boot 2.1](https://www.baeldung.com/spring-boot-log-groups) - [Writing Log Data to Syslog Using Log4j2](https://www.baeldung.com/log4j-to-syslog) +- [Spring Boot Logback and Log4j2 Extensions](https://www.baeldung.com/spring-boot-logback-log4j2) From fd7b8b6f0dcf3a690be63fbbb52f141e1ce88ca1 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 2 Feb 2023 23:15:00 +0800 Subject: [PATCH 390/592] Update README.md [skip ci] --- spring-core-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-core-6/README.md b/spring-core-6/README.md index 1cb5935cc5..90e2dfed01 100644 --- a/spring-core-6/README.md +++ b/spring-core-6/README.md @@ -3,3 +3,4 @@ - [Instantiating Multiple Beans of the Same Class with Spring Annotations](https://www.baeldung.com/spring-same-class-multiple-beans) - [Using Environment Variables in Spring Boot’s application.properties](https://www.baeldung.com/spring-boot-properties-env-variables) - [Reinitialize Singleton Bean in Spring Context](https://www.baeldung.com/spring-reinitialize-singleton-bean) +- [HTTP Interface in Spring 6](https://www.baeldung.com/spring-6-http-interface) From 8765a412dca1ec1489486dd0afcb916025a19cca Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 2 Feb 2023 23:20:20 +0800 Subject: [PATCH 391/592] Update README.md [skip ci] --- core-java-modules/core-java-numbers-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-numbers-5/README.md b/core-java-modules/core-java-numbers-5/README.md index 7a010e2fbf..34651c8e6c 100644 --- a/core-java-modules/core-java-numbers-5/README.md +++ b/core-java-modules/core-java-numbers-5/README.md @@ -7,3 +7,4 @@ - [Make Division of Two Integers Result in a Float](https://www.baeldung.com/java-integer-division-float-result) - [Creating Random Numbers With No Duplicates in Java](https://www.baeldung.com/java-unique-random-numbers) - [Multiply a BigDecimal by an Integer in Java](https://www.baeldung.com/java-bigdecimal-multiply-integer) +- [Check if an Integer Value is null or Zero in Java](https://www.baeldung.com/java-check-integer-null-or-zero) From b5c8b3a0805327814ffb693e93229e2e26f5e586 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 2 Feb 2023 23:25:16 +0800 Subject: [PATCH 392/592] Update README.md [skip ci] --- testing-modules/instancio/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/testing-modules/instancio/README.md b/testing-modules/instancio/README.md index 881477f036..35166ee017 100644 --- a/testing-modules/instancio/README.md +++ b/testing-modules/instancio/README.md @@ -1 +1,2 @@ -### Relevant articles +## Relevant articles +- [Generate Unit Test Data in Java Using Instancio](https://www.baeldung.com/java-test-data-instancio) From c31505b584efc65e00c9b2a87ddc0928dc4e1cec Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 2 Feb 2023 23:27:36 +0800 Subject: [PATCH 393/592] Update README.md [skip ci] --- core-java-modules/core-java-streams-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-streams-4/README.md b/core-java-modules/core-java-streams-4/README.md index b210c2775a..8e5e0652ef 100644 --- a/core-java-modules/core-java-streams-4/README.md +++ b/core-java-modules/core-java-streams-4/README.md @@ -6,3 +6,4 @@ - [Java 8 Streams: Multiple Filters vs. Complex Condition](https://www.baeldung.com/java-streams-multiple-filters-vs-condition) - [Finding Max Date in List Using Streams](https://www.baeldung.com/java-max-date-list-streams) - [Batch Processing of Stream Data in Java](https://www.baeldung.com/java-stream-batch-processing) +- [Stream to Iterable in Java](https://www.baeldung.com/java-stream-to-iterable) From 5ae8fa5069572adc3aae817bc14f62a5d3a54671 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 2 Feb 2023 23:29:26 +0800 Subject: [PATCH 394/592] Update README.md [skip ci] --- core-java-modules/core-java-lang-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-5/README.md b/core-java-modules/core-java-lang-5/README.md index b8deff199e..5ff3e83d2c 100644 --- a/core-java-modules/core-java-lang-5/README.md +++ b/core-java-modules/core-java-lang-5/README.md @@ -14,3 +14,4 @@ This module contains articles about core features in the Java language - [Convert Between int and char in Java](https://www.baeldung.com/java-convert-int-char) - [Converting a Number from One Base to Another in Java](https://www.baeldung.com/java-converting-a-number-from-one-base-to-another) - [Check if Command-Line Arguments Are Null in Java](https://www.baeldung.com/java-check-command-line-args) +- [Determine if a Class Implements an Interface in Java](https://www.baeldung.com/java-check-class-implements-interface) From 7fa5e1159b3094f546f461da6506ed86a276e132 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 2 Feb 2023 17:04:40 +0000 Subject: [PATCH 395/592] [JAVA-15024] Upgraded multipart functionality to apache client 5 (#13378) Co-authored-by: panagiotiskakos --- apache-httpclient/pom.xml | 40 ++++ .../HttpClientMultipartLiveTest.java | 207 +++++++++--------- .../CustomHttpClientResponseHandler.java | 11 + 3 files changed, 152 insertions(+), 106 deletions(-) create mode 100644 apache-httpclient/src/test/java/com/baeldung/httpclient/handler/CustomHttpClientResponseHandler.java diff --git a/apache-httpclient/pom.xml b/apache-httpclient/pom.xml index 26eb319ac0..47dd41dce7 100644 --- a/apache-httpclient/pom.xml +++ b/apache-httpclient/pom.xml @@ -54,6 +54,42 @@ + + org.apache.httpcomponents.core5 + httpcore5 + ${httpcore5.version} + + + commons-logging + commons-logging + + + + + + org.apache.httpcomponents.client5 + httpclient5-fluent + ${httpclient5-fluent.version} + + + commons-logging + commons-logging + + + + + + org.apache.httpcomponents.client5 + httpclient5 + ${httpclient5.version} + + + commons-logging + commons-logging + + + + com.github.tomakehurst wiremock @@ -78,6 +114,10 @@ 2.5.1 4.5.8 + + 5.2 + 5.2 + 5.2 \ No newline at end of file diff --git a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java index 7576e49034..b5ede3ed60 100644 --- a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java +++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java @@ -1,19 +1,24 @@ package com.baeldung.httpclient; -import org.apache.http.HttpEntity; -import org.apache.http.HttpStatus; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.ContentType; -import org.apache.http.entity.mime.HttpMultipartMode; -import org.apache.http.entity.mime.MultipartEntityBuilder; -import org.apache.http.entity.mime.content.FileBody; -import org.apache.http.entity.mime.content.StringBody; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import org.apache.hc.client5.http.classic.methods.HttpPost; +import org.apache.hc.client5.http.entity.mime.FileBody; +import org.apache.hc.client5.http.entity.mime.HttpMultipartMode; +import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder; +import org.apache.hc.client5.http.entity.mime.StringBody; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; + +import org.apache.hc.core5.http.ContentType; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.core5.http.HttpStatus; import java.io.BufferedReader; import java.io.File; @@ -22,14 +27,10 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; -import java.util.logging.Level; -import java.util.logging.Logger; -import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import com.baeldung.httpclient.handler.CustomHttpClientResponseHandler; -public class HttpClientMultipartLiveTest { +class HttpClientMultipartLiveTest { // No longer available // private static final String SERVER = "http://echo.200please.com"; @@ -38,41 +39,16 @@ public class HttpClientMultipartLiveTest { private static final String TEXTFILENAME = "temp.txt"; private static final String IMAGEFILENAME = "image.jpg"; private static final String ZIPFILENAME = "zipFile.zip"; - private static final Logger LOGGER = Logger.getLogger("com.baeldung.httpclient.HttpClientMultipartLiveTest"); - private CloseableHttpClient client; private HttpPost post; private BufferedReader rd; - private CloseableHttpResponse response; - @Before - public final void before() { - client = HttpClientBuilder.create() - .build(); + @BeforeEach + public void before() { post = new HttpPost(SERVER); } - @After - public final void after() throws IllegalStateException, IOException { - post.completed(); - try { - client.close(); - } catch (final IOException e1) { - LOGGER.log(Level.SEVERE, e1.getMessage(), e1); - throw e1; - } - try { - rd.close(); - } catch (final IOException e) { - LOGGER.log(Level.SEVERE, e.getMessage(), e); - throw e; - } - ResponseUtil.closeResponse(response); - } - - // tests - @Test - public final void givenFileandMultipleTextParts_whenUploadwithAddPart_thenNoExceptions() throws IOException { + void givenFileandMultipleTextParts_whenUploadwithAddPart_thenNoExceptions() throws IOException { final URL url = Thread.currentThread() .getContextClassLoader() .getResource("uploads/" + TEXTFILENAME); @@ -83,53 +59,61 @@ public class HttpClientMultipartLiveTest { final StringBody stringBody2 = new StringBody("This is message 2", ContentType.MULTIPART_FORM_DATA); // final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); - builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); + builder.setMode(HttpMultipartMode.LEGACY); builder.addPart("file", fileBody); builder.addPart("text1", stringBody1); builder.addPart("text2", stringBody2); final HttpEntity entity = builder.build(); - // - post.setEntity(entity); - response = client.execute(post); - final int statusCode = response.getStatusLine() - .getStatusCode(); - final String responseString = getContent(); - final String contentTypeInHeader = getContentTypeHeader(); - assertThat(statusCode, equalTo(HttpStatus.SC_OK)); - // assertTrue(responseString.contains("Content-Type: multipart/form-data;")); - assertTrue(contentTypeInHeader.contains("Content-Type: multipart/form-data;")); - System.out.println(responseString); - System.out.println("POST Content Type: " + contentTypeInHeader); + post.setEntity(entity); + try(CloseableHttpClient client = HttpClientBuilder.create() + .build(); + + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(post, new CustomHttpClientResponseHandler())){ + final int statusCode = response.getCode(); + final String responseString = getContent(response.getEntity()); + final String contentTypeInHeader = getContentTypeHeader(); + + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + assertTrue(contentTypeInHeader.contains("Content-Type: multipart/form-data;")); + System.out.println(responseString); + System.out.println("POST Content Type: " + contentTypeInHeader); + } } @Test - public final void givenFileandTextPart_whenUploadwithAddBinaryBodyandAddTextBody_ThenNoExeption() throws IOException { + void givenFileandTextPart_whenUploadwithAddBinaryBodyandAddTextBody_ThenNoExeption() throws IOException { final URL url = Thread.currentThread() .getContextClassLoader() .getResource("uploads/" + TEXTFILENAME); final File file = new File(url.getPath()); final String message = "This is a multipart post"; final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); - builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); + builder.setMode(HttpMultipartMode.LEGACY); builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, TEXTFILENAME); builder.addTextBody("text", message, ContentType.DEFAULT_BINARY); final HttpEntity entity = builder.build(); post.setEntity(entity); - response = client.execute(post); - final int statusCode = response.getStatusLine() - .getStatusCode(); - final String responseString = getContent(); - final String contentTypeInHeader = getContentTypeHeader(); - assertThat(statusCode, equalTo(HttpStatus.SC_OK)); - // assertTrue(responseString.contains("Content-Type: multipart/form-data;")); - assertTrue(contentTypeInHeader.contains("Content-Type: multipart/form-data;")); - System.out.println(responseString); - System.out.println("POST Content Type: " + contentTypeInHeader); + + try(CloseableHttpClient client = HttpClientBuilder.create() + .build(); + + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(post, new CustomHttpClientResponseHandler())){ + + final int statusCode = response.getCode(); + final String responseString = getContent(response.getEntity()); + final String contentTypeInHeader = getContentTypeHeader(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + assertTrue(contentTypeInHeader.contains("Content-Type: multipart/form-data;")); + System.out.println(responseString); + System.out.println("POST Content Type: " + contentTypeInHeader); + } } @Test - public final void givenFileAndInputStreamandText_whenUploadwithAddBinaryBodyandAddTextBody_ThenNoException() throws IOException { + void givenFileAndInputStreamandText_whenUploadwithAddBinaryBodyandAddTextBody_ThenNoException() throws IOException { final URL url = Thread.currentThread() .getContextClassLoader() .getResource("uploads/" + ZIPFILENAME); @@ -140,64 +124,75 @@ public class HttpClientMultipartLiveTest { final File file = new File(url2.getPath()); final String message = "This is a multipart post"; final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); - builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); + builder.setMode(HttpMultipartMode.STRICT); builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, IMAGEFILENAME); builder.addBinaryBody("upstream", inputStream, ContentType.create("application/zip"), ZIPFILENAME); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); final HttpEntity entity = builder.build(); post.setEntity(entity); - response = client.execute(post); - final int statusCode = response.getStatusLine() - .getStatusCode(); - final String responseString = getContent(); - final String contentTypeInHeader = getContentTypeHeader(); - assertThat(statusCode, equalTo(HttpStatus.SC_OK)); - // assertTrue(responseString.contains("Content-Type: multipart/form-data;")); - assertTrue(contentTypeInHeader.contains("Content-Type: multipart/form-data;")); - System.out.println(responseString); - System.out.println("POST Content Type: " + contentTypeInHeader); - inputStream.close(); + + try(CloseableHttpClient client = HttpClientBuilder.create() + .build(); + + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(post, new CustomHttpClientResponseHandler())){ + + final int statusCode = response.getCode(); + final String responseString = getContent(response.getEntity()); + final String contentTypeInHeader = getContentTypeHeader(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + assertTrue(contentTypeInHeader.contains("Content-Type: multipart/form-data;")); + System.out.println(responseString); + System.out.println("POST Content Type: " + contentTypeInHeader); + inputStream.close(); + } } @Test - public final void givenCharArrayandText_whenUploadwithAddBinaryBodyandAddTextBody_ThenNoException() throws IOException { + void givenCharArrayandText_whenUploadwithAddBinaryBodyandAddTextBody_ThenNoException() throws IOException { final String message = "This is a multipart post"; final byte[] bytes = "binary code".getBytes(); final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); - builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); + builder.setMode(HttpMultipartMode.STRICT); builder.addBinaryBody("file", bytes, ContentType.DEFAULT_BINARY, TEXTFILENAME); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); final HttpEntity entity = builder.build(); post.setEntity(entity); - response = client.execute(post); - final int statusCode = response.getStatusLine() - .getStatusCode(); - final String responseString = getContent(); - final String contentTypeInHeader = getContentTypeHeader(); - assertThat(statusCode, equalTo(HttpStatus.SC_OK)); - // assertTrue(responseString.contains("Content-Type: multipart/form-data;")); - assertTrue(contentTypeInHeader.contains("Content-Type: multipart/form-data;")); - System.out.println(responseString); - System.out.println("POST Content Type: " + contentTypeInHeader); + + try(CloseableHttpClient client = HttpClientBuilder.create() + .build(); + + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(post, new CustomHttpClientResponseHandler())){ + + final int statusCode = response.getCode(); + final String responseString = getContent(response.getEntity()); + final String contentTypeInHeader = getContentTypeHeader(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + assertTrue(contentTypeInHeader.contains("Content-Type: multipart/form-data;")); + System.out.println(responseString); + System.out.println("POST Content Type: " + contentTypeInHeader); + } + } // UTIL - private String getContent() throws IOException { - rd = new BufferedReader(new InputStreamReader(response.getEntity() - .getContent())); + private String getContent(HttpEntity httpEntity) throws IOException { + rd = new BufferedReader(new InputStreamReader(httpEntity.getContent())); String body = ""; StringBuilder content = new StringBuilder(); while ((body = rd.readLine()) != null) { - content.append(body).append("\n"); + content.append(body) + .append("\n"); } - return content.toString().trim(); + return content.toString() + .trim(); } - private String getContentTypeHeader() throws IOException { + private String getContentTypeHeader() { return post.getEntity() - .getContentType() - .toString(); + .getContentType(); } } diff --git a/apache-httpclient/src/test/java/com/baeldung/httpclient/handler/CustomHttpClientResponseHandler.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/handler/CustomHttpClientResponseHandler.java new file mode 100644 index 0000000000..0559854b35 --- /dev/null +++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/handler/CustomHttpClientResponseHandler.java @@ -0,0 +1,11 @@ +package com.baeldung.httpclient.handler; + +import org.apache.hc.core5.http.ClassicHttpResponse; +import org.apache.hc.core5.http.io.HttpClientResponseHandler; + +public class CustomHttpClientResponseHandler implements HttpClientResponseHandler { + @Override + public ClassicHttpResponse handleResponse(ClassicHttpResponse response) { + return response; + } +} \ No newline at end of file From edba3b292b54e54a3111384314a223ca135a3c71 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Thu, 2 Feb 2023 19:45:55 +0200 Subject: [PATCH 396/592] JAVA-17281 GitHub Issue: Read only Spring Boot App- NoUniqueBeanDefinitionException: No qualifying bean of type available: expected single matching bean but found 2 (#13394) Co-authored-by: n --- .../com/baeldung/boot/readonlyrepository/BookRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/readonlyrepository/BookRepository.java b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/readonlyrepository/BookRepository.java index 363b310c8c..11a75ba881 100644 --- a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/readonlyrepository/BookRepository.java +++ b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/readonlyrepository/BookRepository.java @@ -2,5 +2,5 @@ package com.baeldung.boot.readonlyrepository; import org.springframework.data.repository.CrudRepository; -public interface BookRepository extends BookReadOnlyRepository, CrudRepository { +public interface BookRepository extends CrudRepository { } From 5f1cc6ddba2a390a64376617433b231440d7a791 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Thu, 2 Feb 2023 20:08:39 +0200 Subject: [PATCH 397/592] JAVA-16681 GitHub Issue: CacheUtils shown in this tutorial are now Deprecated and marked for removal (#13397) Co-authored-by: timis1 --- .../baeldung/webflux/caching/ItemService.java | 18 ++++++++---------- .../caching/MonoFluxResultCachingLiveTest.java | 6 +++--- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/caching/ItemService.java b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/caching/ItemService.java index 7fc3732ba5..9bf934b504 100644 --- a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/caching/ItemService.java +++ b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/caching/ItemService.java @@ -1,22 +1,22 @@ package com.baeldung.webflux.caching; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; -import reactor.cache.CacheMono; + import reactor.core.publisher.Mono; @Service public class ItemService { private final ItemRepository repository; - private final LoadingCache cache; + private final LoadingCache> cache; public ItemService(ItemRepository repository) { this.repository = repository; - this.cache = Caffeine.newBuilder() - .build(this::getItem_withAddons); + this.cache = Caffeine.newBuilder().build(this::getItem_withCaffeine); } @Cacheable("items") @@ -34,9 +34,7 @@ public class ItemService { } @Cacheable("items") - public Mono getItem_withAddons(String id) { - return CacheMono.lookup(cache.asMap(), id) - .onCacheMissResume(() -> repository.findById(id).cast(Object.class)).cast(Item.class); + public Mono getItem_withCaffeine(String id) { + return cache.asMap().computeIfAbsent(id, k -> repository.findById(id).cast(Item.class)); } - } diff --git a/spring-5-webflux-2/src/test/java/com/baeldung/webflux/caching/MonoFluxResultCachingLiveTest.java b/spring-5-webflux-2/src/test/java/com/baeldung/webflux/caching/MonoFluxResultCachingLiveTest.java index 028a6d33a3..2075c1e77e 100644 --- a/spring-5-webflux-2/src/test/java/com/baeldung/webflux/caching/MonoFluxResultCachingLiveTest.java +++ b/spring-5-webflux-2/src/test/java/com/baeldung/webflux/caching/MonoFluxResultCachingLiveTest.java @@ -73,19 +73,19 @@ public void givenItem_whenGetItemIsCalled_thenMonoIsCached() { } @Test - public void givenItem_whenGetItemWithAddonsIsCalled_thenMonoResultIsCached() { + public void givenItem_whenGetItemWithCaffeineIsCalled_thenMonoResultIsCached() { Mono glass = itemService.save(new Item("glass", 1.00)); String id = glass.block().get_id(); - Mono mono = itemService.getItem_withAddons(id); + Mono mono = itemService.getItem_withCaffeine(id); Item item = mono.block(); assertThat(item).isNotNull(); assertThat(item.getName()).isEqualTo("glass"); assertThat(item.getPrice()).isEqualTo(1.00); - Mono mono2 = itemService.getItem_withAddons(id); + Mono mono2 = itemService.getItem_withCaffeine(id); Item item2 = mono2.block(); assertThat(item2).isNotNull(); From 98560f9d93522111a13c78ba69bbc3060c2ad0e8 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Thu, 2 Feb 2023 18:43:55 -0300 Subject: [PATCH 398/592] calling start() (#13417) --- .../java/com/baeldung/anonymousclass/AnonymousClassExample.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/anonymousclass/AnonymousClassExample.java b/core-java-modules/core-java/src/main/java/com/baeldung/anonymousclass/AnonymousClassExample.java index a58dbf9864..1ea85942ee 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/anonymousclass/AnonymousClassExample.java +++ b/core-java-modules/core-java/src/main/java/com/baeldung/anonymousclass/AnonymousClassExample.java @@ -9,5 +9,6 @@ public class AnonymousClassExample{ System.out.println("Thread: "+Thread.currentThread().getName()+" started"); } }); + t1.start(); } } \ No newline at end of file From 61cac1e1cca1566bfcecda20e8adde8eb49eade8 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 3 Feb 2023 10:27:34 +0530 Subject: [PATCH 399/592] Java 12714 eugen (#13358) * Java 12714 - Test build (#13191) * [JAVA-12714] Moved modules from default-first to jdk9-and-above profile * [JAVA-12714] Moved modules from default-second to jdk9-and-above profile * [JAVA-12714] Moved modules from default-heavy to jdk9-and-above profile * [JAVA-12714] Clean up - test build * [JAVA-12714] Clean up * [JAVA-12714] test build * [JAVA-12714] test build * [JAVA-12714] test build * [JAVA-12714] test build * [JAVA-12714] test build * [JAVA-12714] Clean up Co-authored-by: panagiotiskakos * Master to JAVA-12714-eugen (#13302) * Java 15029 (#13257) * [JAVA-15029] Formatting * [JAVA-15029] Clean up Co-authored-by: panagiotiskakos * Java 15030 (#13253) * [JAVA-15030] Upgrade to http client 5 * [JAVA-15030] Fixed MimeType test Co-authored-by: panagiotiskakos * Java 16961 (#13236) * [JAVA-16961] Moved code for article "Create an Empty Map in Java" * [JAVA-16961] Alter README.md * [JAVA-16961] Moved code for article "Sorting a Hashset in Java" * [JAVA-16961] Added links to README.md files * [JAVA-16961] Revert link changes * [JAVA-16961] Replaced junit4 with junit5 annotations * [JAVA-16961] test build * [JAVA-16961] Added junit annotations * [JAVA-16961] Added links Co-authored-by: panagiotiskakos * [List-CaseInsenContains] Case-Insensitive Searching in ArrayList (#13280) * Bael 5436 new (#13283) * BAEL-5777 - Mocking a singleton with Mockito * BAEL-5436 - Root mapping * Revert "BAEL-5777 - Mocking a singleton with Mockito" This reverts commit 358a061997a4b853e3215dea0217a070f0e391e4. * BAEL-5436 - Uncommenting controller * JAVA-15609 Changed to IntegrationTest to reproduce issue on Jenkins * BAEL-5959: Adjust code style (#13299) * BAEL-5959: Monad in Java * Fix test name * Fix code style * JAVA-16085, Potential issue in "A Guide to SAML with Spring Security" article (#13279) * JAVA-16085, Potential issue in "A Guide to SAML with Spring Security" article. * JAVA-16085, Cleanup unnecessary resources samlKeystore.jks and library maven-war-plugin. Co-authored-by: jogra * JAVA-15621, Potential issue in "Guide to UUID in Java" article. (#13271) * JAVA-15621, Potential issue in "Guide to UUID in Java" article. * JAVA-15621, Keep the raw strings in the article to make it easy for users to understand. * JAVA-15621, Keep the raw strings in the article to make it easy for users to understand. Co-authored-by: jogra * [JAVA-17295] Create and initialize ThreadPoolTaskExecutor (#13249) Co-authored-by: panagiotiskakos * [JAVA-15025] Upgraded to apache http 5 (#13296) * [JAVA-15025] Upgraded to apache http 5 * [JAVA-15025] Clean up Co-authored-by: panagiotiskakos * [JAVA-15016] Upgraded to apache http client 5.2 (#13269) * [JAVA-15016] Upgraded to apache http client 5.2 * [JAVA-15016] Clean up * [JAVA-15016] Junit 5 clean up Co-authored-by: panagiotiskakos Co-authored-by: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Co-authored-by: panagiotiskakos Co-authored-by: Kai Yuan Co-authored-by: Abhinav Pandey Co-authored-by: Anastasios Ioannidis Co-authored-by: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Co-authored-by: Thiago dos Santos Hora Co-authored-by: jsgrah-spring Co-authored-by: jogra * Update pom.xml * [JAVA-12714] Removed plugin from atomix module (#13342) * [JAVA-12714] Removed plugin from atomix module * [JAVA-12714] Removed compiler plugin * [JAVA-12714] Removed compiler plugin Co-authored-by: panagiotiskakos * JAVA-12714 Fixed conflicts * JAVA-12714 Temporarily disabling ItemsUnitTest * JAVA-12714 Removed Duplicate Classes --------- Co-authored-by: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Co-authored-by: panagiotiskakos Co-authored-by: Kai Yuan Co-authored-by: Abhinav Pandey Co-authored-by: Anastasios Ioannidis Co-authored-by: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Co-authored-by: Thiago dos Santos Hora Co-authored-by: jsgrah-spring Co-authored-by: jogra --- akka-modules/akka-http/pom.xml | 1 + annotations/annotation-processing/pom.xml | 1 + discord4j/pom.xml | 9 - feign/pom.xml | 1 - java-blockchain/pom.xml | 16 - java-websocket/pom.xml | 9 + javaxval-2/pom.xml | 3 - javaxval/pom.xml | 3 - .../baeldung/jersey/server/ItemsUnitTest.java | 4 + jgit/pom.xml | 1 + libraries-server-2/pom.xml | 4 + mapstruct/pom.xml | 5 - pom.xml | 628 +++++++++--------- spring-di/pom.xml | 4 + spring-exceptions/pom.xml | 4 + spring-katharsis/pom.xml | 4 + spring-mobile/pom.xml | 9 + spring-native/pom.xml | 3 - vaadin/pom.xml | 6 +- 19 files changed, 369 insertions(+), 346 deletions(-) diff --git a/akka-modules/akka-http/pom.xml b/akka-modules/akka-http/pom.xml index 9372107fc9..3af7c492ca 100644 --- a/akka-modules/akka-http/pom.xml +++ b/akka-modules/akka-http/pom.xml @@ -36,6 +36,7 @@ + 10.0.11 2.5.11 diff --git a/annotations/annotation-processing/pom.xml b/annotations/annotation-processing/pom.xml index 14bbc409e5..2a17242ee5 100644 --- a/annotations/annotation-processing/pom.xml +++ b/annotations/annotation-processing/pom.xml @@ -21,6 +21,7 @@ + 1.0-rc2 diff --git a/discord4j/pom.xml b/discord4j/pom.xml index e15bd47583..3ea85c05c7 100644 --- a/discord4j/pom.xml +++ b/discord4j/pom.xml @@ -53,19 +53,10 @@ org.springframework.boot spring-boot-maven-plugin - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - 1.8 3.1.1 diff --git a/feign/pom.xml b/feign/pom.xml index 369fa00137..3ac816fc1d 100644 --- a/feign/pom.xml +++ b/feign/pom.xml @@ -116,7 +116,6 @@ - 1.8 11.8 1.6.3 diff --git a/java-blockchain/pom.xml b/java-blockchain/pom.xml index 6d3910df80..2279a7ceff 100644 --- a/java-blockchain/pom.xml +++ b/java-blockchain/pom.xml @@ -24,22 +24,6 @@ true - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${maven.compiler.source} - ${maven.compiler.target} - - - - - 1.8 - 1.8 - - \ No newline at end of file diff --git a/java-websocket/pom.xml b/java-websocket/pom.xml index ffc2b0631e..7c3f32b092 100644 --- a/java-websocket/pom.xml +++ b/java-websocket/pom.xml @@ -28,6 +28,15 @@ + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 1.1 2.8.0 diff --git a/javaxval-2/pom.xml b/javaxval-2/pom.xml index a63d21969b..5c311e10f8 100644 --- a/javaxval-2/pom.xml +++ b/javaxval-2/pom.xml @@ -60,9 +60,6 @@ 6.2.3.Final 6.2.0.Final - 3.6.1 - 1.8 - 1.8 3.0.0 5.3.21 2.7.1 diff --git a/javaxval/pom.xml b/javaxval/pom.xml index 753a46cffe..76472e29fb 100644 --- a/javaxval/pom.xml +++ b/javaxval/pom.xml @@ -60,9 +60,6 @@ 6.2.3.Final 6.2.0.Final - 3.6.1 - 1.8 - 1.8 3.0.0 5.3.21 2.7.1 diff --git a/jersey/src/test/java/com/baeldung/jersey/server/ItemsUnitTest.java b/jersey/src/test/java/com/baeldung/jersey/server/ItemsUnitTest.java index df85e26b76..b158d63720 100644 --- a/jersey/src/test/java/com/baeldung/jersey/server/ItemsUnitTest.java +++ b/jersey/src/test/java/com/baeldung/jersey/server/ItemsUnitTest.java @@ -9,10 +9,14 @@ import org.glassfish.grizzly.http.server.HttpServer; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; +import org.junit.jupiter.api.Disabled; import com.baeldung.jersey.server.http.EmbeddedHttpServer; +@Disabled +@Ignore public class ItemsUnitTest { private HttpServer server; diff --git a/jgit/pom.xml b/jgit/pom.xml index ca58709583..91881fbec8 100644 --- a/jgit/pom.xml +++ b/jgit/pom.xml @@ -36,6 +36,7 @@ + 4.5.0.201609210915-r diff --git a/libraries-server-2/pom.xml b/libraries-server-2/pom.xml index 7377fa3fa9..359954a6d2 100644 --- a/libraries-server-2/pom.xml +++ b/libraries-server-2/pom.xml @@ -34,6 +34,10 @@ + + org.apache.maven.plugins + maven-compiler-plugin + org.eclipse.jetty jetty-maven-plugin diff --git a/mapstruct/pom.xml b/mapstruct/pom.xml index cdcbc798a4..62c9ca5870 100644 --- a/mapstruct/pom.xml +++ b/mapstruct/pom.xml @@ -49,10 +49,7 @@ org.apache.maven.plugins maven-compiler-plugin - ${maven-compiler-plugin.version} - ${maven.compiler.source} - ${maven.compiler.target} org.mapstruct @@ -78,8 +75,6 @@ 1.5.3.Final 4.3.4.RELEASE - 1.8 - 1.8 0.2.0 diff --git a/pom.xml b/pom.xml index 0b19c6eee6..77eb94f035 100644 --- a/pom.xml +++ b/pom.xml @@ -330,161 +330,104 @@ parent-spring-5 parent-java - akka-modules - algorithms-modules - annotations - antlr apache-cxf-modules - apache-kafka - apache-kafka-2 apache-libraries - apache-olingo apache-poi - apache-poi-2 - apache-rocketmq - apache-thrift - apache-tika apache-velocity - + di-modules asciidoctor - asm - - atomix aws-modules - axon - azure - - bazel checker-plugin - code-generation core-groovy-modules - core-java-modules - couchbase custom-pmd - data-structures - ddd deeplearning4j - di-modules - discord4j - disruptor - dozer drools - dubbo + - feign - + geotools - google-cloud + gradle-modules/gradle/maven-to-gradle - graphql-modules - grpc + guava-modules - hazelcast apache-httpclient httpclient-simple - hystrix + jackson-modules - jackson-simple - java-blockchain + javafx java-jdi - java-rmi - java-spi java-websocket - javax-sound - javaxval - javaxval-2 - javax-validation-advanced + jaxb jersey - jgit jhipster-5 - jib jmeter jmh - java-native + jsf json-modules - jsoup + kubernetes-modules - ksqldb + language-interop libraries-2 libraries-3 - libraries-7 - - libraries-apache-commons - libraries-apache-commons-collections - libraries-apache-commons-io libraries-data - libraries-data-2 + + libraries-data-db - libraries-data-io - libraries-files - libraries-http - libraries-http-2 - libraries-io - libraries-primitive - libraries-rpc libraries-security - libraries-server libraries-server-2 libraries-testing logging-modules lombok-modules - lucene - mapstruct maven-modules - mesos-marathon messaging-modules - metrics + microservices-modules muleesb - mustache - mybatis + netflix-modules - orika osgi + orika patterns-modules - pdf - pdf-2 + performance-tests persistence-modules - protobuffer + quarkus-modules - reactor-core - rsocket rule-engines-modules rxjava-modules - atomikos + reactive-systems security-modules - slack + vavr-modules web-modules @@ -533,93 +476,51 @@ saas-modules server-modules - spf4j - spring-4 - - spring-5 spring-reactive-modules - spring-5-webflux - spring-5-webflux-2 - - spring-activiti spring-aop spring-aop-2 - spring-batch - spring-batch-2 spring-bom spring-boot-modules spring-boot-rest - spring-caching - spring-caching-2 - spring-cloud-modules - spring-core - spring-core-2 - spring-core-3 spring-core-4 - spring-core-5 - spring-credhub - spring-cucumber - spring-di spring-di-2 - spring-di-3 spring-drools - spring-ejb-modules + spring-exceptions - spring-integration - spring-jenkins-pipeline spring-jersey spring-jinq - - spring-kafka spring-katharsis - spring-mobile - spring-native - spring-protobuf - spring-quartz - spring-remoting-modules + - spring-scheduling spring-security-modules spring-shell spring-soap spring-spel - spring-state-machine spring-static-resources spring-swagger-codegen - - spring-threads - spring-vault - spring-web-modules spring-websockets - static-analysis - - tensorflow-java testing-modules - vertx-modules video-tutorials - - webrtc xml xml-2 - xstream @@ -674,7 +575,6 @@ libraries-4 libraries-5 libraries-6 - spring-boot-modules/spring-boot-react spring-ejb-modules/ejb-beans @@ -715,161 +615,104 @@ parent-spring-5 parent-java - akka-modules - algorithms-modules - annotations - antlr apache-cxf-modules - apache-kafka - apache-kafka-2 apache-libraries - apache-olingo apache-poi - apache-poi-2 - apache-rocketmq - apache-thrift - apache-tika apache-velocity - + di-modules asciidoctor - asm - - atomix aws-modules - axon - azure - - bazel checker-plugin - code-generation core-groovy-modules - core-java-modules - couchbase custom-pmd - data-structures - ddd deeplearning4j - di-modules - discord4j - disruptor - dozer drools - dubbo + - feign - + geotools - google-cloud + gradle-modules/gradle/maven-to-gradle - graphql-modules - grpc + guava-modules - hazelcast apache-httpclient httpclient-simple - hystrix + jackson-modules - jackson-simple - java-blockchain + javafx java-jdi - java-rmi - java-spi java-websocket - javax-sound - javaxval - javaxval-2 - javax-validation-advanced + jaxb jersey - jgit jhipster-5 - jib jmeter jmh - java-native + jsf json-modules - jsoup + kubernetes-modules - ksqldb + language-interop libraries-2 libraries-3 - libraries-7 - - libraries-apache-commons - libraries-apache-commons-collections - libraries-apache-commons-io libraries-data - libraries-data-2 + + libraries-data-db - libraries-data-io - libraries-files - libraries-http - libraries-http-2 - libraries-io - libraries-primitive - libraries-rpc libraries-security - libraries-server libraries-server-2 libraries-testing logging-modules lombok-modules - lucene - mapstruct maven-modules - mesos-marathon messaging-modules - metrics + microservices-modules muleesb - mustache - mybatis + netflix-modules - orika osgi + orika patterns-modules - pdf - pdf-2 + performance-tests persistence-modules - protobuffer + quarkus-modules - reactor-core - rsocket rule-engines-modules rxjava-modules - atomikos + reactive-systems security-modules - slack + vavr-modules web-modules @@ -910,94 +753,50 @@ saas-modules server-modules - spf4j - spring-4 - - spring-5 spring-reactive-modules - spring-5-webflux - spring-5-webflux-2 - - - spring-activiti spring-aop spring-aop-2 - spring-batch - spring-batch-2 spring-bom spring-boot-modules spring-boot-rest - spring-caching - spring-caching-2 - spring-cloud-modules - spring-core - spring-core-2 - spring-core-3 spring-core-4 - spring-core-5 - spring-credhub - spring-cucumber - spring-di spring-di-2 - spring-di-3 spring-drools - spring-ejb-modules spring-exceptions - spring-integration - spring-jenkins-pipeline spring-jersey spring-jinq - - spring-kafka spring-katharsis - spring-mobile - spring-native - spring-protobuf - spring-quartz - spring-remoting-modules + - spring-scheduling spring-security-modules spring-shell spring-soap spring-spel - spring-state-machine spring-static-resources spring-swagger-codegen - - spring-threads - spring-vault - spring-web-modules spring-websockets - static-analysis - - tensorflow-java testing-modules - vertx-modules video-tutorials - - webrtc xml xml-2 - xstream @@ -1044,12 +843,10 @@ libraries-4 libraries-5 libraries-6 - spring-boot-modules/spring-boot-react spring-ejb-modules/ejb-beans - vaadin - vavr-modules + vavr-modules @@ -1119,64 +916,173 @@ core-java-modules/core-java-9-improvements core-java-modules/core-java-9-jigsaw - core-java-modules/core-java-9-streams - core-java-modules/core-java-10 - core-java-modules/core-java-11 - core-java-modules/core-java-11-2 - core-java-modules/core-java-11-3 - - - - - - - - core-java-modules/core-java-collections-set - core-java-modules/core-java-collections-list-4 - core-java-modules/core-java-collections-array-list - core-java-modules/core-java-collections-maps-4 - core-java-modules/core-java-collections-maps-5 - core-java-modules/core-java-concurrency-simple - core-java-modules/core-java-date-operations-1 - core-java-modules/core-java-datetime-conversion - core-java-modules/core-java-datetime-string - core-java-modules/core-java-io-conversions-2 - core-java-modules/core-java-jpms - core-java-modules/core-java-os - core-java-modules/core-java-streams-4 - core-java-modules/core-java-string-algorithms-3 - core-java-modules/core-java-string-operations-3 - core-java-modules/core-java-string-operations-4 - core-java-modules/core-java-string-operations-5 - core-java-modules/core-java-time-measurements - core-java-modules/core-java-networking-3 - core-java-modules/core-java-strings - core-java-modules/core-java-httpclient - spring-core-6 - ddd-contexts - docker-modules - apache-httpclient-2 - kubernetes-modules/kubernetes-spring - libraries-concurrency - maven-modules/compiler-plugin-java-9 - maven-modules/maven-generate-war - maven-modules/multimodulemavenproject - optaplanner - persistence-modules/sirix - persistence-modules/spring-data-cassandra-2 - quarkus-modules/quarkus-vs-springboot - quarkus-modules/quarkus-jandex - spring-boot-modules/spring-boot-cassandre - spring-boot-modules/spring-boot-camel - spring-boot-modules/spring-boot-3 - spring-boot-modules/spring-boot-3-native + core-java-modules/core-java-9-streams + core-java-modules/core-java-10 + core-java-modules/core-java-11 + core-java-modules/core-java-11-2 + core-java-modules/core-java-11-3 + + + + + + + + core-java-modules/core-java-collections-set + core-java-modules/core-java-collections-list-4 + core-java-modules/core-java-collections-array-list + core-java-modules/core-java-collections-maps-4 + core-java-modules/core-java-collections-maps-5 + core-java-modules/core-java-concurrency-simple + core-java-modules/core-java-date-operations-1 + core-java-modules/core-java-datetime-conversion + core-java-modules/core-java-datetime-string + core-java-modules/core-java-io-conversions-2 + core-java-modules/core-java-jpms + core-java-modules/core-java-os + core-java-modules/core-java-streams-4 + core-java-modules/core-java-string-algorithms-3 + core-java-modules/core-java-string-operations-3 + core-java-modules/core-java-string-operations-4 + core-java-modules/core-java-string-operations-5 + core-java-modules/core-java-time-measurements + core-java-modules/core-java-networking-3 + core-java-modules/core-java-strings + core-java-modules/core-java-httpclient + spring-core-6 + ddd-contexts + docker-modules + apache-httpclient-2 + kubernetes-modules/kubernetes-spring + libraries-concurrency + maven-modules/compiler-plugin-java-9 + maven-modules/maven-generate-war + maven-modules/multimodulemavenproject + optaplanner + persistence-modules/sirix + persistence-modules/spring-data-cassandra-2 + quarkus-modules/quarkus-vs-springboot + quarkus-modules/quarkus-jandex + spring-boot-modules/spring-boot-cassandre + spring-boot-modules/spring-boot-camel + spring-boot-modules/spring-boot-3 + spring-boot-modules/spring-boot-3-native spring-boot-modules/spring-boot-3-observation - spring-swagger-codegen/custom-validations-opeanpi-codegen - testing-modules/testing-assertions - persistence-modules/fauna - lightrun - tablesaw + spring-swagger-codegen/custom-validations-opeanpi-codegen + testing-modules/testing-assertions + persistence-modules/fauna + lightrun + tablesaw + + + + akka-modules + annotations + apache-httpclient + antlr + apache-kafka + apache-kafka-2 + apache-olingo + + apache-poi-2 + apache-rocketmq + apache-thrift + apache-tika + + asm + atomikos + atomix + axon + + bazel + code-generation + ddd + discord4j + disruptor + dozer + dubbo + feign + google-cloud + graphql-modules + grpc + hazelcast + hystrix + jackson-simple + java-blockchain + + java-rmi + java-spi + javax-sound + javaxval + javaxval-2 + javax-validation-advanced + jgit + jib + + java-native + jsoup + ksqldb + libraries-7 + libraries-apache-commons + libraries-apache-commons-collections + libraries-apache-commons-io + libraries-data-2 + libraries-data-io + libraries-files + libraries-http + libraries-http-2 + libraries-io + libraries-primitive + libraries-rpc + libraries-server + + lucene + mapstruct + mesos-marathon + metrics + mustache + mybatis + pdf + pdf-2 + protobuffer + reactor-core + rsocket + slack + + + + spring-5 + spring-5-webflux + spring-5-webflux-2 + spring-activiti + spring-batch-2 + spring-caching-2 + spring-core-2 + spring-core-3 + spring-core-5 + spring-di-3 + spring-cucumber + + spring-kafka + + spring-native + spring-protobuf + spring-quartz + + spring-scheduling + + spring-state-machine + spring-threads + tensorflow-java + xstream + webrtc + + + UTF-8 + 11 + 11 + @@ -1217,8 +1123,10 @@ + core-java-modules/core-java-collections-set core-java-modules/core-java-collections-list-4 + core-java-modules/core-java-collections-array-list core-java-modules/core-java-collections-maps-4 core-java-modules/core-java-collections-maps-5 core-java-modules/core-java-concurrency-simple @@ -1237,6 +1145,7 @@ core-java-modules/core-java-networking-3 core-java-modules/core-java-strings core-java-modules/core-java-httpclient + spring-core-6 ddd-contexts docker-modules apache-httpclient-2 @@ -1259,9 +1168,120 @@ testing-modules/testing-assertions persistence-modules/fauna lightrun - spring-core-6 tablesaw + + + + akka-modules + annotations + apache-httpclient + antlr + apache-kafka + apache-kafka-2 + apache-olingo + + apache-poi-2 + apache-rocketmq + apache-thrift + apache-tika + + asm + atomikos + atomix + axon + + bazel + code-generation + ddd + discord4j + disruptor + dozer + + dubbo + feign + google-cloud + graphql-modules + grpc + hazelcast + hystrix + jackson-simple + java-blockchain + + java-rmi + java-spi + javax-sound + javaxval + javaxval-2 + javax-validation-advanced + jgit + jib + + java-native + jsoup + ksqldb + + libraries-7 + libraries-apache-commons + libraries-apache-commons-collections + libraries-apache-commons-io + libraries-data-2 + libraries-data-io + libraries-files + libraries-http + libraries-http-2 + libraries-io + libraries-primitive + libraries-rpc + libraries-server + + lucene + mapstruct + mesos-marathon + metrics + mustache + mybatis + pdf + pdf-2 + protobuffer + reactor-core + rsocket + slack + + + + + spring-5 + spring-5-webflux + spring-5-webflux-2 + spring-activiti + spring-batch-2 + spring-caching-2 + spring-core-2 + spring-core-3 + spring-core-5 + spring-di-3 + spring-cucumber + + spring-kafka + + spring-native + spring-protobuf + spring-quartz + + spring-scheduling + + spring-state-machine + spring-threads + tensorflow-java + xstream + webrtc + + + UTF-8 + 11 + 11 + diff --git a/spring-di/pom.xml b/spring-di/pom.xml index af0601deb6..9d2a260a06 100644 --- a/spring-di/pom.xml +++ b/spring-di/pom.xml @@ -111,6 +111,10 @@ + + org.apache.maven.plugins + maven-compiler-plugin + org.apache.maven.plugins maven-war-plugin diff --git a/spring-exceptions/pom.xml b/spring-exceptions/pom.xml index 0621009bdd..6d573b6813 100644 --- a/spring-exceptions/pom.xml +++ b/spring-exceptions/pom.xml @@ -144,6 +144,10 @@ + + org.apache.maven.plugins + maven-compiler-plugin + org.apache.maven.plugins maven-war-plugin diff --git a/spring-katharsis/pom.xml b/spring-katharsis/pom.xml index b836a42bca..2fcc87e2dd 100644 --- a/spring-katharsis/pom.xml +++ b/spring-katharsis/pom.xml @@ -55,6 +55,10 @@ + + org.apache.maven.plugins + maven-compiler-plugin + org.codehaus.cargo cargo-maven2-plugin diff --git a/spring-mobile/pom.xml b/spring-mobile/pom.xml index 7f715c8735..bac1d2cdc9 100644 --- a/spring-mobile/pom.xml +++ b/spring-mobile/pom.xml @@ -32,6 +32,15 @@ + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + 1.1.5.RELEASE diff --git a/spring-native/pom.xml b/spring-native/pom.xml index 6940ee462b..55f17c833f 100644 --- a/spring-native/pom.xml +++ b/spring-native/pom.xml @@ -72,9 +72,6 @@ paketobuildpacks/builder:tiny 2.7.1 0.12.1 - 1.8 - 1.8 - 1.8 2.17.1 diff --git a/vaadin/pom.xml b/vaadin/pom.xml index 6976ff2a6a..82963f9e7f 100644 --- a/vaadin/pom.xml +++ b/vaadin/pom.xml @@ -76,6 +76,10 @@ + + org.apache.maven.plugins + maven-compiler-plugin + org.apache.maven.plugins maven-war-plugin @@ -184,8 +188,6 @@ 8.8.5 8.8.5 9.3.9.v20160517 - 1.8 - 1.8 local mytheme 3.0.0 From bf69ecf4bd99397524448d2bfcb0c3e189cbb99c Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Fri, 3 Feb 2023 18:22:38 +0200 Subject: [PATCH 400/592] JAVA-17762 Align module names, folder names and artifact id - Week 6 - 2023 (#13411) Co-authored-by: timis1 --- kubernetes-modules/kubernetes-spring/pom.xml | 7 +++---- .../spring-cloud-archaius-additionalsources/pom.xml | 2 +- spring-kafka-2/pom.xml | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/kubernetes-modules/kubernetes-spring/pom.xml b/kubernetes-modules/kubernetes-spring/pom.xml index 01064fa384..05532ab0b0 100644 --- a/kubernetes-modules/kubernetes-spring/pom.xml +++ b/kubernetes-modules/kubernetes-spring/pom.xml @@ -3,11 +3,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.example - demo + kubernetes-spring 0.0.1-SNAPSHOT - demo - Demo project for Spring Boot + kubernetes-spring + Intro to Kubernetes with Spring boot com.baeldung diff --git a/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/pom.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/pom.xml index f523e79bac..eee751b6a4 100644 --- a/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/pom.xml +++ b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-additionalsources/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-cloud-archaius-additional-sources-simple + spring-cloud-archaius-additionalsources 1.0.0-SNAPSHOT spring-cloud-archaius-additionalsources jar diff --git a/spring-kafka-2/pom.xml b/spring-kafka-2/pom.xml index d51c2e300f..76a82f6000 100644 --- a/spring-kafka-2/pom.xml +++ b/spring-kafka-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 - spring-kafka - spring-kafka + spring-kafka-2 + spring-kafka-2 Intro to Kafka with Spring From 456ff7d02948513e9dba23d63ba6ca7db955ee72 Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Date: Fri, 3 Feb 2023 19:47:48 +0200 Subject: [PATCH 401/592] JAVA-15980 Upgrade AWS Kinesis (#13294) * JAVA-15980 Upgrade AWS Kinesis * JAVA-15980 Minor readability improvement --- .../spring-cloud-stream-kinesis/pom.xml | 8 ++-- .../com/baeldung/binder/ConsumerBinder.java | 22 +++++------ .../binder/KinesisBinderApplication.java | 6 +-- .../com/baeldung/binder/ProducerBinder.java | 26 ++++++------- .../kclkpl/KinesisKCLApplication.java | 39 ++++++++++--------- .../kclkpl/KinesisKPLApplication.java | 17 ++++---- .../src/main/resources/application.properties | 12 +++--- .../src/test/resources/application.properties | 12 +++--- 8 files changed, 71 insertions(+), 71 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml index 397f06399f..9d0d91b2c0 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml @@ -36,7 +36,7 @@ com.amazonaws amazon-kinesis-client - 1.11.2 + 1.14.9 org.springframework.cloud @@ -46,9 +46,9 @@ - 1.11.632 - 2.0.2.RELEASE - 2.2.1.RELEASE + 1.12.380 + 2.2.0 + 4.0.0 \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/ConsumerBinder.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/ConsumerBinder.java index 38ad634086..1fedec83ad 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/ConsumerBinder.java +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/ConsumerBinder.java @@ -1,16 +1,16 @@ package com.baeldung.binder; -import org.springframework.cloud.stream.annotation.EnableBinding; -import org.springframework.cloud.stream.annotation.StreamListener; -import org.springframework.cloud.stream.messaging.Sink; -import org.springframework.stereotype.Component; +import java.util.function.Consumer; -@Component -@EnableBinding(Sink.class) +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration public class ConsumerBinder { - - @StreamListener(Sink.INPUT) - public void consume(String ip) { - System.out.println(ip); - } + @Bean + Consumer input() { + return str -> { + System.out.println(str); + }; + } } \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/KinesisBinderApplication.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/KinesisBinderApplication.java index e4f6916ed9..1cf31f9928 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/KinesisBinderApplication.java +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/KinesisBinderApplication.java @@ -6,7 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class KinesisBinderApplication { - public static void main(String[] args) { - SpringApplication.run(KinesisBinderApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(KinesisBinderApplication.class, args); + } } \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/ProducerBinder.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/ProducerBinder.java index 468f2886de..1486459a1e 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/ProducerBinder.java +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/binder/ProducerBinder.java @@ -1,24 +1,20 @@ package com.baeldung.binder; +import java.util.function.Supplier; import java.util.stream.IntStream; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.stream.annotation.EnableBinding; -import org.springframework.cloud.stream.messaging.Source; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import org.springframework.messaging.support.MessageBuilder; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; -@Component -@EnableBinding(Source.class) -public class ProducerBinder { +@Configuration +class ProducerBinder { - @Autowired - private Source source; - - @Scheduled(fixedDelay = 3000L) - private void produce() { - IntStream.range(1, 200).mapToObj(ipSuffix -> "192.168.0." + ipSuffix) - .forEach(entry -> source.output().send(MessageBuilder.withPayload(entry).build())); + @Bean + public Supplier output() { + return () -> IntStream.range(1, 200) + .mapToObj(ipSuffix -> "192.168.0." + ipSuffix) + .map(entry -> MessageBuilder.withPayload(entry) + .build()); } } \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/KinesisKCLApplication.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/KinesisKCLApplication.java index 01c5af596d..1ab205d3aa 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/KinesisKCLApplication.java +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/KinesisKCLApplication.java @@ -1,11 +1,14 @@ package com.baeldung.kclkpl; +import static com.amazonaws.services.kinesis.clientlibrary.lib.worker.KinesisClientLibConfiguration.*; + import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.regions.Regions; @@ -17,32 +20,30 @@ public class KinesisKCLApplication implements ApplicationRunner { @Value("${aws.access.key}") private String accessKey; - + @Value("${aws.secret.key}") private String secretKey; - + @Value("${ips.stream}") private String IPS_STREAM; - + public static void main(String[] args) { SpringApplication.run(KinesisKCLApplication.class, args); } - @Override - public void run(ApplicationArguments args) throws Exception { - BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey); - KinesisClientLibConfiguration consumerConfig = new KinesisClientLibConfiguration( - "KinesisKCLConsumer", - IPS_STREAM, - new AWSStaticCredentialsProvider(awsCredentials), - "KinesisKCLConsumer") - .withRegionName(Regions.EU_CENTRAL_1.getName()); + @Override + public void run(ApplicationArguments args) throws Exception { + BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey); - new Worker.Builder() - .recordProcessorFactory(new IpProcessorFactory()) - .config(consumerConfig) - .build() - .run(); - } - + KinesisClientLibConfiguration consumerConfig = new KinesisClientLibConfiguration("KinesisKCLConsumer", IPS_STREAM, "", "", DEFAULT_INITIAL_POSITION_IN_STREAM, new AWSStaticCredentialsProvider(awsCredentials), + new AWSStaticCredentialsProvider(awsCredentials), new AWSStaticCredentialsProvider(awsCredentials), DEFAULT_FAILOVER_TIME_MILLIS, "KinesisKCLConsumer", DEFAULT_MAX_RECORDS, DEFAULT_IDLETIME_BETWEEN_READS_MILLIS, + DEFAULT_DONT_CALL_PROCESS_RECORDS_FOR_EMPTY_RECORD_LIST, DEFAULT_PARENT_SHARD_POLL_INTERVAL_MILLIS, DEFAULT_SHARD_SYNC_INTERVAL_MILLIS, DEFAULT_CLEANUP_LEASES_UPON_SHARDS_COMPLETION, new ClientConfiguration(), new ClientConfiguration(), + new ClientConfiguration(), DEFAULT_TASK_BACKOFF_TIME_MILLIS, DEFAULT_METRICS_BUFFER_TIME_MILLIS, DEFAULT_METRICS_MAX_QUEUE_SIZE, DEFAULT_VALIDATE_SEQUENCE_NUMBER_BEFORE_CHECKPOINTING, Regions.EU_CENTRAL_1.getName(), DEFAULT_SHUTDOWN_GRACE_MILLIS, + DEFAULT_DDB_BILLING_MODE, null, 0, 0, 0); + + new Worker.Builder().recordProcessorFactory(new IpProcessorFactory()) + .config(consumerConfig) + .build() + .run(); + } } \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/KinesisKPLApplication.java b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/KinesisKPLApplication.java index 4ff7cf8087..1b2d9bed3f 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/KinesisKPLApplication.java +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/kclkpl/KinesisKPLApplication.java @@ -16,23 +16,22 @@ public class KinesisKPLApplication { @Value("${aws.access.key}") private String accessKey; - + @Value("${aws.secret.key}") private String secretKey; - + public static void main(String[] args) { SpringApplication.run(KinesisKPLApplication.class, args); } @Bean public KinesisProducer kinesisProducer() { - BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey); - KinesisProducerConfiguration producerConfig = new KinesisProducerConfiguration() - .setCredentialsProvider(new AWSStaticCredentialsProvider(awsCredentials)) - .setVerifyCertificate(false) - .setRegion(Regions.EU_CENTRAL_1.getName()); + BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey); + KinesisProducerConfiguration producerConfig = new KinesisProducerConfiguration().setCredentialsProvider(new AWSStaticCredentialsProvider(awsCredentials)) + .setVerifyCertificate(false) + .setRegion(Regions.EU_CENTRAL_1.getName()); - return new KinesisProducer(producerConfig); + return new KinesisProducer(producerConfig); } - + } \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties index 777abef1cc..fddea95d45 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties @@ -12,9 +12,11 @@ cloud.aws.credentials.secret-key=my-aws-secret-key cloud.aws.region.static=eu-central-1 cloud.aws.stack.auto=false -spring.cloud.stream.bindings.input.destination=live-ips -spring.cloud.stream.bindings.input.group=live-ips-group -spring.cloud.stream.bindings.input.content-type=text/plain +spring.cloud.stream.bindings.input-in-0.destination=live-ips +spring.cloud.stream.bindings.input-in-0.group=live-ips-group +spring.cloud.stream.bindings.input-in-0.content-type=text/plain +spring.cloud.stream.function.definition = input -spring.cloud.stream.bindings.output.destination=myStream -spring.cloud.stream.bindings.output.content-type=text/plain \ No newline at end of file +spring.cloud.stream.bindings.output-out-0.destination=myStream +spring.cloud.stream.bindings.output-out-0.content-type=text/plain +spring.cloud.stream.poller.fixed-delay = 3000 \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties index 777abef1cc..fddea95d45 100644 --- a/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties +++ b/spring-cloud-modules/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties @@ -12,9 +12,11 @@ cloud.aws.credentials.secret-key=my-aws-secret-key cloud.aws.region.static=eu-central-1 cloud.aws.stack.auto=false -spring.cloud.stream.bindings.input.destination=live-ips -spring.cloud.stream.bindings.input.group=live-ips-group -spring.cloud.stream.bindings.input.content-type=text/plain +spring.cloud.stream.bindings.input-in-0.destination=live-ips +spring.cloud.stream.bindings.input-in-0.group=live-ips-group +spring.cloud.stream.bindings.input-in-0.content-type=text/plain +spring.cloud.stream.function.definition = input -spring.cloud.stream.bindings.output.destination=myStream -spring.cloud.stream.bindings.output.content-type=text/plain \ No newline at end of file +spring.cloud.stream.bindings.output-out-0.destination=myStream +spring.cloud.stream.bindings.output-out-0.content-type=text/plain +spring.cloud.stream.poller.fixed-delay = 3000 \ No newline at end of file From 622971e5b800d32bd155e0b6c6ac1a0473149893 Mon Sep 17 00:00:00 2001 From: jsgrah-spring Date: Fri, 3 Feb 2023 18:49:23 +0100 Subject: [PATCH 402/592] Generate the firebase-service-account.json file, add file to class-path and make application run again. (#13337) * JAVA-16938, Fix gcp-firebase module. * JAVA-16938, Add the firebase-service-account.json file to the classpath. --------- Co-authored-by: jogra --- .../src/main/resources/application.properties | 4 ++-- .../src/main/resources/firebase-service-account.json | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 gcp-firebase/src/main/resources/firebase-service-account.json diff --git a/gcp-firebase/src/main/resources/application.properties b/gcp-firebase/src/main/resources/application.properties index aacbde0d92..494aeb2444 100644 --- a/gcp-firebase/src/main/resources/application.properties +++ b/gcp-firebase/src/main/resources/application.properties @@ -1,2 +1,2 @@ -# Service account location. Can be a filesystem path or a classpath resource -gcp.firebase.service-account=file:firebase-service-account.json \ No newline at end of file +# Service account location. Can be a filesystem path or a classpath resource. NB: Generate and use your own firebase-service-account.json file. +gcp.firebase.service-account=classpath:firebase-service-account.json \ No newline at end of file diff --git a/gcp-firebase/src/main/resources/firebase-service-account.json b/gcp-firebase/src/main/resources/firebase-service-account.json new file mode 100644 index 0000000000..ed5afa9f13 --- /dev/null +++ b/gcp-firebase/src/main/resources/firebase-service-account.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "tutorials-2cdfb", + "private_key_id": "d9f6a684d6814f85ed2d0490585eb7bf590f983a", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDdJWTeGT2eBFo+\nXxzT9xFJYPtyawTAj0K1rVUNlWNUwj3zszK6P2sAsrpI2Rz1klwQ9aDz9i3+Opxv\n7UZ3pOzur6S58JnoswtNs6BZ9P7oeggLJJC6MPjioxwh8jLLIGMgdVtC2/iPYW3r\nGzurWlwkM8M8DyCgNq7KKJcx44pGcyy16ZGCYiijuTEmK6R+WHJTTyICzRFu3Org\nuHGlZUs/G4E76p10HanoFX2AIS/fDEEMP2DXBB73yoCal5GuvMY9yZWxnvV65Y5z\nGveY3NDB9EESbO2AAhDvHekWT17uWhymtO5N3gM8da48J9d51tVzi0D/NIPZnF0u\nTS64uxK3AgMBAAECggEAYuEQa7oPcfLyQscWRbRH1250n2E4e7zSkBcTW4J7Km+7\ncZajTOGEP4iqgF4Lc8XgQnkBYXOmdvDP97+47VAh3EtOtRDeUEyV9kUlonNH8rx1\nkj3kNEwnTHav4oG/slEl4WJ3zro6NinTEvdXQ7OgVVOLrPP6m4g3uQ5TJCxgLEUI\nTd3Hs3cg3P71mzEqfBF4NmGVmC1ea5lXFELd6giJJMvL7g+O2w22/fquGWOrreAM\ncj/G2Xv9/vmzeb9yzbgGxqCJyY6vspmd90fQLUu7bxkEY5/PPc6Zk8qay4AdEn47\nkL6hnJiR8H1wMCzV2RTUKE7ospriNVdBilXgxm9IMQKBgQD1TmF0Bg85zvXmEKBa\nLBhbc3xTtM7DOgKs+pI12sYDKwgL/QKEI/TKkYXua0aVGiQWc2Bk2/0sYhO6aB2f\n6AN1ZUrf4PRM8c53jebChc7beVLSjWI8Tx+kE+0t8864OwvELYZUzP35oSx3RdJD\nE/CvqBM7NQfJwx2Mw2VJK/YRGQKBgQDmyWLm/IWitehkITw6xMQpkkFs2m4Joq3A\nJvAyri58TRkw/7rqWaIxb5Wcy/7BOvjDN8PZNTHh4ZvhQiHpn7NGUks2/ULnWxUB\nWAA9YbeO9PNHJfZ6PjD2FSvwOXHj+vVkWt2GCXT8pDGYM2ImqXon85Oe3OH/h+N5\nktO9taesTwKBgQCSdPGKK/P7N61oZpTWQW1pbFHWSCUKOiBO1mtk6/E9AvwS7EQM\nUMteBfRInJPPgYP6Q3hRv2YwkX3l1TOavRMTjB5f/BbfuZ7jkj0r9mfCcXUZcIAu\nMa9abus0fFP3eolT3zpMdvdLiwbZTz5x/f29YkPZHZhAxdVmrWJThYOsQQKBgBDu\nZVsc25D8V3hBF/IXzWxfVn1t6PS8ApM+SBDvxmlIHrkBiez3dna6APfn32C9utJX\nnP6qcGZp7s2v1F0XYkeecfYuzmG6xOe8VQgryxOp1M87ccG2HlFvbDHLhRd8qdQa\n9nWG7BY81Yac/m5nsJaNwB6/hbUBeybIJtCcKxjxAoGBAJ3y+QSFb4AYmxLFtmMA\nklOvlT+r70w4RV/z4SEO1gjWEh9IozNSXknl5Q/8Zh9IVm3+/qYap//IzEv9JUc3\nv4+HlpZu0trxTpvRWWjPqVr3ssxRdiFLC0LCLEk4rzqWLBVyzJm8uHVIF9Inv8PE\naudInvdbnfAWi60+1Wi8u0Co\n-----END PRIVATE KEY-----\n", + "client_email": "firebase-adminsdk-2afzd@tutorials-2cdfb.iam.gserviceaccount.com", + "client_id": "111111112074248894669", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-2afzd%40tutorials-2cdfb.iam.gserviceaccount.com" +} From 706c611e996b7e2a1379b78d8d2ba326ed7f18bb Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 3 Feb 2023 23:20:38 +0530 Subject: [PATCH 403/592] JAVA-17200 Fix references to parents - Week 50 - 2022 (moved-3) (#13322) --- spring-boot-modules/spring-boot-mvc-birt/pom.xml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/spring-boot-modules/spring-boot-mvc-birt/pom.xml b/spring-boot-modules/spring-boot-mvc-birt/pom.xml index badf77735f..274932f06c 100644 --- a/spring-boot-modules/spring-boot-mvc-birt/pom.xml +++ b/spring-boot-modules/spring-boot-mvc-birt/pom.xml @@ -9,13 +9,11 @@ jar Module For Spring Boot Integration with BIRT - - - org.springframework.boot - spring-boot-starter-parent - 2.1.1.RELEASE - + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 From 58f8225215adf2ee83a7ddf582bf11bf2c248406 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 3 Feb 2023 23:23:47 +0530 Subject: [PATCH 404/592] JAVA-54 Create parents profile for tutorials repo (#13360) --- README.md | 5 ++++- pom.xml | 12 ++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index aecd561645..3c31b7fba1 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,9 @@ Next, they are segregated further on the basis of the tests that we want to exec Additionally, there are 2 profiles dedicated for JDK9 and above builds. -Therefore, we have a total of 8 profiles: +We also have a parents profile to build only parent modules. + +Therefore, we have a total of 9 profiles: | Profile | Includes | Type of test enabled | | -------------------------- | --------------------------- | -------------------- | @@ -45,6 +47,7 @@ Therefore, we have a total of 8 profiles: | integration-heavy | Heavy/long running projects | *IntegrationTest | | default-jdk9-and-above | JDK9 and above projects | *UnitTest | | integration-jdk9-and-above | JDK9 and above projects | *IntegrationTest | +| parents | Set of parent modules | None | Building the project ==================== diff --git a/pom.xml b/pom.xml index 77eb94f035..431d712c6b 100644 --- a/pom.xml +++ b/pom.xml @@ -1283,6 +1283,18 @@ 11 + + + parents + + parent-boot-1 + parent-boot-2 + parent-spring-4 + parent-spring-5 + parent-java + + + From a70afe6a9f8f12c50a6acbac9f54c69b5642d74c Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Sat, 4 Feb 2023 07:50:37 +0100 Subject: [PATCH 405/592] BAEL-5866 Reading PDF File using Java (#13403) --- pdf/sample.pdf | Bin 0 -> 14049 bytes .../pdfreadertest/ReadPdfFileUnitTest.java | 52 ++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 pdf/sample.pdf create mode 100644 pdf/src/test/java/com/baeldung/pdfreadertest/ReadPdfFileUnitTest.java diff --git a/pdf/sample.pdf b/pdf/sample.pdf new file mode 100644 index 0000000000000000000000000000000000000000..805a21e6e029c58916e8e5b48fd445353c760375 GIT binary patch literal 14049 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 Date: Sat, 4 Feb 2023 16:40:35 +0100 Subject: [PATCH 406/592] BAEL-6198: junit5 @Nested tests --- .../com/baeldung/junit5/nested/Article.java | 19 ++++ .../baeldung/junit5/nested/Membership.java | 16 ++++ .../baeldung/junit5/nested/Publication.java | 32 +++++++ .../java/com/baeldung/junit5/nested/User.java | 19 ++++ .../baeldung/junit5/nested/NestedTest.java | 41 ++++++++ .../junit5/nested/OnlinePublicationTest.java | 93 +++++++++++++++++++ 6 files changed, 220 insertions(+) create mode 100644 testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/Article.java create mode 100644 testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/Membership.java create mode 100644 testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/Publication.java create mode 100644 testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/User.java create mode 100644 testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/NestedTest.java create mode 100644 testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/OnlinePublicationTest.java diff --git a/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/Article.java b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/Article.java new file mode 100644 index 0000000000..6beac24827 --- /dev/null +++ b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/Article.java @@ -0,0 +1,19 @@ +package com.baeldung.junit5.nested; + +public class Article { + private String name; + private Membership articleLevel; + + public Article(String name, Membership articleLevel) { + this.name = name; + this.articleLevel = articleLevel; + } + + public String getName() { + return name; + } + + public Membership getArticleLevel() { + return articleLevel; + } +} \ No newline at end of file diff --git a/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/Membership.java b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/Membership.java new file mode 100644 index 0000000000..de8e6f1fc8 --- /dev/null +++ b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/Membership.java @@ -0,0 +1,16 @@ +package com.baeldung.junit5.nested; + +public enum Membership { + FREE(0), SILVER(10), GOLD(20); + + private final int level; + + Membership(int level) { + this.level = level; + } + + public int compare(Membership other) { + return level - other.level; + } + +} \ No newline at end of file diff --git a/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/Publication.java b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/Publication.java new file mode 100644 index 0000000000..998419acc9 --- /dev/null +++ b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/Publication.java @@ -0,0 +1,32 @@ +package com.baeldung.junit5.nested; + +import java.util.List; +import java.util.stream.Collectors; + +public class Publication { + private final List
    articles; + + public Publication(List
    articles) { + this.articles = articles; + } + + public List getReadableArticles(User user) { + return articles.stream() + .filter(a -> a.getArticleLevel() + .compare(user.getMembership()) <= 0) + .map(Article::getName) + .collect(Collectors.toList()); + } + + public List getLockedArticles(User user) { + return articles.stream() + .filter(a -> a.getArticleLevel() + .compare(user.getMembership()) > 0) + .map(Article::getName) + .collect(Collectors.toList()); + } + + public List
    getArticles() { + return articles; + } +} \ No newline at end of file diff --git a/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/User.java b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/User.java new file mode 100644 index 0000000000..3e9d7ebeff --- /dev/null +++ b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/User.java @@ -0,0 +1,19 @@ +package com.baeldung.junit5.nested; + +public class User { + private String name; + private Membership membership; + + public User(String name, Membership membership) { + this.name = name; + this.membership = membership; + } + + public String getName() { + return name; + } + + public Membership getMembership() { + return membership; + } +} \ No newline at end of file diff --git a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/NestedTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/NestedTest.java new file mode 100644 index 0000000000..47a7879d17 --- /dev/null +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/NestedTest.java @@ -0,0 +1,41 @@ +package com.baeldung.junit5.nested; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +public class NestedTest { + + @BeforeEach + void beforeEach() { + System.out.println("NestedTest.beforeEach()"); + } + + @Nested + class FirstNestedClass { + @BeforeEach + void beforeEach() { + System.out.println("FirstNestedClass.beforeEach()"); + } + + @Test + void test() { + System.out.println("FirstNestedClass.test()"); + } + } + + + @Nested + class SecondNestedClass { + @BeforeEach + void beforeEach() { + System.out.println("SecondNestedClass.beforeEach()"); + } + + @Test + void test() { + System.out.println("SecondNestedClass.test()"); + } + } + +} diff --git a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/OnlinePublicationTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/OnlinePublicationTest.java new file mode 100644 index 0000000000..faae1d2916 --- /dev/null +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/OnlinePublicationTest.java @@ -0,0 +1,93 @@ +package com.baeldung.junit5.nested; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +@DisplayName("given a article publication with three articles") +class OnlinePublicationTest { + private Publication publication; + + @BeforeEach + void setupArticlesAndPublication() { + Article freeArticle = new Article("free article", Membership.FREE); + Article silverArticle = new Article("silver level article", Membership.SILVER); + Article goldArticle = new Article("gold level article", Membership.GOLD); + publication = new Publication(Arrays.asList(freeArticle, silverArticle, goldArticle)); + } + + @Test + @DisplayName("then 3 articles are available") + void shouldHaveThreeArticlesInTotal() { + List
    allArticles = publication.getArticles(); + assertThat(allArticles).hasSize(3); + } + + @Nested + @DisplayName("when a user with a 'free' membership logs in") + class UserWithAFreeMembership { + User freeFreya = new User("Freya", Membership.FREE); + + @Test + @DisplayName("then he should be able to read the 'free' articles") + void shouldOnlyReadFreeArticles() { + List articles = publication.getReadableArticles(freeFreya); + assertThat(articles).containsExactly("free article"); + } + + @Test + @DisplayName("then he shouldn't be able to read the 'silver' and 'gold' articles") + void shouldSeeSilverAndGoldLevelArticlesAsLocked() { + List articles = publication.getLockedArticles(freeFreya); + assertThat(articles).containsExactlyInAnyOrder("silver level article", "gold level article"); + } + } + + @Nested + @DisplayName("when a user with a 'silver' membership logs in") + class UserWithSilverMembership { + User silverSilvester = new User("Silvester", Membership.SILVER); + + @Test + @DisplayName("then he should be able to read the 'free' and 'silver' level articles") + void shouldOnlyReadFreeAndSilverLevelArticles() { + List articles = publication.getReadableArticles(silverSilvester); + assertThat(articles).containsExactlyInAnyOrder("free article", "silver level article"); + } + + @Test + @DisplayName("then he should see the 'gold' level articles as locked") + void shouldSeeGoldLevelArticlesAsLocked() { + List articles = publication.getLockedArticles(silverSilvester); + assertThat(articles).containsExactlyInAnyOrder("gold level article"); + } + } + + @Nested + @DisplayName("when a user with a 'gold' membership logs in") + class UserWithGoldMembership { + User goldenGeorge = new User("George", Membership.GOLD); + + @Test + @DisplayName("then he should be able to read all the articles") + void shouldSeeAllArticles() { + List articles = publication.getReadableArticles(goldenGeorge); + assertThat(articles).containsExactlyInAnyOrder("free article", "silver level article", "gold level article"); + } + + @Test + @DisplayName("then he should not see any article as locked") + void shouldNotHaveHiddenArticles() { + List articles = publication.getLockedArticles(goldenGeorge); + assertThat(articles).isEmpty(); + } + + } + +} \ No newline at end of file From b12a58d375abe43526773a8c9ffeebc46f909ab0 Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Sat, 4 Feb 2023 16:49:19 +0100 Subject: [PATCH 407/592] BAEL-6198: renaming --- .../junit5/nested/{NestedTest.java => NestedUnitTest.java} | 4 ++-- ...inePublicationTest.java => OnlinePublicationUnitTest.java} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/{NestedTest.java => NestedUnitTest.java} (89%) rename testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/{OnlinePublicationTest.java => OnlinePublicationUnitTest.java} (99%) diff --git a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/NestedTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/NestedUnitTest.java similarity index 89% rename from testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/NestedTest.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/NestedUnitTest.java index 47a7879d17..e30094cc9d 100644 --- a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/NestedTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/NestedUnitTest.java @@ -4,11 +4,11 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -public class NestedTest { +public class NestedUnitTest { @BeforeEach void beforeEach() { - System.out.println("NestedTest.beforeEach()"); + System.out.println("NestedUnitTest.beforeEach()"); } @Nested diff --git a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/OnlinePublicationTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/OnlinePublicationUnitTest.java similarity index 99% rename from testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/OnlinePublicationTest.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/OnlinePublicationUnitTest.java index faae1d2916..bf3f15ff4e 100644 --- a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/OnlinePublicationTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/nested/OnlinePublicationUnitTest.java @@ -11,7 +11,7 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @DisplayName("given a article publication with three articles") -class OnlinePublicationTest { +class OnlinePublicationUnitTest { private Publication publication; @BeforeEach From c0be80a64afc8138d9df28d376b52cbf481cece5 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sat, 4 Feb 2023 17:12:16 +0100 Subject: [PATCH 408/592] [instanceOf-stream] Checking instanceof in Java Stream (#13419) --- .../baeldung/keyword/InstanceOfUnitTest.java | 58 +++++++++++-------- 1 file changed, 35 insertions(+), 23 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 0e082b69d3..6ba8ed024c 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 @@ -1,55 +1,67 @@ package com.baeldung.keyword; -import org.junit.Assert; import org.junit.jupiter.api.Test; -import com.baeldung.keyword.Circle; -import com.baeldung.keyword.Ring; -import com.baeldung.keyword.Round; -import com.baeldung.keyword.Shape; -import com.baeldung.keyword.Triangle; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; public class InstanceOfUnitTest { @Test - public void giveWhenInstanceIsCorrect_thenReturnTrue() { + void giveWhenInstanceIsCorrect_thenReturnTrue() { Ring ring = new Ring(); - Assert.assertTrue("ring is instance of Round ", ring instanceof Round); + assertTrue(ring instanceof Round); } @Test - public void giveWhenObjectIsInstanceOfType_thenReturnTrue() { + void giveWhenObjectIsInstanceOfType_thenReturnTrue() { Circle circle = new Circle(); - Assert.assertTrue("circle is instance of Circle ", circle instanceof Circle); + assertTrue(circle instanceof Circle); } - + @Test - public void giveWhenInstanceIsOfSubtype_thenReturnTrue() { + void giveWhenInstanceIsOfSubtype_thenReturnTrue() { Circle circle = new Circle(); - Assert.assertTrue("circle is instance of Round", circle instanceof Round); + assertTrue(circle instanceof Round); } @Test - public void giveWhenTypeIsInterface_thenReturnTrue() { + void giveWhenTypeIsInterface_thenReturnTrue() { Circle circle = new Circle(); - Assert.assertTrue("circle is instance of Shape", circle instanceof Shape); + assertTrue(circle instanceof Shape); } - + @Test - public void giveWhenTypeIsOfObjectType_thenReturnTrue() { + void giveWhenTypeIsOfObjectType_thenReturnTrue() { Thread thread = new Thread(); - Assert.assertTrue("thread is instance of Object", thread instanceof Object); + assertTrue(thread instanceof Object); } @Test - public void giveWhenInstanceValueIsNull_thenReturnFalse() { + void giveWhenInstanceValueIsNull_thenReturnFalse() { Circle circle = null; - Assert.assertFalse("circle is instance of Round", circle instanceof Round); + assertFalse(circle instanceof Round); } @Test - public void giveWhenComparingClassInDiffHierarchy_thenCompilationError() { - // Assert.assertFalse("circle is instance of Triangle", circle instanceof Triangle); + void giveWhenComparingClassInDiffHierarchy_thenCompilationError() { + //assertFalse( circle instanceof Triangle); } -} + + @Test + void giveWhenStream_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() { + 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()); + } +} \ No newline at end of file From 0e1a3beb994866c66c0c03b471dfabf676f11aad Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sat, 4 Feb 2023 17:19:19 +0100 Subject: [PATCH 409/592] [x-asserts-in-one] Single Assert Call for Multiple Properties in JUnit5 (#13413) --- testing-modules/junit-5-advanced/pom.xml | 11 ++- .../MultiAssertionsInOneUnitTest.java | 94 +++++++++++++++++++ 2 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 testing-modules/junit-5-advanced/src/test/java/com/baeldung/multiassertions/MultiAssertionsInOneUnitTest.java diff --git a/testing-modules/junit-5-advanced/pom.xml b/testing-modules/junit-5-advanced/pom.xml index f3e8d3f9a3..bfc490b03e 100644 --- a/testing-modules/junit-5-advanced/pom.xml +++ b/testing-modules/junit-5-advanced/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 junit-5-advanced 1.0-SNAPSHOT @@ -27,6 +27,12 @@ ${jmockit.version} test + + org.assertj + assertj-core + ${assertj.version} + test + @@ -46,6 +52,7 @@ 1.49 + 3.24.2 \ No newline at end of file diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/multiassertions/MultiAssertionsInOneUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/multiassertions/MultiAssertionsInOneUnitTest.java new file mode 100644 index 0000000000..6fec9015cf --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/multiassertions/MultiAssertionsInOneUnitTest.java @@ -0,0 +1,94 @@ +package com.baeldung.multiassertions; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.from; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.math.BigDecimal; +import org.junit.jupiter.api.Test; + +public class MultiAssertionsInOneUnitTest { + private static final Product EXPECTED = new Product(42L, "LG Monitor", "32 inches, 4K Resolution, Ideal for programmer", true, new BigDecimal("429.99"), 77); + private static final Product TO_BE_TESTED = new Product(-1L, "LG Monitor", "dummy value: whatever", true, new BigDecimal("429.99"), 77); + + @Test + void givenAProductObject_whenUsingAssertAll_thenAssertMultiPropertiesInOneCall() { + //@formatter:off + assertAll("Verify Product properties", + () -> assertEquals(EXPECTED.getName(), TO_BE_TESTED.getName()), + () -> assertEquals(EXPECTED.isOnSale(), TO_BE_TESTED.isOnSale()), + () -> assertEquals(EXPECTED.getStockQuantity(), TO_BE_TESTED.getStockQuantity()), + () -> assertEquals(EXPECTED.getPrice(), TO_BE_TESTED.getPrice())); + //@formatter:on + } + + @Test + void givenAProductObject_whenUsingAssertJExtracting_thenAssertMultiPropertiesInOneCall() { + //@formatter:off + assertThat(TO_BE_TESTED) + .extracting("name", "onSale", "stockQuantity", "price") + .containsExactly(EXPECTED.getName(), EXPECTED.isOnSale(), EXPECTED.getStockQuantity(), EXPECTED.getPrice()); + + assertThat(TO_BE_TESTED) + .extracting(Product::getName, Product::isOnSale, Product::getStockQuantity,Product::getPrice) + .containsExactly(EXPECTED.getName(), EXPECTED.isOnSale(), EXPECTED.getStockQuantity(), EXPECTED.getPrice()); + //@formatter:on + } + + @Test + void givenAProductObject_whenUsingAssertJReturns_thenAssertMultiPropertiesInOneCall() { + //@formatter:off + assertThat(TO_BE_TESTED) + .returns(EXPECTED.getName(),from(Product::getName)) + .returns(EXPECTED.isOnSale(), from(Product::isOnSale)) + .returns(EXPECTED.getStockQuantity(), from(Product::getStockQuantity)) + .returns(EXPECTED.getPrice(), from(Product::getPrice)) + + .doesNotReturn(EXPECTED.getId(), from(Product::getId)) + .doesNotReturn(EXPECTED.getDescription(), from(Product::getDescription)); + //@formatter:on + } +} + +class Product { + private Long id; + private String name; + private String description; + private boolean onSale; + private BigDecimal price; + private int stockQuantity; + + public Product(Long id, String name, String description, boolean onSale, BigDecimal price, int stockQuantity) { + this.id = id; + this.name = name; + this.description = description; + this.onSale = onSale; + this.price = price; + this.stockQuantity = stockQuantity; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public boolean isOnSale() { + return onSale; + } + + public BigDecimal getPrice() { + return price; + } + + public int getStockQuantity() { + return stockQuantity; + } +} \ No newline at end of file From 107232d079f64ba963059f983d3329c5a416b651 Mon Sep 17 00:00:00 2001 From: Muhammad Asif Date: Sat, 4 Feb 2023 21:25:23 +0500 Subject: [PATCH 410/592] BAEL-5990 is implemented to generate JMeter dashboard reports (#13345) * BAEL-5990 is implemented to generate JMeter dashboard reports * BAEL-5990 made a fix to use Random nextInt() method with single arg * BAEL-5990 updated code to use Arrays.asList rather than List.of * BAEL-5990 Replaced tabs with space * BAEL-5990 Removed unnecessary exception in the method declaration * BAEL-5990 Updated class name --- jmeter/pom.xml | 86 ++++++++++++ .../dashboard/DashboardApplication.java | 15 +++ .../dashboard/controllers/Dashboard.java | 42 ++++++ .../com/baeldung/dashboard/models/Quotes.java | 13 ++ .../resources/dashboard/ReportsDashboard.csv | 16 +++ .../resources/dashboard/ReportsDashboard.jmx | 127 ++++++++++++++++++ jmeter/src/main/resources/static/index.html | 15 +++ .../main/resources/templates/greeting.html | 10 ++ .../src/main/resources/templates/quote.html | 11 ++ jmeter/src/main/resources/templates/time.html | 10 ++ 10 files changed, 345 insertions(+) create mode 100644 jmeter/src/main/java/com/baeldung/dashboard/DashboardApplication.java create mode 100644 jmeter/src/main/java/com/baeldung/dashboard/controllers/Dashboard.java create mode 100644 jmeter/src/main/java/com/baeldung/dashboard/models/Quotes.java create mode 100644 jmeter/src/main/resources/dashboard/ReportsDashboard.csv create mode 100644 jmeter/src/main/resources/dashboard/ReportsDashboard.jmx create mode 100644 jmeter/src/main/resources/static/index.html create mode 100644 jmeter/src/main/resources/templates/greeting.html create mode 100644 jmeter/src/main/resources/templates/quote.html create mode 100644 jmeter/src/main/resources/templates/time.html diff --git a/jmeter/pom.xml b/jmeter/pom.xml index b2e4197dfc..c4b15405ec 100644 --- a/jmeter/pom.xml +++ b/jmeter/pom.xml @@ -68,5 +68,91 @@ 2.6.0 + + + + dashboard + + + env + dash + + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-web + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + launch-web-app + + start + + + com.baeldung.dashboard.DashboardApplication + + + + + + com.lazerycode.jmeter + jmeter-maven-plugin + 3.7.0 + + + + configuration + + configure + + + + + jmeter-tests + + jmeter + results + + + + + ${project.basedir}/src/main/resources/dashboard + ${project.basedir}/src/main/resources/dashboard + true + true + false + + + + org.springframework.boot + spring-boot-maven-plugin + + + stop-web-app + + stop + + + + + + + + + 5.5 + + + \ No newline at end of file diff --git a/jmeter/src/main/java/com/baeldung/dashboard/DashboardApplication.java b/jmeter/src/main/java/com/baeldung/dashboard/DashboardApplication.java new file mode 100644 index 0000000000..a531b97be1 --- /dev/null +++ b/jmeter/src/main/java/com/baeldung/dashboard/DashboardApplication.java @@ -0,0 +1,15 @@ +package com.baeldung.dashboard; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; +import org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration; +import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; + +@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, MongoAutoConfiguration.class, MongoRepositoriesAutoConfiguration.class, MongoDataAutoConfiguration.class }) +public class DashboardApplication { + public static void main(String[] args) throws Exception { + SpringApplication.run(DashboardApplication.class, args); + } +} diff --git a/jmeter/src/main/java/com/baeldung/dashboard/controllers/Dashboard.java b/jmeter/src/main/java/com/baeldung/dashboard/controllers/Dashboard.java new file mode 100644 index 0000000000..8c749b21d8 --- /dev/null +++ b/jmeter/src/main/java/com/baeldung/dashboard/controllers/Dashboard.java @@ -0,0 +1,42 @@ +package com.baeldung.dashboard.controllers; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Random; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +import com.baeldung.dashboard.models.Quotes; + +@Controller +public class Dashboard { + + @GetMapping("/greeting") + public String getGreeting(Model model) { + model.addAttribute("host", System.getProperty("os.name")); + return "greeting"; + } + + @GetMapping("/quote") + public String getQuote(Model model) throws InterruptedException { + Random r = new Random(); + int day = r.nextInt(7); + String quote = Quotes.list.get(day); + + int wait = r.nextInt(6); + Thread.currentThread().sleep(wait); + model.addAttribute("quote", quote); + + return "quote"; + } + + @GetMapping("/time") + public String getTime(Model model) { + DateTimeFormatter fmt = DateTimeFormatter.ofPattern("hh:mm:ss a"); + LocalDateTime now = LocalDateTime.now(); + model.addAttribute("time", fmt.format(now)); + return "time"; + } +} diff --git a/jmeter/src/main/java/com/baeldung/dashboard/models/Quotes.java b/jmeter/src/main/java/com/baeldung/dashboard/models/Quotes.java new file mode 100644 index 0000000000..7c8e6a732d --- /dev/null +++ b/jmeter/src/main/java/com/baeldung/dashboard/models/Quotes.java @@ -0,0 +1,13 @@ +package com.baeldung.dashboard.models; + +import java.util.Arrays; +import java.util.List; + +public class Quotes { + public static final List list = Arrays.asList("The greatest glory in living lies not in never falling, but in rising every time we fall. -Nelson Mandela\r\n", + "The way to get started is to quit talking and begin doing. -Walt Disney\r\n", + "Your time is limited, so don't waste it living someone else's life. Don't be trapped by dogma – which is living with the results of other people's thinking. -Steve Jobs\r\n", + "If life were predictable it would cease to be life, and be without flavor. -Eleanor Roosevelt\r\n", + "If you look at what you have in life, you'll always have more. If you look at what you don't have in life, you'll never have enough. -Oprah Winfrey\r\n", + "If you set your goals ridiculously high and it's a failure, you will fail above everyone else's success. -James Cameron\r\n", "Life is what happens when you're busy making other plans. -John Lennon"); +} diff --git a/jmeter/src/main/resources/dashboard/ReportsDashboard.csv b/jmeter/src/main/resources/dashboard/ReportsDashboard.csv new file mode 100644 index 0000000000..046666ca2b --- /dev/null +++ b/jmeter/src/main/resources/dashboard/ReportsDashboard.csv @@ -0,0 +1,16 @@ +timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect +1674622105952,714,HTTP Request (/greeting),200,,Thread Group 1-4,text,true,,430,126,5,5,http://localhost:8080/greeting,705,0,7 +1674622105450,1216,HTTP Request (/greeting),200,,Thread Group 1-1,text,true,,430,126,5,5,http://localhost:8080/greeting,1207,0,54 +1674622105468,1198,HTTP Request (/greeting),200,,Thread Group 1-2,text,true,,430,126,5,5,http://localhost:8080/greeting,1189,0,36 +1674622106064,602,HTTP Request (/greeting),200,,Thread Group 1-5,text,true,,430,126,5,5,http://localhost:8080/greeting,593,0,2 +1674622105800,866,HTTP Request (/greeting),200,,Thread Group 1-3,text,true,,430,126,5,5,http://localhost:8080/greeting,857,0,1 +1674622106669,13,HTTP Request (/quote),200,,Thread Group 1-4,text,true,,515,123,5,5,http://localhost:8080/quote,12,0,0 +1674622106669,16,HTTP Request (/quote),200,,Thread Group 1-2,text,true,,548,123,5,5,http://localhost:8080/quote,16,0,0 +1674622106671,18,HTTP Request (/quote),200,,Thread Group 1-1,text,true,,629,123,5,5,http://localhost:8080/quote,18,0,0 +1674622106669,24,HTTP Request (/quote),200,,Thread Group 1-5,text,true,,602,123,5,5,http://localhost:8080/quote,24,0,0 +1674622106669,29,HTTP Request (/quote),200,,Thread Group 1-3,text,true,,515,123,5,5,http://localhost:8080/quote,29,0,0 +1674622106690,18,HTTP Request (/time),200,,Thread Group 1-1,text,true,,432,122,5,5,http://localhost:8080/time,18,0,0 +1674622106699,9,HTTP Request (/time),200,,Thread Group 1-3,text,true,,432,122,5,5,http://localhost:8080/time,9,0,0 +1674622106683,26,HTTP Request (/time),200,,Thread Group 1-4,text,true,,432,122,5,5,http://localhost:8080/time,25,0,0 +1674622106688,25,HTTP Request (/time),200,,Thread Group 1-2,text,true,,432,122,2,2,http://localhost:8080/time,25,0,0 +1674622106695,18,HTTP Request (/time),200,,Thread Group 1-5,text,true,,432,122,2,2,http://localhost:8080/time,17,0,0 diff --git a/jmeter/src/main/resources/dashboard/ReportsDashboard.jmx b/jmeter/src/main/resources/dashboard/ReportsDashboard.jmx new file mode 100644 index 0000000000..081920c671 --- /dev/null +++ b/jmeter/src/main/resources/dashboard/ReportsDashboard.jmx @@ -0,0 +1,127 @@ + + + + + + false + true + false + + + + + + + + Test Greetings Page + continue + + false + 1 + + 5 + 1 + false + + + true + + + + + + + localhost + 8080 + + + /greeting + GET + true + false + true + false + + + + + + + + + + localhost + 8080 + + + /quote + GET + true + false + true + false + + + + + + + + + + localhost + 8080 + + + /time + GET + true + false + true + false + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + dashapp + + + + + + diff --git a/jmeter/src/main/resources/static/index.html b/jmeter/src/main/resources/static/index.html new file mode 100644 index 0000000000..fe2e1bf095 --- /dev/null +++ b/jmeter/src/main/resources/static/index.html @@ -0,0 +1,15 @@ + + + + + Jmeter Dashboard Test APP + + + + +

    Get your Quote here

    +

    Get your Time here

    +

    Get your greeting here

    + + + \ No newline at end of file diff --git a/jmeter/src/main/resources/templates/greeting.html b/jmeter/src/main/resources/templates/greeting.html new file mode 100644 index 0000000000..3b023db6b1 --- /dev/null +++ b/jmeter/src/main/resources/templates/greeting.html @@ -0,0 +1,10 @@ + + + + Jmeter Dashboard Test APP + + + +

    + + \ No newline at end of file diff --git a/jmeter/src/main/resources/templates/quote.html b/jmeter/src/main/resources/templates/quote.html new file mode 100644 index 0000000000..8d943c2a3d --- /dev/null +++ b/jmeter/src/main/resources/templates/quote.html @@ -0,0 +1,11 @@ + + + + Jmeter Dashboard Test APP + + + +

    +

    + + \ No newline at end of file diff --git a/jmeter/src/main/resources/templates/time.html b/jmeter/src/main/resources/templates/time.html new file mode 100644 index 0000000000..d068bbe050 --- /dev/null +++ b/jmeter/src/main/resources/templates/time.html @@ -0,0 +1,10 @@ + + + + Jmeter Dashboard Test APP + + + +

    + + \ No newline at end of file From 35e516d31edf0222f1b67c459e2595885b3ed45d Mon Sep 17 00:00:00 2001 From: vunamtien Date: Tue, 7 Feb 2023 01:54:29 +0700 Subject: [PATCH 411/592] BAEL-6049-validate-ipv4-address (#13287) * validate ipv4 * add unit test * add more unit tests * add more unit tests * add more unit test --------- Co-authored-by: tienvn4 --- .../urlvalidation/IPv4Validation.java | 27 ++++ .../IPv4ValidationUnitTest.java | 121 ++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 core-java-modules/core-java-networking-4/src/main/java/com/baeldung/urlvalidation/IPv4Validation.java create mode 100644 core-java-modules/core-java-networking-4/src/test/java/com/baeldung/ipv4validation/IPv4ValidationUnitTest.java diff --git a/core-java-modules/core-java-networking-4/src/main/java/com/baeldung/urlvalidation/IPv4Validation.java b/core-java-modules/core-java-networking-4/src/main/java/com/baeldung/urlvalidation/IPv4Validation.java new file mode 100644 index 0000000000..5d72873745 --- /dev/null +++ b/core-java-modules/core-java-networking-4/src/main/java/com/baeldung/urlvalidation/IPv4Validation.java @@ -0,0 +1,27 @@ +package com.baeldung.urlvalidation; + +import com.google.common.net.InetAddresses; +import org.apache.commons.validator.routines.InetAddressValidator; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class IPv4Validation { + + public static boolean validateWithApacheCommons(String ip) { + InetAddressValidator validator = InetAddressValidator.getInstance(); + return validator.isValid(ip); + } + + public static boolean validateWithGuava(String ip) { + return InetAddresses.isInetAddress(ip); + } + + public static boolean validateWithRegex(String ip) { + String regex = "^((25[0-5]|(2[0-4]|1\\d|[1-9]|)\\d)\\.?\\b){4}$"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(ip); + return matcher.matches(); + } + +} diff --git a/core-java-modules/core-java-networking-4/src/test/java/com/baeldung/ipv4validation/IPv4ValidationUnitTest.java b/core-java-modules/core-java-networking-4/src/test/java/com/baeldung/ipv4validation/IPv4ValidationUnitTest.java new file mode 100644 index 0000000000..367d70117a --- /dev/null +++ b/core-java-modules/core-java-networking-4/src/test/java/com/baeldung/ipv4validation/IPv4ValidationUnitTest.java @@ -0,0 +1,121 @@ +package com.baeldung.ipv4validation; + +import org.junit.Test; + +import static com.baeldung.urlvalidation.IPv4Validation.*; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class IPv4ValidationUnitTest { + + @Test + public void givenValidIPv4_whenValidate_thenReturnsTrue() { + String ip = "192.168.0.1"; + assertTrue(validateWithApacheCommons(ip)); + assertTrue(validateWithGuava(ip)); + assertTrue(validateWithRegex(ip)); + } + + @Test + public void givenIPv4WithThreeOctets_whenValidate_thenReturnsFalse() { + String ip = "192.168.0"; + assertFalse(validateWithApacheCommons(ip)); + assertFalse(validateWithGuava(ip)); + assertFalse(validateWithRegex(ip)); + } + + @Test + public void givenIPv4WithLeadingZero_whenValidate_thenReturnsFalse() { + String ip = "192.168.0.01"; + assertFalse(validateWithApacheCommons(ip)); + assertFalse(validateWithGuava(ip)); + assertFalse(validateWithRegex(ip)); + } + + @Test + public void givenIPv4WithInvalidCharacter_whenValidate_thenReturnsFalse() { + String ip = "a.168.0.01"; + assertFalse(validateWithApacheCommons(ip)); + assertFalse(validateWithGuava(ip)); + assertFalse(validateWithRegex(ip)); + } + + @Test + public void givenIPv4HaveValueAbove255_whenValidate_thenReturnsFalse() { + String ip = "192.168.256.1"; + assertFalse(validateWithApacheCommons(ip)); + assertFalse(validateWithGuava(ip)); + assertFalse(validateWithRegex(ip)); + } + + @Test + public void givenValidIPv4WithTwoDigitOctet_whenValidate_thenReturnsTrue() { + String ip = "192.168.42.1"; + assertTrue(validateWithApacheCommons(ip)); + assertTrue(validateWithGuava(ip)); + assertTrue(validateWithRegex(ip)); + } + @Test + public void givenValidIPv4WithNumberInRange200And249_whenValidate_thenReturnsTrue() { + String ip = "192.168.42.222"; + assertTrue(validateWithApacheCommons(ip)); + assertTrue(validateWithGuava(ip)); + assertTrue(validateWithRegex(ip)); + } + + @Test + public void givenIPv4WithFourDigitOctet_whenValidate_thenReturnsFalse() { + String ip = "1921.168.42.222"; + assertFalse(validateWithApacheCommons(ip)); + assertFalse(validateWithGuava(ip)); + assertFalse(validateWithRegex(ip)); + } + + @Test + public void givenIPv4WithFiveOctets_whenValidate_thenReturnsFalse() { + String ip = "192.168.42.222.10"; + assertFalse(validateWithApacheCommons(ip)); + assertFalse(validateWithGuava(ip)); + assertFalse(validateWithRegex(ip)); + } + + @Test + public void givenIPv4WithTwoConsecutiveDots_whenValidate_thenReturnsFalse() { + String ip = "192.168..1"; + assertFalse(validateWithApacheCommons(ip)); + assertFalse(validateWithGuava(ip)); + assertFalse(validateWithRegex(ip)); + } + + @Test + public void givenOnlyDots_whenValidate_thenReturnsFalse() { + String ip = "..."; + assertFalse(validateWithApacheCommons(ip)); + assertFalse(validateWithGuava(ip)); + assertFalse(validateWithRegex(ip)); + } + + @Test + public void givenBlankString_whenValidate_thenReturnsFalse() { + String ip = " "; + assertFalse(validateWithApacheCommons(ip)); + assertFalse(validateWithGuava(ip)); + assertFalse(validateWithRegex(ip)); + } + + @Test + public void givenIPv4StartWithDot_whenValidate_thenReturnsFalse() { + String ip = ".192.168.0.1"; + assertFalse(validateWithApacheCommons(ip)); + assertFalse(validateWithGuava(ip)); + assertFalse(validateWithRegex(ip)); + } + @Test + public void givenIPv4EndWithDot_whenValidate_thenReturnsFalse() { + String ip = "192.168.0.1."; + assertFalse(validateWithApacheCommons(ip)); + assertFalse(validateWithGuava(ip)); + assertFalse(validateWithRegex(ip)); + } + +} From 382e9255fcad542a9f350324740cbe0e69ff3d7b Mon Sep 17 00:00:00 2001 From: Saikat Chakraborty <40471715+saikatcse03@users.noreply.github.com> Date: Tue, 7 Feb 2023 00:31:12 +0530 Subject: [PATCH 412/592] Bael 5961: OpenTelemetry integration with Spring Boot application (#13252) * Open telemetry in spring boot * Removed unused field * Test add and seperate packages * Refactored code * Version moved to property * Removed unused logback files * update version in docker file * corrected spacing * COde review refactoring * COde review refactoring * COde review refactoring * corrected property * PostContruct add on repo setup * corrected var names * change to junit 5 and other improvements * Port reverted back * Code review implement * Logger update * Logger var update --------- Co-authored-by: Saikat --- spring-cloud-modules/pom.xml | 1 + .../docker-compose.yml | 30 +++++ .../otel-config.yml | 23 ++++ .../spring-cloud-open-telemetry/pom.xml | 22 ++++ .../spring-cloud-open-telemetry1/Dockerfile | 7 ++ .../spring-cloud-open-telemetry1/pom.xml | 116 ++++++++++++++++++ .../opentelemetry/ProductApplication.java | 12 ++ .../opentelemetry/api/client/PriceClient.java | 34 +++++ .../configuration/RestConfiguration.java | 15 +++ .../controller/ProductController.java | 36 ++++++ .../exception/ProductControllerAdvice.java | 22 ++++ .../exception/ProductNotFoundException.java | 7 ++ .../baeldung/opentelemetry/model/Price.java | 39 ++++++ .../baeldung/opentelemetry/model/Product.java | 27 ++++ .../repository/ProductRepository.java | 55 +++++++++ .../src/main/resources/application.properties | 5 + .../opentelemetry/SpringContextTest.java | 16 +++ .../controller/ProductControllerUnitTest.java | 92 ++++++++++++++ .../spring-cloud-open-telemetry2/Dockerfile | 7 ++ .../spring-cloud-open-telemetry2/pom.xml | 115 +++++++++++++++++ .../opentelemetry/PriceApplication.java | 12 ++ .../controller/PriceController.java | 29 +++++ .../exception/PriceNotFoundException.java | 7 ++ .../exception/ProductControllerAdvice.java | 16 +++ .../baeldung/opentelemetry/model/Price.java | 27 ++++ .../repository/PriceRepository.java | 53 ++++++++ .../src/main/resources/application.properties | 4 + .../opentelemetry/SpringContextTest.java | 16 +++ .../controller/PriceControllerUnitTest.java | 57 +++++++++ 29 files changed, 902 insertions(+) create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/docker-compose.yml create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/otel-config.yml create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/pom.xml create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/Dockerfile create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/pom.xml create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/ProductApplication.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/api/client/PriceClient.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/configuration/RestConfiguration.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/controller/ProductController.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/exception/ProductControllerAdvice.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/exception/ProductNotFoundException.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/model/Price.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/model/Product.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/repository/ProductRepository.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/resources/application.properties create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/test/java/com/baeldung/opentelemetry/SpringContextTest.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/test/java/com/baeldung/opentelemetry/controller/ProductControllerUnitTest.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/Dockerfile create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/pom.xml create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/PriceApplication.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/controller/PriceController.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/exception/PriceNotFoundException.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/exception/ProductControllerAdvice.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/model/Price.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/repository/PriceRepository.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/resources/application.properties create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/test/java/com/baeldung/opentelemetry/SpringContextTest.java create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/test/java/com/baeldung/opentelemetry/controller/PriceControllerUnitTest.java diff --git a/spring-cloud-modules/pom.xml b/spring-cloud-modules/pom.xml index 68aa4cd2e5..43e2687d74 100644 --- a/spring-cloud-modules/pom.xml +++ b/spring-cloud-modules/pom.xml @@ -55,6 +55,7 @@ spring-cloud-data-flow spring-cloud-sleuth spring-cloud-openfeign-2 + spring-cloud-open-telemetry diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/docker-compose.yml b/spring-cloud-modules/spring-cloud-open-telemetry/docker-compose.yml new file mode 100644 index 0000000000..8a6833095c --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/docker-compose.yml @@ -0,0 +1,30 @@ +version: "4.0" + +services: + product-service: + platform: linux/x86_64 + build: spring-cloud-open-telemetry1/ + ports: + - "8080:8080" + + price-service: + platform: linux/x86_64 + build: spring-cloud-open-telemetry2/ + ports: + - "8081" + + jaeger-service: + image: jaegertracing/all-in-one:latest + ports: + - "16686:16686" + - "14250" + + collector: + image: otel/opentelemetry-collector:0.47.0 + command: [ "--config=/etc/otel-collector-config.yml" ] + volumes: + - ./otel-config.yml:/etc/otel-collector-config.yml + ports: + - "4317:4317" + depends_on: + - jaeger-service \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/otel-config.yml b/spring-cloud-modules/spring-cloud-open-telemetry/otel-config.yml new file mode 100644 index 0000000000..886c10a1c3 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/otel-config.yml @@ -0,0 +1,23 @@ +receivers: + otlp: + protocols: + grpc: + http: + +processors: + batch: + +exporters: + logging: + logLevel: debug + jaeger: + endpoint: jaeger-service:14250 + tls: + insecure: true + +service: + pipelines: + traces: + receivers: [ otlp ] + processors: [ batch ] + exporters: [ logging, jaeger ] diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/pom.xml b/spring-cloud-modules/spring-cloud-open-telemetry/pom.xml new file mode 100644 index 0000000000..69b3a1a478 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/pom.xml @@ -0,0 +1,22 @@ + + 4.0.0 + com.baeldung.spring.cloud + spring-cloud-open-telemetry + 1.0.0-SNAPSHOT + spring-cloud-open-telemetry + pom + + + com.baeldung.spring.cloud + spring-cloud-modules + 1.0.0-SNAPSHOT + + + + spring-cloud-open-telemetry1 + spring-cloud-open-telemetry2 + + + \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/Dockerfile b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/Dockerfile new file mode 100644 index 0000000000..8bae52cec4 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/Dockerfile @@ -0,0 +1,7 @@ +FROM adoptopenjdk/openjdk11:alpine + +COPY target/spring-cloud-open-telemetry1-1.0.0-SNAPSHOT.jar spring-cloud-open-telemetry.jar + +EXPOSE 8081 + +ENTRYPOINT ["java","-jar","/spring-cloud-open-telemetry.jar"] \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/pom.xml b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/pom.xml new file mode 100644 index 0000000000..5011590e73 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/pom.xml @@ -0,0 +1,116 @@ + + + 4.0.0 + spring-cloud-open-telemetry1 + com.baeldung.spring.cloud + 1.0.0-SNAPSHOT + spring-cloud-open-telemetry1 + jar + + + com.baeldung.spring.cloud + spring-cloud-open-telemetry + 1.0.0-SNAPSHOT + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot-dependencies.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${release.train.version} + pom + import + + + org.springframework.cloud + spring-cloud-sleuth-otel-dependencies + ${spring-cloud-sleuth-otel.version} + import + pom + + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + + + + org.springframework.cloud + spring-cloud-sleuth-otel-autoconfigure + + + io.opentelemetry + opentelemetry-exporter-otlp-trace + + + io.grpc + grpc-okhttp + ${grpc-okhttp.version} + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + + + spring-milestones + https://repo.spring.io/milestone + + + + + spring-milestones + https://repo.spring.io/milestone + + + + + 2.5.7 + 2020.0.4 + 1.0.0-M12 + 1.42.1 + + + \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/ProductApplication.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/ProductApplication.java new file mode 100644 index 0000000000..8427603340 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/ProductApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.opentelemetry; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ProductApplication { + + public static void main(String[] args) { + SpringApplication.run(ProductApplication.class, args); + } +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/api/client/PriceClient.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/api/client/PriceClient.java new file mode 100644 index 0000000000..d8b43b61a5 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/api/client/PriceClient.java @@ -0,0 +1,34 @@ +package com.baeldung.opentelemetry.api.client; + +import com.baeldung.opentelemetry.model.Price; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.client.RestTemplate; + +@Component +public class PriceClient { + + private static final Logger LOGGER = LoggerFactory.getLogger(PriceClient.class); + + private final RestTemplate restTemplate; + + @Autowired + public PriceClient(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + @Value("${priceClient.baseUrl}") + private String baseUrl; + + public Price getPrice(@PathVariable("id") long productId){ + LOGGER.info("Fetching Price Details With Product Id {}", productId); + String url = String.format("%s/price/%d", baseUrl, productId); + ResponseEntity price = restTemplate.getForEntity(url, Price.class); + return price.getBody(); + } +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/configuration/RestConfiguration.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/configuration/RestConfiguration.java new file mode 100644 index 0000000000..5d8ba4beac --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/configuration/RestConfiguration.java @@ -0,0 +1,15 @@ +package com.baeldung.opentelemetry.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestConfiguration { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/controller/ProductController.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/controller/ProductController.java new file mode 100644 index 0000000000..5586f5e9d0 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/controller/ProductController.java @@ -0,0 +1,36 @@ +package com.baeldung.opentelemetry.controller; + +import com.baeldung.opentelemetry.api.client.PriceClient; +import com.baeldung.opentelemetry.model.Product; +import com.baeldung.opentelemetry.repository.ProductRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class ProductController { + + private static final Logger LOGGER = LoggerFactory.getLogger(ProductController.class); + + private final PriceClient priceClient; + + private final ProductRepository productRepository; + + @Autowired + public ProductController(PriceClient priceClient, ProductRepository productRepository) { + this.priceClient = priceClient; + this.productRepository = productRepository; + } + + @GetMapping(path = "/product/{id}") + public Product getProductDetails(@PathVariable("id") long productId){ + LOGGER.info("Getting Product and Price Details With Product Id {}", productId); + Product product = productRepository.getProduct(productId); + product.setPrice(priceClient.getPrice(productId)); + + return product; + } +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/exception/ProductControllerAdvice.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/exception/ProductControllerAdvice.java new file mode 100644 index 0000000000..0ab031f517 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/exception/ProductControllerAdvice.java @@ -0,0 +1,22 @@ +package com.baeldung.opentelemetry.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.client.HttpServerErrorException; + + +@RestControllerAdvice +public class ProductControllerAdvice { + + @ExceptionHandler(ProductNotFoundException.class) + public ResponseEntity handleProductNotFoundException(ProductNotFoundException exception) { + return new ResponseEntity<>(exception.getMessage(), HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(HttpServerErrorException.ServiceUnavailable.class) + public ResponseEntity handleException(HttpServerErrorException.ServiceUnavailable exception) { + return new ResponseEntity<>(exception.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/exception/ProductNotFoundException.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/exception/ProductNotFoundException.java new file mode 100644 index 0000000000..9b698d5416 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/exception/ProductNotFoundException.java @@ -0,0 +1,7 @@ +package com.baeldung.opentelemetry.exception; + +public class ProductNotFoundException extends RuntimeException { + public ProductNotFoundException(String productNotFound) { + super(productNotFound); + } +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/model/Price.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/model/Price.java new file mode 100644 index 0000000000..dccaf978fd --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/model/Price.java @@ -0,0 +1,39 @@ +package com.baeldung.opentelemetry.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Price { + + @JsonProperty("productId") + private long productId; + + @JsonProperty("price_amount") + private double priceAmount; + + @JsonProperty("discount") + private double discount; + + public long getProductId() { + return productId; + } + + public void setProductId(long productId) { + this.productId = productId; + } + + public double getPriceAmount() { + return priceAmount; + } + + public void setPriceAmount(double priceAmount) { + this.priceAmount = priceAmount; + } + + public double getDiscount() { + return discount; + } + + public void setDiscount(double discount) { + this.discount = discount; + } +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/model/Product.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/model/Product.java new file mode 100644 index 0000000000..2a3a279dd8 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/model/Product.java @@ -0,0 +1,27 @@ +package com.baeldung.opentelemetry.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Product { + + @JsonProperty("id") + private long id; + + @JsonProperty("name") + private String name; + + @JsonProperty("price") + private Price price; + + public void setId(long id) { + this.id = id; + } + + public void setName(String name) { + this.name = name; + } + + public void setPrice(Price price) { + this.price = price; + } +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/repository/ProductRepository.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/repository/ProductRepository.java new file mode 100644 index 0000000000..07f94f626e --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/java/com/baeldung/opentelemetry/repository/ProductRepository.java @@ -0,0 +1,55 @@ +package com.baeldung.opentelemetry.repository; + +import com.baeldung.opentelemetry.exception.ProductNotFoundException; +import com.baeldung.opentelemetry.model.Product; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.HashMap; +import java.util.Map; + +@Component +public class ProductRepository { + + private static final Logger LOGGER = LoggerFactory.getLogger(ProductRepository.class); + + private final Map productMap = new HashMap<>(); + + public Product getProduct(Long productId){ + LOGGER.info("Getting Product from Product Repo With Product Id {}", productId); + + if(!productMap.containsKey(productId)){ + LOGGER.error("Product Not Found for Product Id {}", productId); + throw new ProductNotFoundException("Product Not Found"); + } + + return productMap.get(productId); + } + + @PostConstruct + private void setupRepo() { + Product product1 = getProduct(100001, "apple"); + productMap.put(100001L, product1); + + Product product2 = getProduct(100002, "pears"); + productMap.put(100002L, product2); + + Product product3 = getProduct(100003, "banana"); + productMap.put(100003L, product3); + + Product product4 = getProduct(100004, "mango"); + productMap.put(100004L, product4); + + Product product5 = getProduct(100005, "test"); + productMap.put(100005L, product5); + } + + private static Product getProduct(int id, String name) { + Product product = new Product(); + product.setId(id); + product.setName(name); + return product; + } +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/resources/application.properties new file mode 100644 index 0000000000..1645b6144d --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/resources/application.properties @@ -0,0 +1,5 @@ +server.port= 8080 +spring.application.name=product-service +priceClient.baseUrl=http://price-service:8081 +spring.sleuth.otel.config.trace-id-ratio-based=1.0 +spring.sleuth.otel.exporter.otlp.endpoint=http://collector:4317 \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/test/java/com/baeldung/opentelemetry/SpringContextTest.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/test/java/com/baeldung/opentelemetry/SpringContextTest.java new file mode 100644 index 0000000000..4f4a918cb4 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/test/java/com/baeldung/opentelemetry/SpringContextTest.java @@ -0,0 +1,16 @@ +package com.baeldung.opentelemetry; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + + +@ExtendWith(SpringExtension.class) +@SpringBootTest(classes = ProductApplication.class) +class SpringContextTest { + + @Test + void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/test/java/com/baeldung/opentelemetry/controller/ProductControllerUnitTest.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/test/java/com/baeldung/opentelemetry/controller/ProductControllerUnitTest.java new file mode 100644 index 0000000000..fcb3e23752 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/test/java/com/baeldung/opentelemetry/controller/ProductControllerUnitTest.java @@ -0,0 +1,92 @@ +package com.baeldung.opentelemetry.controller; + +import com.baeldung.opentelemetry.api.client.PriceClient; +import com.baeldung.opentelemetry.exception.ProductNotFoundException; +import com.baeldung.opentelemetry.model.Price; +import com.baeldung.opentelemetry.model.Product; +import com.baeldung.opentelemetry.repository.ProductRepository; +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.mock.mockito.MockBean; +import org.springframework.http.HttpStatus; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.web.client.HttpServerErrorException; + + +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.status; + + +@ExtendWith(SpringExtension.class) +@WebMvcTest(ProductController.class) +class ProductControllerUnitTest { + + @MockBean + private PriceClient priceCLient; + + @MockBean + private ProductRepository productRepository; + + @Autowired + private MockMvc mockMvc; + + + @Test + void givenProductandPriceDataAvailable_whenGetProductCalled_thenReturnProductDetails() throws Exception { + long productId = 100000L; + + Price price = createPrice(productId); + Product product = createProduct(productId); + product.setPrice(price); + + when(productRepository.getProduct(productId)).thenReturn(product); + when(priceCLient.getPrice(productId)).thenReturn(price); + + mockMvc.perform(get("/product/" + productId)) + .andExpect(status().is(HttpStatus.OK.value())); + } + + @Test + void givenProductNotFound_whenGetProductCalled_thenReturnInternalServerError() throws Exception { + long productId = 100000L; + Price price = createPrice(productId); + + when(productRepository.getProduct(productId)).thenThrow(ProductNotFoundException.class); + when(priceCLient.getPrice(productId)).thenReturn(price); + + mockMvc.perform(get("/product/" + productId)) + .andExpect(status().is(HttpStatus.NOT_FOUND.value())); + } + + @Test + void givenPriceServiceNotAvailable_whenGetProductCalled_thenReturnInternalServerError() throws Exception { + long productId = 100000L; + Product product = createProduct(productId); + + when(productRepository.getProduct(productId)).thenReturn(product); + when(priceCLient.getPrice(productId)).thenThrow(HttpServerErrorException.ServiceUnavailable.class); + + mockMvc.perform(get("/product/" + productId)) + .andExpect(status().is(HttpStatus.INTERNAL_SERVER_ERROR.value())); + } + + private static Product createProduct(long productId) { + Product product = new Product(); + product.setId(productId); + product.setName("test"); + return product; + } + + private static Price createPrice(long productId) { + Price price = new Price(); + price.setProductId(productId); + price.setPriceAmount(12.00); + price.setDiscount(2.5); + return price; + } +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/Dockerfile b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/Dockerfile new file mode 100644 index 0000000000..fb0e3b3263 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/Dockerfile @@ -0,0 +1,7 @@ +FROM adoptopenjdk/openjdk11:alpine + +COPY target/spring-cloud-open-telemetry2-1.0.0-SNAPSHOT.jar spring-cloud-open-telemetry.jar + +EXPOSE 8081 + +ENTRYPOINT ["java","-jar","/spring-cloud-open-telemetry.jar"] \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/pom.xml b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/pom.xml new file mode 100644 index 0000000000..2d7ac8204e --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/pom.xml @@ -0,0 +1,115 @@ + + + 4.0.0 + spring-cloud-open-telemetry2 + com.baeldung.spring.cloud + 1.0.0-SNAPSHOT + spring-cloud-open-telemetry2 + jar + + + com.baeldung.spring.cloud + spring-cloud-open-telemetry + 1.0.0-SNAPSHOT + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot-dependencies.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${release.train.version} + pom + import + + + org.springframework.cloud + spring-cloud-sleuth-otel-dependencies + ${spring-cloud-sleuth-otel.version} + import + pom + + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + + + + org.springframework.cloud + spring-cloud-sleuth-otel-autoconfigure + + + io.opentelemetry + opentelemetry-exporter-otlp-trace + + + io.grpc + grpc-okhttp + ${grpc-okhttp.version} + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + + + spring-milestones + https://repo.spring.io/milestone + + + + + spring-milestones + https://repo.spring.io/milestone + + + + + 2.5.7 + 2020.0.4 + 1.0.0-M12 + 1.42.1 + + + \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/PriceApplication.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/PriceApplication.java new file mode 100644 index 0000000000..75db68c624 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/PriceApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.opentelemetry; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class PriceApplication { + + public static void main(String[] args) { + SpringApplication.run(PriceApplication.class, args); + } +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/controller/PriceController.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/controller/PriceController.java new file mode 100644 index 0000000000..6142d4da10 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/controller/PriceController.java @@ -0,0 +1,29 @@ +package com.baeldung.opentelemetry.controller; + +import com.baeldung.opentelemetry.model.Price; +import com.baeldung.opentelemetry.repository.PriceRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class PriceController { + + private static final Logger LOGGER = LoggerFactory.getLogger(PriceController.class); + + private final PriceRepository priceRepository; + + @Autowired + public PriceController(PriceRepository priceRepository) { + this.priceRepository = priceRepository; + } + + @GetMapping(path = "/price/{id}") + public Price getPrice(@PathVariable("id") long productId) { + LOGGER.info("Getting Price details for Product Id {}", productId); + return priceRepository.getPrice(productId); + } +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/exception/PriceNotFoundException.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/exception/PriceNotFoundException.java new file mode 100644 index 0000000000..6e1c5e0b5e --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/exception/PriceNotFoundException.java @@ -0,0 +1,7 @@ +package com.baeldung.opentelemetry.exception; + +public class PriceNotFoundException extends RuntimeException { + public PriceNotFoundException(String priceNotFound) { + super(priceNotFound); + } +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/exception/ProductControllerAdvice.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/exception/ProductControllerAdvice.java new file mode 100644 index 0000000000..fe7789ecf5 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/exception/ProductControllerAdvice.java @@ -0,0 +1,16 @@ +package com.baeldung.opentelemetry.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class ProductControllerAdvice { + + @ExceptionHandler(PriceNotFoundException.class) + public ResponseEntity handlePriceNotFoundException(PriceNotFoundException exception) { + return new ResponseEntity<>(exception.getMessage(), HttpStatus.NOT_FOUND); + } + +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/model/Price.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/model/Price.java new file mode 100644 index 0000000000..0e30c4e25b --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/model/Price.java @@ -0,0 +1,27 @@ +package com.baeldung.opentelemetry.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Price { + + @JsonProperty("productId") + private long productId; + + @JsonProperty("price_amount") + private double priceAmount; + + @JsonProperty("discount") + private double discount; + + public void setDiscount(double discount) { + this.discount = discount; + } + + public void setProductId(long productId) { + this.productId = productId; + } + + public void setPriceAmount(double priceAmount) { + this.priceAmount = priceAmount; + } +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/repository/PriceRepository.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/repository/PriceRepository.java new file mode 100644 index 0000000000..63af7548d9 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/repository/PriceRepository.java @@ -0,0 +1,53 @@ +package com.baeldung.opentelemetry.repository; + +import com.baeldung.opentelemetry.model.Price; +import com.baeldung.opentelemetry.exception.PriceNotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.HashMap; +import java.util.Map; + +@Component +public class PriceRepository { + + private static final Logger LOGGER = LoggerFactory.getLogger(PriceRepository.class); + + private final Map priceMap = new HashMap<>(); + + public Price getPrice(Long productId){ + LOGGER.info("Getting Price from Price Repo With Product Id {}", productId); + + if(!priceMap.containsKey(productId)){ + LOGGER.error("Price Not Found for Product Id {}", productId); + throw new PriceNotFoundException("Product Not Found"); + } + + return priceMap.get(productId); + } + + @PostConstruct + private void setupRepo(){ + Price price1 = getPrice(100001L, 12.5, 2.5); + priceMap.put(100001L, price1); + + Price price2 = getPrice(100002L, 10.5, 2.1); + priceMap.put(100002L, price2); + + Price price3 = getPrice(100003L, 18.5, 2.0); + priceMap.put(100003L, price3); + + Price price4 = getPrice(100004L, 18.5, 2.0); + priceMap.put(100004L, price4); + } + + private static Price getPrice(long productId, double priceAmount, double discount) { + Price price = new Price(); + price.setProductId(productId); + price.setPriceAmount(priceAmount); + price.setDiscount(discount); + return price; + } +} \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/resources/application.properties new file mode 100644 index 0000000000..03b80ae271 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/resources/application.properties @@ -0,0 +1,4 @@ +server.port= 8081 +spring.application.name=price-service +spring.sleuth.otel.config.trace-id-ratio-based=1.0 +spring.sleuth.otel.exporter.otlp.endpoint=http://collector:4317 diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/test/java/com/baeldung/opentelemetry/SpringContextTest.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/test/java/com/baeldung/opentelemetry/SpringContextTest.java new file mode 100644 index 0000000000..524cc30567 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/test/java/com/baeldung/opentelemetry/SpringContextTest.java @@ -0,0 +1,16 @@ +package com.baeldung.opentelemetry; + +import org.junit.jupiter.api.Test; + +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@ExtendWith(SpringExtension.class) +@SpringBootTest(classes = PriceApplication.class) +class SpringContextTest { + + @Test + void whenSpringContextIsBootstrapped_thenNoException() { + } +} diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/test/java/com/baeldung/opentelemetry/controller/PriceControllerUnitTest.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/test/java/com/baeldung/opentelemetry/controller/PriceControllerUnitTest.java new file mode 100644 index 0000000000..7fd87c99d1 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/test/java/com/baeldung/opentelemetry/controller/PriceControllerUnitTest.java @@ -0,0 +1,57 @@ +package com.baeldung.opentelemetry.controller; + + +import com.baeldung.opentelemetry.exception.PriceNotFoundException; +import com.baeldung.opentelemetry.model.Price; +import com.baeldung.opentelemetry.repository.PriceRepository; +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.mock.mockito.MockBean; +import org.springframework.http.HttpStatus; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; + +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.status; + + +@ExtendWith(SpringExtension.class) +@WebMvcTest(PriceController.class) +class PriceControllerUnitTest { + + @MockBean + private PriceRepository priceRepository; + + @Autowired + private MockMvc mockMvc; + + @Test + void givenProductandPriceAvailable_whenGetProductCalled_thenReturnProductDetails() throws Exception { + long productId = 100000L; + Price price = new Price(); + price.setProductId(productId); + price.setPriceAmount(12.00); + price.setDiscount(2.5); + + when(priceRepository.getPrice(productId)).thenReturn(price); + + mockMvc.perform(get("/price/" + productId)) + .andExpect(status().is(HttpStatus.OK.value())); + } + + + @Test + void givenProductNotFound_whenGetProductCalled_thenReturnInternalServerError() throws Exception { + long productId = 100000L; + + when(priceRepository.getPrice(productId)).thenThrow(PriceNotFoundException.class); + + mockMvc.perform(get("/price/" + productId)) + .andExpect(status().is(HttpStatus.NOT_FOUND.value())); + } + +} From 0dbc07b1de66fb3118eb7fcac70a8bee21ffaa78 Mon Sep 17 00:00:00 2001 From: Muhammad Asif Date: Tue, 7 Feb 2023 05:23:47 +0500 Subject: [PATCH 413/592] BAEL-5990 Added JMeter-Dashboard profile to isolate (#13435) * BAEL-5990 is implemented to generate JMeter dashboard reports * BAEL-5990 made a fix to use Random nextInt() method with single arg * BAEL-5990 updated code to use Arrays.asList rather than List.of * BAEL-5990 Replaced tabs with space * BAEL-5990 Removed unnecessary exception in the method declaration * BAEL-5990 Updated class name * BAEL-5990 Added JMeterDashboard profile to exclude DashboardApplication scan in other cases --- jmeter/pom.xml | 5 +++++ .../java/com/baeldung/dashboard/DashboardApplication.java | 2 ++ 2 files changed, 7 insertions(+) diff --git a/jmeter/pom.xml b/jmeter/pom.xml index c4b15405ec..c4d09b9106 100644 --- a/jmeter/pom.xml +++ b/jmeter/pom.xml @@ -104,6 +104,11 @@ + + + JMeter-Dashboard + + com.lazerycode.jmeter diff --git a/jmeter/src/main/java/com/baeldung/dashboard/DashboardApplication.java b/jmeter/src/main/java/com/baeldung/dashboard/DashboardApplication.java index a531b97be1..6d62ad7e15 100644 --- a/jmeter/src/main/java/com/baeldung/dashboard/DashboardApplication.java +++ b/jmeter/src/main/java/com/baeldung/dashboard/DashboardApplication.java @@ -6,7 +6,9 @@ import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfigurat import org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration; import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; +import org.springframework.context.annotation.Profile; +@Profile("JMeter-Dashboard") @SpringBootApplication(exclude = { SecurityAutoConfiguration.class, MongoAutoConfiguration.class, MongoRepositoriesAutoConfiguration.class, MongoDataAutoConfiguration.class }) public class DashboardApplication { public static void main(String[] args) throws Exception { From 82757b243ad1865e12b5127ededb0f83b2dc35d5 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 7 Feb 2023 14:42:21 +0000 Subject: [PATCH 414/592] =?UTF-8?q?[JAVA-18123]=20Upgraded=20algorithms-mo?= =?UTF-8?q?dules=20to=20java=2011=20+=20Upgraded=20unit=20t=E2=80=A6=20(#1?= =?UTF-8?q?3437)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [JAVA-18123] Upgraded algorithms-modules to java 11 + Upgraded unit tests to junit5 * [JAVA-18123] Clean up properties --------- Co-authored-by: panagiotiskakos --- ...ColonyOptimizationLongRunningUnitTest.java | 16 +++--- ...ryGeneticAlgorithmLongRunningUnitTest.java | 13 +++-- ...SimulatedAnnealingLongRunningUnitTest.java | 12 ++-- .../HillClimbingAlgorithmUnitTest.java | 20 ++++--- ...FiniteStateMachineLongRunningUnitTest.java | 28 ++++++---- .../kthlargest/FindKthLargestUnitTest.java | 22 ++++---- .../algorithms/minimax/MinimaxUnitTest.java | 19 ++++--- .../DijkstraAlgorithmLongRunningUnitTest.java | 6 +- .../RouteFinderIntegrationTest.java | 13 +++-- .../EditDistanceDataProvider.java | 21 ------- .../editdistance/EditDistanceUnitTest.java | 45 ++++++++------- .../CycleDetectionBruteForceUnitTest.java | 25 +++------ ...tectionByFastAndSlowIteratorsUnitTest.java | 25 +++------ .../CycleDetectionByHashingUnitTest.java | 26 ++++----- .../linkedlist/CycleDetectionTestBase.java | 2 +- .../CycleRemovalBruteForceUnitTest.java | 29 ++++------ ...cleRemovalByCountingLoopNodesUnitTest.java | 27 ++++----- ...movalWithoutCountingLoopNodesUnitTest.java | 29 ++++------ .../NumberWordConverterUnitTest.java | 34 ++++++------ .../jgrapht/CompleteGraphUnitTest.java | 12 ++-- .../jgrapht/DirectedGraphUnitTest.java | 26 +++++---- .../jgrapht/EulerianCircuitUnitTest.java | 12 ++-- .../jgrapht/GraphImageGenerationUnitTest.java | 18 +++--- .../analysis/AnalysisRunnerLiveTest.java | 20 +++---- .../SortedListCheckerUnitTest.java | 36 ++++++------ .../LeaveRequestStateUnitTest.java | 22 ++++---- .../GraphCycleDetectionUnitTest.java | 10 ++-- .../PrintTriangleExamplesUnitTest.java | 33 +++++------ .../RomanArabicConverterUnitTest.java | 9 +-- .../LinkedListFindMiddleUnitTest.java | 6 +- .../RotateArrayUnitTest.java | 8 +-- .../twopointertechnique/TwoSumUnitTest.java | 17 +++--- .../com/baeldung/counter/CounterUnitTest.java | 16 +++--- .../baeldung/folding/FoldingHashUnitTest.java | 22 ++++---- .../MiddleElementLookupUnitTest.java | 19 ++++--- .../algorithms-miscellaneous-5/pom.xml | 17 ++++++ .../conversion/HexStringConverter.java | 6 +- .../BalancedBinaryTreeUnitTest.java | 17 +++--- .../binarygap/BinaryGapUnitTest.java | 14 +++-- .../combinatorics/CombinatoricsUnitTest.java | 23 ++++---- .../ByteArrayConverterUnitTest.java | 44 ++++++++------- .../MedianOfIntegerStreamUnitTest.java | 12 ++-- .../algorithms/knapsack/KnapsackUnitTest.java | 8 +-- .../SortedArraysUnitTest.java | 6 +- .../algorithms/prim/PrimUnitTest.java | 7 ++- .../RelativelyPrimeUnitTest.java | 18 +++--- .../reversingtree/TreeReverserUnitTest.java | 6 +- .../BalancedBracketsUsingDequeUnitTest.java | 31 ++++++----- .../BalancedBracketsUsingStringUnitTest.java | 31 ++++++----- .../algorithms/boruvka/BoruvkaUnitTest.java | 10 ++-- .../GradientDescentUnitTest.java | 8 +-- .../greedy/GreedyAlgorithmUnitTest.java | 17 +++--- .../algorithms/kruskal/KruskalUnitTest.java | 20 ++++--- .../LinkedListReversalUnitTest.java | 12 ++-- .../minheapmerge/MinHeapUnitTest.java | 8 +-- .../TopKElementsFinderUnitTest.java | 16 +++--- .../algorithms/luhn/LuhnCheckerUnitTest.java | 55 ++++++++++--------- .../binarysearch/BinarySearchUnitTest.java | 24 ++++---- .../algorithms/dfs/BinaryTreeUnitTest.java | 30 +++++----- .../algorithms/dfs/GraphUnitTest.java | 8 +-- .../InterpolationSearchUnitTest.java | 13 +++-- .../kthsmallest/KthSmallestUnitTest.java | 12 ++-- .../algorithms/mcts/MCTSUnitTest.java | 25 +++++---- .../quadtree/QuadTreeSearchUnitTest.java | 25 +++++---- .../suffixtree/SuffixTreeUnitTest.java | 35 ++++++------ .../TextSearchAlgorithmsUnitTest.java | 19 ++++--- .../NaturalOrderComparatorsUnitTest.java | 18 +++--- .../gravitysort/GravitySortUnitTest.java | 11 ++-- .../inoutsort/InOutSortUnitTest.java | 15 +++-- .../BentleyMcilroyPartitioningUnitTest.java | 11 ++-- .../DNFThreeWayQuickSortUnitTest.java | 11 ++-- .../bubblesort/BubbleSortUnitTest.java | 6 +- .../IntegerBucketSorterUnitTest.java | 16 +++--- .../algorithms/heapsort/HeapUnitTest.java | 10 ++-- .../insertionsort/InsertionSortUnitTest.java | 16 +++--- .../mergesort/MergeSortUnitTest.java | 10 ++-- .../quicksort/QuickSortUnitTest.java | 12 ++-- .../quicksort/ThreeWayQuickSortUnitTest.java | 9 +-- .../radixsort/RadixSortUnitTest.java | 8 +-- .../selectionsort/SelectionSortUnitTest.java | 15 +++-- .../shellsort/ShellSortUnitTest.java | 12 ++-- pom.xml | 6 +- 82 files changed, 740 insertions(+), 721 deletions(-) delete mode 100644 algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java diff --git a/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java b/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java index 2ac7adc3aa..f828d148ba 100644 --- a/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java +++ b/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/AntColonyOptimizationLongRunningUnitTest.java @@ -1,22 +1,24 @@ package com.baeldung.algorithms; -import org.junit.Assert; -import org.junit.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.junit.jupiter.api.Test; import com.baeldung.algorithms.ga.ant_colony.AntColonyOptimization; -public class AntColonyOptimizationLongRunningUnitTest { +class AntColonyOptimizationLongRunningUnitTest { @Test - public void testGenerateRandomMatrix() { + void testGenerateRandomMatrix() { AntColonyOptimization antTSP = new AntColonyOptimization(5); - Assert.assertNotNull(antTSP.generateRandomMatrix(5)); + assertNotNull(antTSP.generateRandomMatrix(5)); } @Test - public void testStartAntOptimization() { + void testStartAntOptimization() { AntColonyOptimization antTSP = new AntColonyOptimization(5); - Assert.assertNotNull(antTSP.solve()); + assertNotNull(antTSP.solve()); } } diff --git a/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java b/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java index e819da4b36..a2f869e171 100644 --- a/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java +++ b/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/BinaryGeneticAlgorithmLongRunningUnitTest.java @@ -1,16 +1,19 @@ package com.baeldung.algorithms; -import org.junit.Assert; -import org.junit.Test; + + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; import com.baeldung.algorithms.ga.binary.SimpleGeneticAlgorithm; -public class BinaryGeneticAlgorithmLongRunningUnitTest { +class BinaryGeneticAlgorithmLongRunningUnitTest { @Test - public void testGA() { + void testGA() { SimpleGeneticAlgorithm ga = new SimpleGeneticAlgorithm(); - Assert.assertTrue(ga.runAlgorithm(50, "1011000100000100010000100000100111001000000100000100000000001111")); + assertTrue(ga.runAlgorithm(50, "1011000100000100010000100000100111001000000100000100000000001111")); } } diff --git a/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java b/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java index 2ce7d75e43..461e3e9128 100644 --- a/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java +++ b/algorithms-modules/algorithms-genetic/src/test/java/com/baeldung/algorithms/SimulatedAnnealingLongRunningUnitTest.java @@ -1,15 +1,17 @@ package com.baeldung.algorithms; -import org.junit.Assert; -import org.junit.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; import com.baeldung.algorithms.ga.annealing.SimulatedAnnealing; -public class SimulatedAnnealingLongRunningUnitTest { +class SimulatedAnnealingLongRunningUnitTest { @Test - public void testSimulateAnnealing() { - Assert.assertTrue(SimulatedAnnealing.simulateAnnealing(10, 1000, 0.9) > 0); + void testSimulateAnnealing() { + assertTrue(SimulatedAnnealing.simulateAnnealing(10, 1000, 0.9) > 0); } } diff --git a/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java b/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java index e817d195b3..4e8f927750 100644 --- a/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/HillClimbingAlgorithmUnitTest.java @@ -1,23 +1,25 @@ package com.baeldung.algorithms; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import com.baeldung.algorithms.hillclimbing.HillClimbing; import com.baeldung.algorithms.hillclimbing.State; -import org.junit.Before; -import org.junit.Test; import java.util.ArrayList; import java.util.List; import java.util.Stack; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -public class HillClimbingAlgorithmUnitTest { +class HillClimbingAlgorithmUnitTest { private Stack initStack; private Stack goalStack; - @Before + @BeforeEach public void initStacks() { String blockArr[] = { "B", "C", "D", "A" }; String goalBlockArr[] = { "A", "B", "C", "D" }; @@ -30,7 +32,7 @@ public class HillClimbingAlgorithmUnitTest { } @Test - public void givenInitAndGoalState_whenGetPathWithHillClimbing_thenPathFound() { + void givenInitAndGoalState_whenGetPathWithHillClimbing_thenPathFound() { HillClimbing hillClimbing = new HillClimbing(); List path; @@ -46,7 +48,7 @@ public class HillClimbingAlgorithmUnitTest { } @Test - public void givenCurrentState_whenFindNextState_thenBetterHeuristics() { + void givenCurrentState_whenFindNextState_thenBetterHeuristics() { HillClimbing hillClimbing = new HillClimbing(); List> initList = new ArrayList<>(); initList.add(initStack); diff --git a/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java b/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java index fddccfcd9f..f3e896541d 100644 --- a/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/RtFiniteStateMachineLongRunningUnitTest.java @@ -1,14 +1,16 @@ package com.baeldung.algorithms; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + import com.baeldung.algorithms.automata.*; -import org.junit.Test; -import static org.junit.Assert.assertTrue; - -public final class RtFiniteStateMachineLongRunningUnitTest { +class RtFiniteStateMachineLongRunningUnitTest { @Test - public void acceptsSimplePair() { + void acceptsSimplePair() { String json = "{\"key\":\"value\"}"; FiniteStateMachine machine = this.buildJsonStateMachine(); for (int i = 0; i < json.length(); i++) { @@ -18,7 +20,7 @@ public final class RtFiniteStateMachineLongRunningUnitTest { } @Test - public void acceptsMorePairs() { + void acceptsMorePairs() { String json = "{\"key1\":\"value1\",\"key2\":\"value2\"}"; FiniteStateMachine machine = this.buildJsonStateMachine(); for (int i = 0; i < json.length(); i++) { @@ -27,13 +29,15 @@ public final class RtFiniteStateMachineLongRunningUnitTest { assertTrue(machine.canStop()); } - @Test(expected = IllegalArgumentException.class) - public void missingColon() { + @Test + void missingColon() { String json = "{\"key\"\"value\"}"; - FiniteStateMachine machine = this.buildJsonStateMachine(); - for (int i = 0; i < json.length(); i++) { - machine = machine.switchState(String.valueOf(json.charAt(i))); - } + assertThrows(IllegalArgumentException.class, () -> { + FiniteStateMachine machine = this.buildJsonStateMachine(); + for (int i = 0; i < json.length(); i++) { + machine = machine.switchState(String.valueOf(json.charAt(i))); + } + }); } /** diff --git a/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java b/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java index 6fbb7c163a..e877d9945a 100644 --- a/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java @@ -1,54 +1,54 @@ package com.baeldung.algorithms.kthlargest; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -public class FindKthLargestUnitTest { +class FindKthLargestUnitTest { private FindKthLargest findKthLargest; private Integer[] arr = { 3, 7, 1, 2, 8, 10, 4, 5, 6, 9 }; - @Before + @BeforeEach public void setup() { findKthLargest = new FindKthLargest(); } @Test - public void givenIntArray_whenFindKthLargestBySorting_thenGetResult() { + void givenIntArray_whenFindKthLargestBySorting_thenGetResult() { int k = 3; assertThat(findKthLargest.findKthLargestBySorting(arr, k)).isEqualTo(8); } @Test - public void givenIntArray_whenFindKthLargestBySortingDesc_thenGetResult() { + void givenIntArray_whenFindKthLargestBySortingDesc_thenGetResult() { int k = 3; assertThat(findKthLargest.findKthLargestBySortingDesc(arr, k)).isEqualTo(8); } @Test - public void givenIntArray_whenFindKthLargestByQuickSelect_thenGetResult() { + void givenIntArray_whenFindKthLargestByQuickSelect_thenGetResult() { int k = 3; int kthLargest = arr.length - k; assertThat(findKthLargest.findKthElementByQuickSelect(arr, 0, arr.length - 1, kthLargest)).isEqualTo(8); } @Test - public void givenIntArray_whenFindKthElementByQuickSelectIterative_thenGetResult() { + void givenIntArray_whenFindKthElementByQuickSelectIterative_thenGetResult() { int k = 3; int kthLargest = arr.length - k; assertThat(findKthLargest.findKthElementByQuickSelectWithIterativePartition(arr, 0, arr.length - 1, kthLargest)).isEqualTo(8); } @Test - public void givenIntArray_whenFindKthSmallestByQuickSelect_thenGetResult() { + void givenIntArray_whenFindKthSmallestByQuickSelect_thenGetResult() { int k = 3; assertThat(findKthLargest.findKthElementByQuickSelect(arr, 0, arr.length - 1, k - 1)).isEqualTo(3); } @Test - public void givenIntArray_whenFindKthLargestByRandomizedQuickSelect_thenGetResult() { + void givenIntArray_whenFindKthLargestByRandomizedQuickSelect_thenGetResult() { int k = 3; int kthLargest = arr.length - k; assertThat(findKthLargest.findKthElementByRandomizedQuickSelect(arr, 0, arr.length - 1, kthLargest)).isEqualTo(8); diff --git a/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java b/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java index 59f0fcf053..e36e3651de 100644 --- a/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/minimax/MinimaxUnitTest.java @@ -1,23 +1,24 @@ package com.baeldung.algorithms.minimax; -import org.junit.Before; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.Assert.*; -import com.baeldung.algorithms.minimax.MiniMax; -import com.baeldung.algorithms.minimax.Tree; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -public class MinimaxUnitTest { +class MinimaxUnitTest { private Tree gameTree; private MiniMax miniMax; - @Before + @BeforeEach public void initMiniMaxUtility() { miniMax = new MiniMax(); } @Test - public void givenMiniMax_whenConstructTree_thenNotNullTree() { + void givenMiniMax_whenConstructTree_thenNotNullTree() { assertNull(gameTree); miniMax.constructTree(6); gameTree = miniMax.getTree(); @@ -25,7 +26,7 @@ public class MinimaxUnitTest { } @Test - public void givenMiniMax_whenCheckWin_thenComputeOptimal() { + void givenMiniMax_whenCheckWin_thenComputeOptimal() { miniMax.constructTree(6); boolean result = miniMax.checkWin(); assertTrue(result); diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java index bbc4d4f398..7e80d335be 100644 --- a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/DijkstraAlgorithmLongRunningUnitTest.java @@ -1,6 +1,6 @@ package com.baeldung.algorithms; -import org.junit.Test; + import com.baeldung.algorithms.ga.dijkstra.Dijkstra; import com.baeldung.algorithms.ga.dijkstra.Graph; @@ -11,7 +11,9 @@ import java.util.List; import static org.junit.Assert.assertTrue; -public class DijkstraAlgorithmLongRunningUnitTest { +import org.junit.jupiter.api.Test; + +class DijkstraAlgorithmLongRunningUnitTest { @Test public void whenSPPSolved_thenCorrect() { diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java index aba7f149da..ba492b33cf 100644 --- a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java +++ b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/astar/underground/RouteFinderIntegrationTest.java @@ -1,5 +1,6 @@ package com.baeldung.algorithms.astar.underground; + import static org.assertj.core.api.Assertions.assertThat; import java.util.HashMap; @@ -10,22 +11,22 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import com.baeldung.algorithms.astar.Graph; import com.baeldung.algorithms.astar.RouteFinder; import lombok.extern.slf4j.Slf4j; -import org.junit.Before; -import org.junit.Test; - @Slf4j -public class RouteFinderIntegrationTest { +class RouteFinderIntegrationTest { private Graph underground; private RouteFinder routeFinder; - @Before + @BeforeEach public void setUp() throws Exception { Set stations = new HashSet<>(); Map> connections = new HashMap<>(); @@ -641,7 +642,7 @@ public class RouteFinderIntegrationTest { } @Test - public void findRoute() { + void findRoute() { List route = routeFinder.findRoute(underground.getNode("74"), underground.getNode("7")); assertThat(route).size().isPositive(); diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java deleted file mode 100644 index d11da61191..0000000000 --- a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceDataProvider.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.algorithms.editdistance; - -import org.junit.runners.Parameterized.Parameters; - -import java.util.Arrays; -import java.util.Collection; - -public class EditDistanceDataProvider { - - @Parameters - public static Collection getLists() { - return Arrays.asList(new Object[][] { - { "", "", 0 }, - { "ago", "", 3 }, - { "", "do", 2 }, - { "abc", "adc", 1 }, - { "peek", "pesek", 1 }, - { "sunday", "saturday", 3 } - }); - } -} diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java index 3dd63e86ab..044c8fc268 100644 --- a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/editdistance/EditDistanceUnitTest.java @@ -1,32 +1,39 @@ package com.baeldung.algorithms.editdistance; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; -@RunWith(Parameterized.class) -public class EditDistanceUnitTest extends EditDistanceDataProvider { +import java.util.stream.Stream; - private String x; - private String y; - private int result; - public EditDistanceUnitTest(String a, String b, int res) { - super(); - x = a; - y = b; - result = res; - } +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; - @Test - public void testEditDistance_RecursiveImplementation() { +import org.junit.jupiter.params.provider.MethodSource; + +class EditDistanceUnitTest { + + @ParameterizedTest + @MethodSource("provideArguments") + void testEditDistance_RecursiveImplementation(String x, String y, int result) { assertEquals(result, EditDistanceRecursive.calculate(x, y)); } - @Test - public void testEditDistance_givenDynamicProgrammingImplementation() { + @ParameterizedTest + @MethodSource("provideArguments") + void testEditDistance_givenDynamicProgrammingImplementation(String x, String y, int result) { assertEquals(result, EditDistanceDynamicProgramming.calculate(x, y)); } + + + static Stream provideArguments() { + return Stream.of(new Object[][] { + { "", "", 0 }, + { "ago", "", 3 }, + { "", "do", 2 }, + { "abc", "adc", 1 }, + { "peek", "pesek", 1 }, + { "sunday", "saturday", 3 } + }).map(Arguments::of); + } } diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java index 33889fbec6..a2bcb07ce3 100644 --- a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionBruteForceUnitTest.java @@ -1,23 +1,16 @@ package com.baeldung.algorithms.linkedlist; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import static org.junit.jupiter.api.Assertions.assertEquals; -@RunWith(value = Parameterized.class) -public class CycleDetectionBruteForceUnitTest extends CycleDetectionTestBase { - boolean cycleExists; - Node head; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; - public CycleDetectionBruteForceUnitTest(Node head, boolean cycleExists) { - super(); - this.cycleExists = cycleExists; - this.head = head; - } +class CycleDetectionBruteForceUnitTest extends CycleDetectionTestBase { - @Test - public void givenList_detectLoop() { - Assert.assertEquals(cycleExists, CycleDetectionBruteForce.detectCycle(head).cycleExists); + + @ParameterizedTest + @MethodSource("getLists") + void givenList_detectLoop(Node head, boolean cycleExists) { + assertEquals(cycleExists, CycleDetectionBruteForce.detectCycle(head).cycleExists); } } diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java index 1496840771..6acd8a2bef 100644 --- a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByFastAndSlowIteratorsUnitTest.java @@ -1,23 +1,16 @@ package com.baeldung.algorithms.linkedlist; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -@RunWith(value = Parameterized.class) -public class CycleDetectionByFastAndSlowIteratorsUnitTest extends CycleDetectionTestBase { - boolean cycleExists; - Node head; +import static org.junit.jupiter.api.Assertions.assertEquals; - public CycleDetectionByFastAndSlowIteratorsUnitTest(Node head, boolean cycleExists) { - super(); - this.cycleExists = cycleExists; - this.head = head; - } +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; - @Test - public void givenList_detectLoop() { - Assert.assertEquals(cycleExists, CycleDetectionByFastAndSlowIterators.detectCycle(head).cycleExists); +class CycleDetectionByFastAndSlowIteratorsUnitTest extends CycleDetectionTestBase { + + @ParameterizedTest + @MethodSource("getLists") + void givenList_detectLoop(Node head, boolean cycleExists) { + assertEquals(cycleExists, CycleDetectionByFastAndSlowIterators.detectCycle(head).cycleExists); } } diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java index 136f55f834..905423e337 100644 --- a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionByHashingUnitTest.java @@ -1,23 +1,17 @@ package com.baeldung.algorithms.linkedlist; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -@RunWith(value = Parameterized.class) -public class CycleDetectionByHashingUnitTest extends CycleDetectionTestBase { - boolean cycleExists; - Node head; +import static org.junit.jupiter.api.Assertions.assertEquals; - public CycleDetectionByHashingUnitTest(Node head, boolean cycleExists) { - super(); - this.cycleExists = cycleExists; - this.head = head; - } +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; - @Test - public void givenList_detectLoop() { - Assert.assertEquals(cycleExists, CycleDetectionByHashing.detectCycle(head).cycleExists); + +class CycleDetectionByHashingUnitTest extends CycleDetectionTestBase { + + @ParameterizedTest + @MethodSource("getLists") + void givenList_detectLoop(Node head, boolean cycleExists) { + assertEquals(cycleExists, CycleDetectionByHashing.detectCycle(head).cycleExists); } } diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java index 1c6f56b20d..b4d0bf5459 100644 --- a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java +++ b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleDetectionTestBase.java @@ -7,7 +7,7 @@ import org.junit.runners.Parameterized.Parameters; public class CycleDetectionTestBase { - @Parameters + public static Collection getLists() { return Arrays.asList(new Object[][] { { createList(), false }, diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java index 36f08d2b76..6dc6ff9f58 100644 --- a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalBruteForceUnitTest.java @@ -1,24 +1,19 @@ package com.baeldung.algorithms.linkedlist; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -@RunWith(value = Parameterized.class) -public class CycleRemovalBruteForceUnitTest extends CycleDetectionTestBase { - boolean cycleExists; - Node head; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; - public CycleRemovalBruteForceUnitTest(Node head, boolean cycleExists) { - super(); - this.cycleExists = cycleExists; - this.head = head; - } +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; - @Test - public void givenList_ifLoopExists_thenDetectAndRemoveLoop() { - Assert.assertEquals(cycleExists, CycleRemovalBruteForce.detectAndRemoveCycle(head)); - Assert.assertFalse(CycleDetectionByFastAndSlowIterators.detectCycle(head).cycleExists); + +class CycleRemovalBruteForceUnitTest extends CycleDetectionTestBase { + + @ParameterizedTest + @MethodSource("getLists") + void givenList_ifLoopExists_thenDetectAndRemoveLoop(Node head, boolean cycleExists) { + assertEquals(cycleExists, CycleRemovalBruteForce.detectAndRemoveCycle(head)); + assertFalse(CycleDetectionByFastAndSlowIterators.detectCycle(head).cycleExists); } } diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java index cc7589c53d..c82f175488 100644 --- a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalByCountingLoopNodesUnitTest.java @@ -1,24 +1,17 @@ package com.baeldung.algorithms.linkedlist; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; -@RunWith(value = Parameterized.class) -public class CycleRemovalByCountingLoopNodesUnitTest extends CycleDetectionTestBase { - boolean cycleExists; - Node head; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; - public CycleRemovalByCountingLoopNodesUnitTest(Node head, boolean cycleExists) { - super(); - this.cycleExists = cycleExists; - this.head = head; - } +class CycleRemovalByCountingLoopNodesUnitTest extends CycleDetectionTestBase { - @Test - public void givenList_ifLoopExists_thenDetectAndRemoveLoop() { - Assert.assertEquals(cycleExists, CycleRemovalByCountingLoopNodes.detectAndRemoveCycle(head)); - Assert.assertFalse(CycleDetectionByFastAndSlowIterators.detectCycle(head).cycleExists); + @ParameterizedTest + @MethodSource("getLists") + void givenList_ifLoopExists_thenDetectAndRemoveLoop(Node head, boolean cycleExists) { + assertEquals(cycleExists, CycleRemovalByCountingLoopNodes.detectAndRemoveCycle(head)); + assertFalse(CycleDetectionByFastAndSlowIterators.detectCycle(head).cycleExists); } } diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java index 350e63dcc3..3ffb9ac639 100644 --- a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/linkedlist/CycleRemovalWithoutCountingLoopNodesUnitTest.java @@ -1,24 +1,19 @@ package com.baeldung.algorithms.linkedlist; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -@RunWith(value = Parameterized.class) -public class CycleRemovalWithoutCountingLoopNodesUnitTest extends CycleDetectionTestBase { - boolean cycleExists; - Node head; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; - public CycleRemovalWithoutCountingLoopNodesUnitTest(Node head, boolean cycleExists) { - super(); - this.cycleExists = cycleExists; - this.head = head; - } +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; - @Test - public void givenList_ifLoopExists_thenDetectAndRemoveLoop() { - Assert.assertEquals(cycleExists, CycleRemovalWithoutCountingLoopNodes.detectAndRemoveCycle(head)); - Assert.assertFalse(CycleDetectionByFastAndSlowIterators.detectCycle(head).cycleExists); + +class CycleRemovalWithoutCountingLoopNodesUnitTest extends CycleDetectionTestBase { + + @ParameterizedTest + @MethodSource("getLists") + void givenList_ifLoopExists_thenDetectAndRemoveLoop(Node head, boolean cycleExists) { + assertEquals(cycleExists, CycleRemovalWithoutCountingLoopNodes.detectAndRemoveCycle(head)); + assertFalse(CycleDetectionByFastAndSlowIterators.detectCycle(head).cycleExists); } } \ No newline at end of file diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java index 26643e9c1e..1b94643e8a 100644 --- a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterUnitTest.java @@ -1,84 +1,84 @@ package com.baeldung.algorithms.moneywords; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.Test; +import org.junit.jupiter.api.Test; import com.baeldung.algorithms.numberwordconverter.NumberWordConverter; -public class NumberWordConverterUnitTest { +class NumberWordConverterUnitTest { @Test - public void whenMoneyNegative_thenReturnInvalidInput() { + void whenMoneyNegative_thenReturnInvalidInput() { assertEquals(NumberWordConverter.INVALID_INPUT_GIVEN, NumberWordConverter.getMoneyIntoWords(-13)); } @Test - public void whenZeroDollarsGiven_thenReturnEmptyString() { + void whenZeroDollarsGiven_thenReturnEmptyString() { assertEquals("", NumberWordConverter.getMoneyIntoWords(0)); } @Test - public void whenOnlyDollarsGiven_thenReturnWords() { + void whenOnlyDollarsGiven_thenReturnWords() { assertEquals("one dollar", NumberWordConverter.getMoneyIntoWords(1)); } @Test - public void whenOnlyCentsGiven_thenReturnWords() { + void whenOnlyCentsGiven_thenReturnWords() { assertEquals("sixty cents", NumberWordConverter.getMoneyIntoWords(0.6)); } @Test - public void whenAlmostAMillioDollarsGiven_thenReturnWords() { + void whenAlmostAMillioDollarsGiven_thenReturnWords() { String expectedResult = "nine hundred ninety nine thousand nine hundred ninety nine dollars"; assertEquals(expectedResult, NumberWordConverter.getMoneyIntoWords(999_999)); } @Test - public void whenThirtyMillionDollarsGiven_thenReturnWords() { + void whenThirtyMillionDollarsGiven_thenReturnWords() { String expectedResult = "thirty three million three hundred forty eight thousand nine hundred seventy eight dollars"; assertEquals(expectedResult, NumberWordConverter.getMoneyIntoWords(33_348_978)); } @Test - public void whenTwoBillionDollarsGiven_thenReturnWords() { + void whenTwoBillionDollarsGiven_thenReturnWords() { String expectedResult = "two billion one hundred thirty three million two hundred forty seven thousand eight hundred ten dollars"; assertEquals(expectedResult, NumberWordConverter.getMoneyIntoWords(2_133_247_810)); } @Test - public void whenGivenDollarsAndCents_thenReturnWords() { + void whenGivenDollarsAndCents_thenReturnWords() { String expectedResult = "nine hundred twenty four dollars and sixty cents"; assertEquals(expectedResult, NumberWordConverter.getMoneyIntoWords(924.6)); } @Test - public void whenOneDollarAndNoCents_thenReturnDollarSingular() { + void whenOneDollarAndNoCents_thenReturnDollarSingular() { assertEquals("one dollar", NumberWordConverter.getMoneyIntoWords(1)); } @Test - public void whenNoDollarsAndOneCent_thenReturnCentSingular() { + void whenNoDollarsAndOneCent_thenReturnCentSingular() { assertEquals("one cent", NumberWordConverter.getMoneyIntoWords(0.01)); } @Test - public void whenNoDollarsAndTwoCents_thenReturnCentsPlural() { + void whenNoDollarsAndTwoCents_thenReturnCentsPlural() { assertEquals("two cents", NumberWordConverter.getMoneyIntoWords(0.02)); } @Test - public void whenNoDollarsAndNinetyNineCents_thenReturnWords() { + void whenNoDollarsAndNinetyNineCents_thenReturnWords() { assertEquals("ninety nine cents", NumberWordConverter.getMoneyIntoWords(0.99)); } @Test - public void whenNoDollarsAndNineFiveNineCents_thenCorrectRounding() { + void whenNoDollarsAndNineFiveNineCents_thenCorrectRounding() { assertEquals("ninety six cents", NumberWordConverter.getMoneyIntoWords(0.959)); } @Test - public void whenGivenDollarsAndCents_thenReturnWordsVersionTwo() { + void whenGivenDollarsAndCents_thenReturnWordsVersionTwo() { assertEquals("three hundred ten £ 00/100", NumberWordConverter.getMoneyIntoWords("310")); } } diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java index 0b0d6ae822..c95f1bc6e8 100644 --- a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/CompleteGraphUnitTest.java @@ -1,6 +1,8 @@ package com.baeldung.jgrapht; -import static org.junit.Assert.assertEquals; + + +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; @@ -9,15 +11,15 @@ import org.jgrapht.alg.HamiltonianCycle; import org.jgrapht.generate.CompleteGraphGenerator; import org.jgrapht.graph.DefaultEdge; import org.jgrapht.graph.SimpleWeightedGraph; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -public class CompleteGraphUnitTest { +class CompleteGraphUnitTest { static SimpleWeightedGraph completeGraph; static int size = 10; - @Before + @BeforeEach public void createCompleteGraph() { completeGraph = new SimpleWeightedGraph<>(DefaultEdge.class); CompleteGraphGenerator completeGenerator = new CompleteGraphGenerator(size); diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java index 3aebaf49a2..ad3433cc21 100644 --- a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/DirectedGraphUnitTest.java @@ -1,7 +1,9 @@ package com.baeldung.jgrapht; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; + + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.ArrayList; import java.util.List; @@ -21,13 +23,13 @@ import org.jgrapht.graph.DefaultEdge; import org.jgrapht.graph.DirectedSubgraph; import org.jgrapht.traverse.BreadthFirstIterator; import org.jgrapht.traverse.DepthFirstIterator; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -public class DirectedGraphUnitTest { +class DirectedGraphUnitTest { DirectedGraph directedGraph; - @Before + @BeforeEach public void createDirectedGraph() { directedGraph = new DefaultDirectedGraph(DefaultEdge.class); IntStream.range(1, 10).forEach(i -> { @@ -46,7 +48,7 @@ public class DirectedGraphUnitTest { } @Test - public void givenDirectedGraph_whenGetStronglyConnectedSubgraphs_thenPathExistsBetweenStronglyconnectedVertices() { + void givenDirectedGraph_whenGetStronglyConnectedSubgraphs_thenPathExistsBetweenStronglyconnectedVertices() { StrongConnectivityAlgorithm scAlg = new KosarajuStrongConnectivityInspector<>(directedGraph); List> stronglyConnectedSubgraphs = scAlg.stronglyConnectedSubgraphs(); List stronglyConnectedVertices = new ArrayList<>(stronglyConnectedSubgraphs.get(3).vertexSet()); @@ -60,7 +62,7 @@ public class DirectedGraphUnitTest { } @Test - public void givenDirectedGraphWithCycle_whenCheckCycles_thenDetectCycles() { + void givenDirectedGraphWithCycle_whenCheckCycles_thenDetectCycles() { CycleDetector cycleDetector = new CycleDetector(directedGraph); assertTrue(cycleDetector.detectCycles()); Set cycleVertices = cycleDetector.findCycles(); @@ -68,26 +70,26 @@ public class DirectedGraphUnitTest { } @Test - public void givenDirectedGraph_whenCreateInstanceDepthFirstIterator_thenGetIterator() { + void givenDirectedGraph_whenCreateInstanceDepthFirstIterator_thenGetIterator() { DepthFirstIterator depthFirstIterator = new DepthFirstIterator<>(directedGraph); assertNotNull(depthFirstIterator); } @Test - public void givenDirectedGraph_whenCreateInstanceBreadthFirstIterator_thenGetIterator() { + void givenDirectedGraph_whenCreateInstanceBreadthFirstIterator_thenGetIterator() { BreadthFirstIterator breadthFirstIterator = new BreadthFirstIterator<>(directedGraph); assertNotNull(breadthFirstIterator); } @Test - public void givenDirectedGraph_whenGetDijkstraShortestPath_thenGetNotNullPath() { + void givenDirectedGraph_whenGetDijkstraShortestPath_thenGetNotNullPath() { DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(directedGraph); List shortestPath = dijkstraShortestPath.getPath("v1", "v4").getVertexList(); assertNotNull(shortestPath); } @Test - public void givenDirectedGraph_whenGetBellmanFordShortestPath_thenGetNotNullPath() { + void givenDirectedGraph_whenGetBellmanFordShortestPath_thenGetNotNullPath() { BellmanFordShortestPath bellmanFordShortestPath = new BellmanFordShortestPath(directedGraph); List shortestPath = bellmanFordShortestPath.getPath("v1", "v4").getVertexList(); assertNotNull(shortestPath); diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java index 8cf1b70898..e47f53da75 100644 --- a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/EulerianCircuitUnitTest.java @@ -1,7 +1,7 @@ package com.baeldung.jgrapht; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; + +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.stream.IntStream; @@ -9,13 +9,13 @@ import org.jgrapht.GraphPath; import org.jgrapht.alg.cycle.HierholzerEulerianCycle; import org.jgrapht.graph.DefaultEdge; import org.jgrapht.graph.SimpleWeightedGraph; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -public class EulerianCircuitUnitTest { +class EulerianCircuitUnitTest { SimpleWeightedGraph simpleGraph; - @Before + @BeforeEach public void createGraphWithEulerianCircuit() { simpleGraph = new SimpleWeightedGraph<>(DefaultEdge.class); IntStream.range(1, 6).forEach(i -> { diff --git a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java index a0d7523f48..7fb1b28cca 100644 --- a/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java @@ -1,6 +1,8 @@ package com.baeldung.jgrapht; -import static org.junit.Assert.assertTrue; + + +import static org.junit.jupiter.api.Assertions.assertTrue; import java.awt.Color; import java.awt.image.BufferedImage; @@ -12,18 +14,18 @@ import javax.imageio.ImageIO; import org.jgrapht.ext.JGraphXAdapter; import org.jgrapht.graph.DefaultDirectedGraph; import org.jgrapht.graph.DefaultEdge; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import com.mxgraph.layout.mxCircleLayout; import com.mxgraph.layout.mxIGraphLayout; import com.mxgraph.util.mxCellRenderer; -public class GraphImageGenerationUnitTest { +class GraphImageGenerationUnitTest { static DefaultDirectedGraph g; - @Before + @BeforeEach public void createGraph() throws IOException { File imgFile = new File("src/test/resources/graph1.png"); imgFile.createNewFile(); @@ -39,14 +41,14 @@ public class GraphImageGenerationUnitTest { g.addEdge(x3, x1); } - @After + @AfterEach public void cleanup() { File imgFile = new File("src/test/resources/graph1.png"); imgFile.deleteOnExit(); } @Test - public void givenAdaptedGraph_whenWriteBufferedImage_ThenFileShouldExist() throws IOException { + void givenAdaptedGraph_whenWriteBufferedImage_ThenFileShouldExist() throws IOException { JGraphXAdapter graphAdapter = new JGraphXAdapter(g); mxIGraphLayout layout = new mxCircleLayout(graphAdapter); layout.execute(graphAdapter.getDefaultParent()); diff --git a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java index 1e9188f726..f3d9f7161a 100644 --- a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java +++ b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/analysis/AnalysisRunnerLiveTest.java @@ -1,14 +1,14 @@ package com.baeldung.algorithms.analysis; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class AnalysisRunnerLiveTest { +class AnalysisRunnerLiveTest { int n = 10; int total = 0; @Test - public void whenConstantComplexity_thenConstantRuntime() { + void whenConstantComplexity_thenConstantRuntime() { System.out.println("**** n = " + n + " ****"); System.out.println(); @@ -22,7 +22,7 @@ public class AnalysisRunnerLiveTest { } @Test - public void whenLogarithmicComplexity_thenLogarithmicRuntime() { + void whenLogarithmicComplexity_thenLogarithmicRuntime() { // Logarithmic Time System.out.println("**** Logarithmic Time ****"); for (int i = 1; i < n; i = i * 2) { @@ -34,7 +34,7 @@ public class AnalysisRunnerLiveTest { } @Test - public void whenLinearComplexity_thenLinearRuntime() { + void whenLinearComplexity_thenLinearRuntime() { // Linear Time System.out.println("**** Linear Time ****"); for (int i = 0; i < n; i++) { @@ -47,7 +47,7 @@ public class AnalysisRunnerLiveTest { } @Test - public void whenNLogNComplexity_thenNLogNRuntime() { + void whenNLogNComplexity_thenNLogNRuntime() { // N Log N Time System.out.println("**** nlogn Time ****"); total = 0; @@ -64,7 +64,7 @@ public class AnalysisRunnerLiveTest { } @Test - public void whenQuadraticComplexity_thenQuadraticRuntime() { + void whenQuadraticComplexity_thenQuadraticRuntime() { // Quadratic Time System.out.println("**** Quadratic Time ****"); total = 0; @@ -81,7 +81,7 @@ public class AnalysisRunnerLiveTest { } @Test - public void whenCubicComplexity_thenCubicRuntime() { + void whenCubicComplexity_thenCubicRuntime() { // Cubic Time System.out.println("**** Cubic Time ****"); total = 0; @@ -100,7 +100,7 @@ public class AnalysisRunnerLiveTest { } @Test - public void whenExponentialComplexity_thenExponentialRuntime() { + void whenExponentialComplexity_thenExponentialRuntime() { // Exponential Time System.out.println("**** Exponential Time ****"); total = 0; @@ -115,7 +115,7 @@ public class AnalysisRunnerLiveTest { } @Test - public void whenFactorialComplexity_thenFactorialRuntime() { + void whenFactorialComplexity_thenFactorialRuntime() { // Factorial Time System.out.println("**** Factorial Time ****"); total = 0; diff --git a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java index 44c4388e6c..e865aa010a 100644 --- a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checksortedlist/SortedListCheckerUnitTest.java @@ -11,10 +11,10 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -public class SortedListCheckerUnitTest { +class SortedListCheckerUnitTest { private List sortedListOfString; private List unsortedListOfString; @@ -23,7 +23,7 @@ public class SortedListCheckerUnitTest { private List employeesSortedByName; private List employeesNotSortedByName; - @Before + @BeforeEach public void setUp() { sortedListOfString = asList("Canada", "HK", "LA", "NJ", "NY"); unsortedListOfString = asList("LA", "HK", "NJ", "NY", "Canada"); @@ -34,72 +34,72 @@ public class SortedListCheckerUnitTest { } @Test - public void givenSortedList_whenUsingIterativeApproach_thenReturnTrue() { + void givenSortedList_whenUsingIterativeApproach_thenReturnTrue() { assertThat(checkIfSortedUsingIterativeApproach(sortedListOfString)).isTrue(); } @Test - public void givenSingleElementList_whenUsingIterativeApproach_thenReturnTrue() { + void givenSingleElementList_whenUsingIterativeApproach_thenReturnTrue() { assertThat(checkIfSortedUsingIterativeApproach(singletonList)).isTrue(); } @Test - public void givenUnsortedList_whenUsingIterativeApproach_thenReturnFalse() { + void givenUnsortedList_whenUsingIterativeApproach_thenReturnFalse() { assertThat(checkIfSortedUsingIterativeApproach(unsortedListOfString)).isFalse(); } @Test - public void givenSortedListOfEmployees_whenUsingIterativeApproach_thenReturnTrue() { + void givenSortedListOfEmployees_whenUsingIterativeApproach_thenReturnTrue() { assertThat(checkIfSortedUsingIterativeApproach(employeesSortedByName, Comparator.comparing(Employee::getName))).isTrue(); } @Test - public void givenUnsortedListOfEmployees_whenUsingIterativeApproach_thenReturnFalse() { + void givenUnsortedListOfEmployees_whenUsingIterativeApproach_thenReturnFalse() { assertThat(checkIfSortedUsingIterativeApproach(employeesNotSortedByName, Comparator.comparing(Employee::getName))).isFalse(); } @Test - public void givenSortedList_whenUsingRecursion_thenReturnTrue() { + void givenSortedList_whenUsingRecursion_thenReturnTrue() { assertThat(checkIfSortedUsingRecursion(sortedListOfString)).isTrue(); } @Test - public void givenSingleElementList_whenUsingRecursion_thenReturnTrue() { + void givenSingleElementList_whenUsingRecursion_thenReturnTrue() { assertThat(checkIfSortedUsingRecursion(singletonList)).isTrue(); } @Test - public void givenUnsortedList_whenUsingRecursion_thenReturnFalse() { + void givenUnsortedList_whenUsingRecursion_thenReturnFalse() { assertThat(checkIfSortedUsingRecursion(unsortedListOfString)).isFalse(); } @Test - public void givenSortedList_whenUsingGuavaOrdering_thenReturnTrue() { + void givenSortedList_whenUsingGuavaOrdering_thenReturnTrue() { assertThat(checkIfSortedUsingOrderingClass(sortedListOfString)).isTrue(); } @Test - public void givenUnsortedList_whenUsingGuavaOrdering_thenReturnFalse() { + void givenUnsortedList_whenUsingGuavaOrdering_thenReturnFalse() { assertThat(checkIfSortedUsingOrderingClass(unsortedListOfString)).isFalse(); } @Test - public void givenSortedListOfEmployees_whenUsingGuavaOrdering_thenReturnTrue() { + void givenSortedListOfEmployees_whenUsingGuavaOrdering_thenReturnTrue() { assertThat(checkIfSortedUsingOrderingClass(employeesSortedByName, Comparator.comparing(Employee::getName))).isTrue(); } @Test - public void givenUnsortedListOfEmployees_whenUsingGuavaOrdering_thenReturnFalse() { + void givenUnsortedListOfEmployees_whenUsingGuavaOrdering_thenReturnFalse() { assertThat(checkIfSortedUsingOrderingClass(employeesNotSortedByName, Comparator.comparing(Employee::getName))).isFalse(); } @Test - public void givenSortedList_whenUsingGuavaComparators_thenReturnTrue() { + void givenSortedList_whenUsingGuavaComparators_thenReturnTrue() { assertThat(checkIfSortedUsingComparators(sortedListOfString)).isTrue(); } @Test - public void givenUnsortedList_whenUsingGuavaComparators_thenReturnFalse() { + void givenUnsortedList_whenUsingGuavaComparators_thenReturnFalse() { assertThat(checkIfSortedUsingComparators(unsortedListOfString)).isFalse(); } diff --git a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java index 61ed6b3aec..5b48c884e4 100644 --- a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/enumstatemachine/LeaveRequestStateUnitTest.java @@ -1,37 +1,37 @@ package com.baeldung.algorithms.enumstatemachine; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class LeaveRequestStateUnitTest { +class LeaveRequestStateUnitTest { @Test - public void givenLeaveRequest_whenStateEscalated_thenResponsibleIsTeamLeader() { + void givenLeaveRequest_whenStateEscalated_thenResponsibleIsTeamLeader() { LeaveRequestState state = LeaveRequestState.Escalated; - assertEquals(state.responsiblePerson(), "Team Leader"); + assertEquals( "Team Leader", state.responsiblePerson()); } @Test - public void givenLeaveRequest_whenStateApproved_thenResponsibleIsDepartmentManager() { + void givenLeaveRequest_whenStateApproved_thenResponsibleIsDepartmentManager() { LeaveRequestState state = LeaveRequestState.Approved; - assertEquals(state.responsiblePerson(), "Department Manager"); + assertEquals( "Department Manager" , state.responsiblePerson()); } @Test - public void givenLeaveRequest_whenNextStateIsCalled_thenStateIsChanged() { + void givenLeaveRequest_whenNextStateIsCalled_thenStateIsChanged() { LeaveRequestState state = LeaveRequestState.Submitted; state = state.nextState(); - assertEquals(state, LeaveRequestState.Escalated); + assertEquals(LeaveRequestState.Escalated, state); state = state.nextState(); - assertEquals(state, LeaveRequestState.Approved); + assertEquals(LeaveRequestState.Approved, state); state = state.nextState(); - assertEquals(state, LeaveRequestState.Approved); + assertEquals(LeaveRequestState.Approved, state); } } diff --git a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java index 8d464d7b97..c54483dbbb 100644 --- a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/graphcycledetection/GraphCycleDetectionUnitTest.java @@ -1,14 +1,14 @@ package com.baeldung.algorithms.graphcycledetection; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.Test; +import org.junit.jupiter.api.Test; import com.baeldung.algorithms.graphcycledetection.domain.Graph; import com.baeldung.algorithms.graphcycledetection.domain.Vertex; -public class GraphCycleDetectionUnitTest { +class GraphCycleDetectionUnitTest { @Test public void givenGraph_whenCycleExists_thenReturnTrue() { @@ -33,7 +33,7 @@ public class GraphCycleDetectionUnitTest { } @Test - public void givenGraph_whenNoCycleExists_thenReturnFalse() { + void givenGraph_whenNoCycleExists_thenReturnFalse() { Vertex vertexA = new Vertex("A"); Vertex vertexB = new Vertex("B"); diff --git a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java index 97e99290c9..ad98d63388 100644 --- a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java @@ -1,14 +1,11 @@ package com.baeldung.algorithms.printtriangles; -import junitparams.JUnitParamsRunner; -import junitparams.Parameters; -import org.junit.Test; -import org.junit.runner.RunWith; +import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; -@RunWith(JUnitParamsRunner.class) -public class PrintTriangleExamplesUnitTest { +class PrintTriangleExamplesUnitTest { private static Object[][] rightTriangles() { String expected0 = ""; @@ -38,9 +35,9 @@ public class PrintTriangleExamplesUnitTest { }; } - @Test - @Parameters(method = "rightTriangles") - public void whenPrintARightTriangleIsCalled_ThenTheCorrectStringIsReturned(int nrOfRows, String expected) { + @ParameterizedTest + @MethodSource("rightTriangles") + void whenPrintARightTriangleIsCalled_ThenTheCorrectStringIsReturned(int nrOfRows, String expected) { String actual = PrintTriangleExamples.printARightTriangle(nrOfRows); assertEquals(expected, actual); @@ -74,24 +71,24 @@ public class PrintTriangleExamplesUnitTest { }; } - @Test - @Parameters(method = "isoscelesTriangles") - public void whenPrintAnIsoscelesTriangleIsCalled_ThenTheCorrectStringIsReturned(int nrOfRows, String expected) { + @ParameterizedTest + @MethodSource("isoscelesTriangles") + void whenPrintAnIsoscelesTriangleIsCalled_ThenTheCorrectStringIsReturned(int nrOfRows, String expected) { String actual = PrintTriangleExamples.printAnIsoscelesTriangle(nrOfRows); assertEquals(expected, actual); } - @Test - @Parameters(method = "isoscelesTriangles") + @ParameterizedTest + @MethodSource("isoscelesTriangles") public void whenPrintAnIsoscelesTriangleUsingStringUtilsIsCalled_ThenTheCorrectStringIsReturned(int nrOfRows, String expected) { String actual = PrintTriangleExamples.printAnIsoscelesTriangleUsingStringUtils(nrOfRows); assertEquals(expected, actual); } - - @Test - @Parameters(method = "isoscelesTriangles") + + @ParameterizedTest + @MethodSource("isoscelesTriangles") public void whenPrintAnIsoscelesTriangleUsingSubstringIsCalled_ThenTheCorrectStringIsReturned(int nrOfRows, String expected) { String actual = PrintTriangleExamples.printAnIsoscelesTriangleUsingSubstring(nrOfRows); diff --git a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java index 9043cfe9cc..4571a60509 100644 --- a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/romannumerals/RomanArabicConverterUnitTest.java @@ -1,13 +1,14 @@ package com.baeldung.algorithms.romannumerals; + import static org.assertj.core.api.Assertions.assertThat; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class RomanArabicConverterUnitTest { +class RomanArabicConverterUnitTest { @Test - public void given2018Roman_WhenConvertingToArabic_ThenReturn2018() { + void given2018Roman_WhenConvertingToArabic_ThenReturn2018() { String roman2018 = "MMXVIII"; @@ -17,7 +18,7 @@ public class RomanArabicConverterUnitTest { } @Test - public void given1999Arabic_WhenConvertingToRoman_ThenReturnMCMXCIX() { + void given1999Arabic_WhenConvertingToRoman_ThenReturnMCMXCIX() { int arabic1999 = 1999; diff --git a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java index 422a53fa3e..5aaf1711b9 100644 --- a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java @@ -2,14 +2,14 @@ package com.baeldung.algorithms.twopointertechnique; import static org.assertj.core.api.Assertions.assertThat; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class LinkedListFindMiddleUnitTest { +class LinkedListFindMiddleUnitTest { LinkedListFindMiddle linkedListFindMiddle = new LinkedListFindMiddle(); @Test - public void givenLinkedListOfMyNodes_whenLinkedListFindMiddle_thenCorrect() { + void givenLinkedListOfMyNodes_whenLinkedListFindMiddle_thenCorrect() { MyNode head = createNodesList(8); diff --git a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java index da227ae751..defc956a68 100644 --- a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java @@ -1,10 +1,10 @@ package com.baeldung.algorithms.twopointertechnique; -import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class RotateArrayUnitTest { +class RotateArrayUnitTest { private RotateArray rotateArray = new RotateArray(); @@ -13,7 +13,7 @@ public class RotateArrayUnitTest { private int step; @Test - public void givenAnArrayOfIntegers_whenRotateKsteps_thenCorrect() { + void givenAnArrayOfIntegers_whenRotateKsteps_thenCorrect() { inputArray = new int[] { 1, 2, 3, 4, 5, 6, 7 }; step = 4; diff --git a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java index aa76f8e1cf..9b017a9d06 100644 --- a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java @@ -1,11 +1,12 @@ package com.baeldung.algorithms.twopointertechnique; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class TwoSumUnitTest { +class TwoSumUnitTest { private TwoSum twoSum = new TwoSum(); @@ -14,7 +15,7 @@ public class TwoSumUnitTest { private int targetValue; @Test - public void givenASortedArrayOfIntegers_whenTwoSumSlow_thenPairExists() { + void givenASortedArrayOfIntegers_whenTwoSumSlow_thenPairExists() { sortedArray = new int[] { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 }; @@ -24,7 +25,7 @@ public class TwoSumUnitTest { } @Test - public void givenASortedArrayOfIntegers_whenTwoSumSlow_thenPairDoesNotExists() { + void givenASortedArrayOfIntegers_whenTwoSumSlow_thenPairDoesNotExists() { sortedArray = new int[] { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 }; @@ -34,7 +35,7 @@ public class TwoSumUnitTest { } @Test - public void givenASortedArrayOfIntegers_whenTwoSum_thenPairExists() { + void givenASortedArrayOfIntegers_whenTwoSum_thenPairExists() { sortedArray = new int[] { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 }; @@ -44,7 +45,7 @@ public class TwoSumUnitTest { } @Test - public void givenASortedArrayOfIntegers_whenTwoSum_thenPairDoesNotExists() { + void givenASortedArrayOfIntegers_whenTwoSum_thenPairDoesNotExists() { sortedArray = new int[] { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 }; diff --git a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java index 4f914bd289..4a60bcb213 100644 --- a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java @@ -1,18 +1,18 @@ package com.baeldung.counter; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.util.HashMap; import java.util.Map; -import static org.junit.Assert.*; - -import org.junit.Test; +import org.junit.jupiter.api.Test; import com.baeldung.counter.CounterUtil.MutableInteger; -public class CounterUnitTest { +class CounterUnitTest { @Test - public void whenMapWithWrapperAsCounter_runsSuccessfully() { + void whenMapWithWrapperAsCounter_runsSuccessfully() { Map counterMap = new HashMap<>(); CounterUtil.counterWithWrapperObject(counterMap); @@ -23,7 +23,7 @@ public class CounterUnitTest { } @Test - public void whenMapWithLambdaAndWrapperCounter_runsSuccessfully() { + void whenMapWithLambdaAndWrapperCounter_runsSuccessfully() { Map counterMap = new HashMap<>(); CounterUtil.counterWithLambdaAndWrapper(counterMap); @@ -34,7 +34,7 @@ public class CounterUnitTest { } @Test - public void whenMapWithMutableIntegerCounter_runsSuccessfully() { + void whenMapWithMutableIntegerCounter_runsSuccessfully() { Map counterMap = new HashMap<>(); CounterUtil.counterWithMutableInteger(counterMap); assertEquals(3, counterMap.get("China") @@ -44,7 +44,7 @@ public class CounterUnitTest { } @Test - public void whenMapWithPrimitiveArray_runsSuccessfully() { + void whenMapWithPrimitiveArray_runsSuccessfully() { Map counterMap = new HashMap<>(); CounterUtil.counterWithPrimitiveArray(counterMap); assertEquals(3, counterMap.get("China")[0]); diff --git a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java index 43e33d8378..4db4ebd337 100644 --- a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/folding/FoldingHashUnitTest.java @@ -1,22 +1,22 @@ package com.baeldung.folding; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class FoldingHashUnitTest { +class FoldingHashUnitTest { @Test - public void givenStringJavaLanguage_whenSize2Capacity100000_then48933() throws Exception { + void givenStringJavaLanguage_whenSize2Capacity100000_then48933() throws Exception { final FoldingHash hasher = new FoldingHash(); final int value = hasher.hash("Java language", 2, 100_000); assertEquals(value, 48933); } @Test - public void givenStringVaJaLanguage_whenSize2Capacity100000_thenSameAsJavaLanguage() throws Exception { + void givenStringVaJaLanguage_whenSize2Capacity100000_thenSameAsJavaLanguage() throws Exception { final FoldingHash hasher = new FoldingHash(); final int java = hasher.hash("Java language", 2, 100_000); final int vaja = hasher.hash("vaJa language", 2, 100_000); @@ -24,28 +24,28 @@ public class FoldingHashUnitTest { } @Test - public void givenSingleElementArray_whenOffset0Size2_thenSingleElement() throws Exception { + void givenSingleElementArray_whenOffset0Size2_thenSingleElement() throws Exception { final FoldingHash hasher = new FoldingHash(); final int[] value = hasher.extract(new int[] { 5 }, 0, 2); assertArrayEquals(new int[] { 5 }, value); } @Test - public void givenFiveElementArray_whenOffset0Size3_thenFirstThreeElements() throws Exception { + void givenFiveElementArray_whenOffset0Size3_thenFirstThreeElements() throws Exception { final FoldingHash hasher = new FoldingHash(); final int[] value = hasher.extract(new int[] { 1, 2, 3, 4, 5 }, 0, 3); assertArrayEquals(new int[] { 1, 2, 3 }, value); } @Test - public void givenFiveElementArray_whenOffset1Size2_thenTwoElements() throws Exception { + void givenFiveElementArray_whenOffset1Size2_thenTwoElements() throws Exception { final FoldingHash hasher = new FoldingHash(); final int[] value = hasher.extract(new int[] { 1, 2, 3, 4, 5 }, 1, 2); assertArrayEquals(new int[] { 2, 3 }, value); } @Test - public void givenFiveElementArray_whenOffset2SizeTooBig_thenElementsToTheEnd() throws Exception { + void givenFiveElementArray_whenOffset2SizeTooBig_thenElementsToTheEnd() throws Exception { final FoldingHash hasher = new FoldingHash(); final int[] value = hasher.extract(new int[] { 1, 2, 3, 4, 5 }, 2, 2000); assertArrayEquals(new int[] { 3, 4, 5 }, value); diff --git a/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java index 2cda0ccb36..0759f2c020 100644 --- a/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java @@ -1,18 +1,19 @@ package com.baeldung.algorithms; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + import com.baeldung.algorithms.middleelementlookup.MiddleElementLookup; import com.baeldung.algorithms.middleelementlookup.Node; -import org.junit.Test; import java.util.LinkedList; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; +import org.junit.jupiter.api.Test; -public class MiddleElementLookupUnitTest { +class MiddleElementLookupUnitTest { @Test - public void whenFindingMiddleLinkedList_thenMiddleFound() { + void whenFindingMiddleLinkedList_thenMiddleFound() { assertEquals("3", MiddleElementLookup .findMiddleElementLinkedList(createLinkedList(5)) .get()); @@ -22,7 +23,7 @@ public class MiddleElementLookupUnitTest { } @Test - public void whenFindingMiddleFromHead_thenMiddleFound() { + void whenFindingMiddleFromHead_thenMiddleFound() { assertEquals("3", MiddleElementLookup .findMiddleElementFromHead(createNodesList(5)) .get()); @@ -32,7 +33,7 @@ public class MiddleElementLookupUnitTest { } @Test - public void whenFindingMiddleFromHead1PassRecursively_thenMiddleFound() { + void whenFindingMiddleFromHead1PassRecursively_thenMiddleFound() { assertEquals("3", MiddleElementLookup .findMiddleElementFromHead1PassRecursively(createNodesList(5)) .get()); @@ -42,7 +43,7 @@ public class MiddleElementLookupUnitTest { } @Test - public void whenFindingMiddleFromHead1PassIteratively_thenMiddleFound() { + void whenFindingMiddleFromHead1PassIteratively_thenMiddleFound() { assertEquals("3", MiddleElementLookup .findMiddleElementFromHead1PassIteratively(createNodesList(5)) .get()); @@ -52,7 +53,7 @@ public class MiddleElementLookupUnitTest { } @Test - public void whenListEmptyOrNull_thenMiddleNotFound() { + void whenListEmptyOrNull_thenMiddleNotFound() { // null list assertFalse(MiddleElementLookup .findMiddleElementLinkedList(null) diff --git a/algorithms-modules/algorithms-miscellaneous-5/pom.xml b/algorithms-modules/algorithms-miscellaneous-5/pom.xml index 97c61cb88f..92b8e7d1f5 100644 --- a/algorithms-modules/algorithms-miscellaneous-5/pom.xml +++ b/algorithms-modules/algorithms-miscellaneous-5/pom.xml @@ -34,6 +34,23 @@ guava ${guava.version} + + + jakarta.xml.bind + jakarta.xml.bind-api + ${xml-bind-api.version} + + + + org.glassfish.jaxb + jaxb-runtime + ${jaxb-runtime.version} + + + 4.0.0 + 4.0.0 + + \ No newline at end of file diff --git a/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java index d3e251d3fd..ae434d88ad 100644 --- a/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java +++ b/algorithms-modules/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java @@ -2,13 +2,15 @@ package com.baeldung.algorithms.conversion; import java.math.BigInteger; -import javax.xml.bind.DatatypeConverter; + import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Hex; import com.google.common.io.BaseEncoding; +import jakarta.xml.bind.DatatypeConverter; + public class HexStringConverter { /** @@ -90,7 +92,7 @@ public class HexStringConverter { return DatatypeConverter.parseHexBinary(hexString); } - public String encodeUsingApacheCommons(byte[] bytes) throws DecoderException { + public String encodeUsingApacheCommons(byte[] bytes) { return Hex.encodeHexString(bytes); } diff --git a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java index 25f313f991..154bc80932 100644 --- a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/balancedbinarytree/BalancedBinaryTreeUnitTest.java @@ -1,22 +1,23 @@ package com.baeldung.algorithms.balancedbinarytree; -import org.junit.Test; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertFalse; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; -public class BalancedBinaryTreeUnitTest extends BinaryTreeDataProvider { +import org.junit.jupiter.api.Test; + +class BalancedBinaryTreeUnitTest extends BinaryTreeDataProvider { @Test - public void givenBalancedTrees_whenCallingIsBalanced_ShouldReturnTrue() { + void givenBalancedTrees_whenCallingIsBalanced_ShouldReturnTrue() { for (Tree tree : balancedTrees()) { - assertTrue(toString(tree) + " should be balanced", BalancedBinaryTree.isBalanced(tree)); + assertTrue(BalancedBinaryTree.isBalanced(tree), toString(tree) + " should be balanced"); } } @Test - public void givenUnbalancedTrees_whenCallingIsBalanced_ShouldReturnFalse() { + void givenUnbalancedTrees_whenCallingIsBalanced_ShouldReturnFalse() { for (Tree tree : unbalancedTrees()) { - assertFalse(toString(tree) + " should not be balanced", BalancedBinaryTree.isBalanced(tree)); + assertFalse(BalancedBinaryTree.isBalanced(tree), toString(tree) + " should not be balanced"); } } diff --git a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java index 304d36e2bb..7404c9b5bd 100644 --- a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/binarygap/BinaryGapUnitTest.java @@ -5,27 +5,31 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; -public class BinaryGapUnitTest { +class BinaryGapUnitTest { - @Test public void givenNoOccurrenceOfBoundedZeros_whenCalculateBinaryGap_thenOutputCorrectResult() { + @Test + void givenNoOccurrenceOfBoundedZeros_whenCalculateBinaryGap_thenOutputCorrectResult() { int result = calculateBinaryGap(63); assertEquals(0, result); } - @Test public void givenTrailingZeros_whenCalculateBinaryGap_thenOutputCorrectResult() { + @Test + void givenTrailingZeros_whenCalculateBinaryGap_thenOutputCorrectResult() { int result = calculateBinaryGap(40); assertEquals(1, result); } - @Test public void givenSingleOccurrenceOfBoundedZeros_whenCalculateBinaryGap_thenOutputCorrectResult() { + @Test + void givenSingleOccurrenceOfBoundedZeros_whenCalculateBinaryGap_thenOutputCorrectResult() { int result = calculateBinaryGap(9); assertEquals(2, result); } - @Test public void givenMultipleOccurrenceOfBoundedZeros_whenCalculateBinaryGap_thenOutputCorrectResult() { + @Test + void givenMultipleOccurrenceOfBoundedZeros_whenCalculateBinaryGap_thenOutputCorrectResult() { int result = calculateBinaryGap(145); assertEquals(3, result); diff --git a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java index 95ffdec239..9f82c444cb 100644 --- a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/combinatorics/CombinatoricsUnitTest.java @@ -1,17 +1,18 @@ package com.baeldung.algorithms.combinatorics; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; + import java.util.Arrays; import java.util.HashSet; import java.util.List; -import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertSame; +import org.junit.jupiter.api.Test; -public class CombinatoricsUnitTest { +class CombinatoricsUnitTest { @Test - public void givenEmptySequence_whenCallingPermutations_ShouldReturnEmptyList() { + void givenEmptySequence_whenCallingPermutations_ShouldReturnEmptyList() { List sequence = Arrays.asList(); List> permutations = Combinatorics.permutations(sequence); @@ -20,7 +21,7 @@ public class CombinatoricsUnitTest { } @Test - public void givenOneElementSequence_whenCallingPermutations_ShouldReturnPermutations() { + void givenOneElementSequence_whenCallingPermutations_ShouldReturnPermutations() { List sequence = Arrays.asList(1); List> permutations = Combinatorics.permutations(sequence); @@ -31,7 +32,7 @@ public class CombinatoricsUnitTest { } @Test - public void givenFourElementsSequence_whenCallingPermutations_ShouldReturnPermutations() { + void givenFourElementsSequence_whenCallingPermutations_ShouldReturnPermutations() { List sequence = Arrays.asList(1, 2, 3, 4); List> permutations = Combinatorics.permutations(sequence); @@ -41,7 +42,7 @@ public class CombinatoricsUnitTest { } @Test - public void givenTwoElements_whenCalling3Combinations_ShouldReturnEmptyList() { + void givenTwoElements_whenCalling3Combinations_ShouldReturnEmptyList() { List set = Arrays.asList(1, 2); List> combinations = Combinatorics.combinations(set, 3); @@ -50,7 +51,7 @@ public class CombinatoricsUnitTest { } @Test - public void givenThreeElements_whenCalling3Combinations_ShouldReturnOneCombination() { + void givenThreeElements_whenCalling3Combinations_ShouldReturnOneCombination() { List set = Arrays.asList(1, 2, 3); List> combinations = Combinatorics.combinations(set, 3); @@ -60,7 +61,7 @@ public class CombinatoricsUnitTest { } @Test - public void givenFourElements_whenCalling2Combinations_ShouldReturnCombinations() { + void givenFourElements_whenCalling2Combinations_ShouldReturnCombinations() { List set = Arrays.asList(1, 2, 3, 4); List> combinations = Combinatorics.combinations(set, 2); @@ -70,7 +71,7 @@ public class CombinatoricsUnitTest { } @Test - public void givenFourElements_whenCallingPowerSet_ShouldReturn15Sets() { + void givenFourElements_whenCallingPowerSet_ShouldReturn15Sets() { List sequence = Arrays.asList('a', 'b', 'c', 'd'); List> combinations = Combinatorics.powerSet(sequence); diff --git a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java index be61802705..bb344e8b30 100644 --- a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java @@ -1,27 +1,27 @@ package com.baeldung.algorithms.conversion; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import org.apache.commons.codec.DecoderException; import org.hamcrest.text.IsEqualIgnoringCase; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import com.baeldung.algorithms.conversion.HexStringConverter; -public class ByteArrayConverterUnitTest { +class ByteArrayConverterUnitTest { private HexStringConverter hexStringConverter; - @Before + @BeforeEach public void setup() { hexStringConverter = new HexStringConverter(); } @Test - public void shouldEncodeByteArrayToHexStringUsingBigIntegerToString() { + void shouldEncodeByteArrayToHexStringUsingBigIntegerToString() { byte[] bytes = getSampleBytes(); String hexString = getSampleHexString(); if(hexString.charAt(0) == '0') { @@ -32,7 +32,7 @@ public class ByteArrayConverterUnitTest { } @Test - public void shouldEncodeByteArrayToHexStringUsingBigIntegerStringFormat() { + void shouldEncodeByteArrayToHexStringUsingBigIntegerStringFormat() { byte[] bytes = getSampleBytes(); String hexString = getSampleHexString(); String output = hexStringConverter.encodeUsingBigIntegerStringFormat(bytes); @@ -40,7 +40,7 @@ public class ByteArrayConverterUnitTest { } @Test - public void shouldDecodeHexStringToByteArrayUsingBigInteger() { + void shouldDecodeHexStringToByteArrayUsingBigInteger() { byte[] bytes = getSampleBytes(); String hexString = getSampleHexString(); byte[] output = hexStringConverter.decodeUsingBigInteger(hexString); @@ -48,7 +48,7 @@ public class ByteArrayConverterUnitTest { } @Test - public void shouldEncodeByteArrayToHexStringUsingCharacterConversion() { + void shouldEncodeByteArrayToHexStringUsingCharacterConversion() { byte[] bytes = getSampleBytes(); String hexString = getSampleHexString(); String output = hexStringConverter.encodeHexString(bytes); @@ -56,20 +56,22 @@ public class ByteArrayConverterUnitTest { } @Test - public void shouldDecodeHexStringToByteArrayUsingCharacterConversion() { + void shouldDecodeHexStringToByteArrayUsingCharacterConversion() { byte[] bytes = getSampleBytes(); String hexString = getSampleHexString(); byte[] output = hexStringConverter.decodeHexString(hexString); assertArrayEquals(bytes, output); } - @Test(expected=IllegalArgumentException.class) - public void shouldDecodeHexToByteWithInvalidHexCharacter() { - hexStringConverter.hexToByte("fg"); + @Test + void shouldDecodeHexToByteWithInvalidHexCharacter() { + assertThrows(IllegalArgumentException.class, () -> { + hexStringConverter.hexToByte("fg"); + }); } @Test - public void shouldEncodeByteArrayToHexStringDataTypeConverter() { + void shouldEncodeByteArrayToHexStringDataTypeConverter() { byte[] bytes = getSampleBytes(); String hexString = getSampleHexString(); String output = hexStringConverter.encodeUsingDataTypeConverter(bytes); @@ -77,7 +79,7 @@ public class ByteArrayConverterUnitTest { } @Test - public void shouldDecodeHexStringToByteArrayUsingDataTypeConverter() { + void shouldDecodeHexStringToByteArrayUsingDataTypeConverter() { byte[] bytes = getSampleBytes(); String hexString = getSampleHexString(); byte[] output = hexStringConverter.decodeUsingDataTypeConverter(hexString); @@ -85,7 +87,7 @@ public class ByteArrayConverterUnitTest { } @Test - public void shouldEncodeByteArrayToHexStringUsingGuava() { + void shouldEncodeByteArrayToHexStringUsingGuava() { byte[] bytes = getSampleBytes(); String hexString = getSampleHexString(); String output = hexStringConverter.encodeUsingGuava(bytes); @@ -93,7 +95,7 @@ public class ByteArrayConverterUnitTest { } @Test - public void shouldDecodeHexStringToByteArrayUsingGuava() { + void shouldDecodeHexStringToByteArrayUsingGuava() { byte[] bytes = getSampleBytes(); String hexString = getSampleHexString(); byte[] output = hexStringConverter.decodeUsingGuava(hexString); @@ -101,7 +103,7 @@ public class ByteArrayConverterUnitTest { } @Test - public void shouldEncodeByteArrayToHexStringUsingApacheCommons() throws DecoderException { + void shouldEncodeByteArrayToHexStringUsingApacheCommons() throws DecoderException { byte[] bytes = getSampleBytes(); String hexString = getSampleHexString(); String output = hexStringConverter.encodeUsingApacheCommons(bytes); @@ -109,7 +111,7 @@ public class ByteArrayConverterUnitTest { } @Test - public void shouldDecodeHexStringToByteArrayUsingApacheCommons() throws DecoderException { + void shouldDecodeHexStringToByteArrayUsingApacheCommons() throws DecoderException { byte[] bytes = getSampleBytes(); String hexString = getSampleHexString(); byte[] output = hexStringConverter.decodeUsingApacheCommons(hexString); diff --git a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java index bcea4ebba8..b37ef5af7d 100644 --- a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/integerstreammedian/MedianOfIntegerStreamUnitTest.java @@ -1,16 +1,18 @@ package com.baeldung.algorithms.integerstreammedian; -import org.junit.Test; + + +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.LinkedHashMap; import java.util.Map; -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.api.Test; -public class MedianOfIntegerStreamUnitTest { +class MedianOfIntegerStreamUnitTest { @Test - public void givenStreamOfIntegers_whenAnElementIsRead_thenMedianChangesWithApproach1() { + void givenStreamOfIntegers_whenAnElementIsRead_thenMedianChangesWithApproach1() { MedianOfIntegerStream mis = new MedianOfIntegerStream(); for (Map.Entry e : testcaseFixture().entrySet()) { mis.add(e.getKey()); @@ -19,7 +21,7 @@ public class MedianOfIntegerStreamUnitTest { } @Test - public void givenStreamOfIntegers_whenAnElementIsRead_thenMedianChangesWithApproach2() { + void givenStreamOfIntegers_whenAnElementIsRead_thenMedianChangesWithApproach2() { MedianOfIntegerStream2 mis = new MedianOfIntegerStream2(); for (Map.Entry e : testcaseFixture().entrySet()) { mis.add(e.getKey()); diff --git a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java index b168e6b1eb..f6d802f50b 100644 --- a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java @@ -4,10 +4,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; -public class KnapsackUnitTest { +class KnapsackUnitTest { @Test - public void givenWeightsandValues_whenCalculateMax_thenOutputCorrectResult() { + void givenWeightsandValues_whenCalculateMax_thenOutputCorrectResult() { final int[] w = new int[] { 23, 26, 20, 18, 32, 27, 29, 26, 30, 27 }; final int[] v = new int[] { 505, 352, 458, 220, 354, 414, 498, 545, 473, 543 }; final int n = 10; @@ -19,7 +19,7 @@ public class KnapsackUnitTest { } @Test - public void givenZeroItems_whenCalculateMax_thenOutputZero() { + void givenZeroItems_whenCalculateMax_thenOutputZero() { final int[] w = new int[] {}; final int[] v = new int[] {}; final int n = 0; @@ -31,7 +31,7 @@ public class KnapsackUnitTest { } @Test - public void givenZeroWeightLimit_whenCalculateMax_thenOutputZero() { + void givenZeroWeightLimit_whenCalculateMax_thenOutputZero() { final int[] w = new int[] { 23, 26, 20, 18, 32, 27, 29, 26, 30, 27 }; final int[] v = new int[] { 505, 352, 458, 220, 354, 414, 498, 545, 473, 543 }; final int n = 10; diff --git a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java index 76eeb7b116..ca6824fd15 100644 --- a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/mergesortedarrays/SortedArraysUnitTest.java @@ -5,10 +5,10 @@ import org.junit.jupiter.api.Test; import com.baeldung.algorithms.mergesortedarrays.SortedArrays; -public class SortedArraysUnitTest { +class SortedArraysUnitTest { @Test - public void givenTwoSortedArrays_whenMerged_thenReturnMergedSortedArray() { + void givenTwoSortedArrays_whenMerged_thenReturnMergedSortedArray() { int[] foo = { 3, 7 }; int[] bar = { 4, 8, 11 }; @@ -18,7 +18,7 @@ public class SortedArraysUnitTest { } @Test - public void givenTwoSortedArraysWithDuplicates_whenMerged_thenReturnMergedSortedArray() { + void givenTwoSortedArraysWithDuplicates_whenMerged_thenReturnMergedSortedArray() { int[] foo = { 3, 3, 7 }; int[] bar = { 4, 8, 8, 11 }; diff --git a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java index fac3b3a81f..a5eb6f4d89 100644 --- a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java @@ -1,14 +1,15 @@ package com.baeldung.algorithms.prim; -import org.junit.Test; import java.util.ArrayList; import java.util.List; -public class PrimUnitTest { +import org.junit.jupiter.api.Test; + +class PrimUnitTest { @Test - public void givenAGraph_whenPrimRuns_thenPrintMST() { + void givenAGraph_whenPrimRuns_thenPrintMST() { Prim prim = new Prim(createGraph()); System.out.println(prim.originalGraphToString()); System.out.println("----------------"); diff --git a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java index 84bb2620af..8218649e98 100644 --- a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java @@ -1,49 +1,49 @@ package com.baeldung.algorithms.relativelyprime; -import org.junit.Test; - import static com.baeldung.algorithms.relativelyprime.RelativelyPrime.*; import static org.assertj.core.api.Assertions.assertThat; -public class RelativelyPrimeUnitTest { +import org.junit.jupiter.api.Test; + +class RelativelyPrimeUnitTest { @Test - public void givenNonRelativelyPrimeNumbers_whenCheckingIteratively_shouldReturnFalse() { + void givenNonRelativelyPrimeNumbers_whenCheckingIteratively_shouldReturnFalse() { boolean result = iterativeRelativelyPrime(45, 35); assertThat(result).isFalse(); } @Test - public void givenRelativelyPrimeNumbers_whenCheckingIteratively_shouldReturnTrue() { + void givenRelativelyPrimeNumbers_whenCheckingIteratively_shouldReturnTrue() { boolean result = iterativeRelativelyPrime(500, 501); assertThat(result).isTrue(); } @Test - public void givenNonRelativelyPrimeNumbers_whenCheckingRecursively_shouldReturnFalse() { + void givenNonRelativelyPrimeNumbers_whenCheckingRecursively_shouldReturnFalse() { boolean result = recursiveRelativelyPrime(45, 35); assertThat(result).isFalse(); } @Test - public void givenRelativelyPrimeNumbers_whenCheckingRecursively_shouldReturnTrue() { + void givenRelativelyPrimeNumbers_whenCheckingRecursively_shouldReturnTrue() { boolean result = recursiveRelativelyPrime(500, 501); assertThat(result).isTrue(); } @Test - public void givenNonRelativelyPrimeNumbers_whenCheckingUsingBigIntegers_shouldReturnFalse() { + void givenNonRelativelyPrimeNumbers_whenCheckingUsingBigIntegers_shouldReturnFalse() { boolean result = bigIntegerRelativelyPrime(45, 35); assertThat(result).isFalse(); } @Test - public void givenRelativelyPrimeNumbers_whenCheckingBigIntegers_shouldReturnTrue() { + void givenRelativelyPrimeNumbers_whenCheckingBigIntegers_shouldReturnTrue() { boolean result = bigIntegerRelativelyPrime(500, 501); assertThat(result).isTrue(); diff --git a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java index 44fac57361..2366a897c6 100644 --- a/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java @@ -4,10 +4,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; -public class TreeReverserUnitTest { +class TreeReverserUnitTest { @Test - public void givenTreeWhenReversingRecursivelyThenReversed() { + void givenTreeWhenReversingRecursivelyThenReversed() { TreeReverser reverser = new TreeReverser(); TreeNode treeNode = createBinaryTree(); @@ -19,7 +19,7 @@ public class TreeReverserUnitTest { } @Test - public void givenTreeWhenReversingIterativelyThenReversed() { + void givenTreeWhenReversingIterativelyThenReversed() { TreeReverser reverser = new TreeReverser(); TreeNode treeNode = createBinaryTree(); diff --git a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java index 4c0a56dabc..b7a6a6470e 100644 --- a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingDequeUnitTest.java @@ -1,80 +1,81 @@ package com.baeldung.algorithms.balancedbrackets; -import org.junit.Before; -import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; -public class BalancedBracketsUsingDequeUnitTest { +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class BalancedBracketsUsingDequeUnitTest { private BalancedBracketsUsingDeque balancedBracketsUsingDeque; - @Before + @BeforeEach public void setup() { balancedBracketsUsingDeque = new BalancedBracketsUsingDeque(); } @Test - public void givenNullInput_whenCheckingForBalance_shouldReturnFalse() { + void givenNullInput_whenCheckingForBalance_shouldReturnFalse() { boolean result = balancedBracketsUsingDeque.isBalanced(null); assertThat(result).isFalse(); } @Test - public void givenEmptyString_whenCheckingForBalance_shouldReturnTrue() { + void givenEmptyString_whenCheckingForBalance_shouldReturnTrue() { boolean result = balancedBracketsUsingDeque.isBalanced(""); assertThat(result).isTrue(); } @Test - public void givenInvalidCharacterString_whenCheckingForBalance_shouldReturnFalse() { + void givenInvalidCharacterString_whenCheckingForBalance_shouldReturnFalse() { boolean result = balancedBracketsUsingDeque.isBalanced("abc[](){}"); assertThat(result).isFalse(); } @Test - public void givenOddLengthString_whenCheckingForBalance_shouldReturnFalse() { + void givenOddLengthString_whenCheckingForBalance_shouldReturnFalse() { boolean result = balancedBracketsUsingDeque.isBalanced("{{[]()}}}"); assertThat(result).isFalse(); } @Test - public void givenEvenLengthString_whenCheckingForBalance_shouldReturnFalse() { + void givenEvenLengthString_whenCheckingForBalance_shouldReturnFalse() { boolean result = balancedBracketsUsingDeque.isBalanced("{{[]()}}}}"); assertThat(result).isFalse(); } @Test - public void givenEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() { + void givenEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() { boolean result = balancedBracketsUsingDeque.isBalanced("{[(])}"); assertThat(result).isFalse(); } @Test - public void givenAnotherEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() { + void givenAnotherEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() { boolean result = balancedBracketsUsingDeque.isBalanced("{{}("); assertThat(result).isFalse(); } @Test - public void givenEvenLengthBalancedString_whenCheckingForBalance_shouldReturnTrue() { + void givenEvenLengthBalancedString_whenCheckingForBalance_shouldReturnTrue() { boolean result = balancedBracketsUsingDeque.isBalanced("{[()]}"); assertThat(result).isTrue(); } @Test - public void givenBalancedString_whenCheckingForBalance_shouldReturnTrue() { + void givenBalancedString_whenCheckingForBalance_shouldReturnTrue() { boolean result = balancedBracketsUsingDeque.isBalanced("{{[[(())]]}}"); assertThat(result).isTrue(); } @Test - public void givenAnotherBalancedString_whenCheckingForBalance_shouldReturnTrue() { + void givenAnotherBalancedString_whenCheckingForBalance_shouldReturnTrue() { boolean result = balancedBracketsUsingDeque.isBalanced("{{([])}}"); assertThat(result).isTrue(); } @Test - public void givenUnBalancedString_whenCheckingForBalance_shouldReturnFalse() { + void givenUnBalancedString_whenCheckingForBalance_shouldReturnFalse() { boolean result = balancedBracketsUsingDeque.isBalanced("{{)[](}}"); assertThat(result).isFalse(); } diff --git a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java index bda85a75ce..71bd91c39a 100644 --- a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/balancedbrackets/BalancedBracketsUsingStringUnitTest.java @@ -1,80 +1,81 @@ package com.baeldung.algorithms.balancedbrackets; -import org.junit.Before; -import org.junit.Test; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -public class BalancedBracketsUsingStringUnitTest { +class BalancedBracketsUsingStringUnitTest { private BalancedBracketsUsingString balancedBracketsUsingString; - @Before + @BeforeEach public void setup() { balancedBracketsUsingString = new BalancedBracketsUsingString(); } @Test - public void givenNullInput_whenCheckingForBalance_shouldReturnFalse() { + void givenNullInput_whenCheckingForBalance_shouldReturnFalse() { boolean result = balancedBracketsUsingString.isBalanced(null); assertThat(result).isFalse(); } @Test - public void givenEmptyString_whenCheckingForBalance_shouldReturnTrue() { + void givenEmptyString_whenCheckingForBalance_shouldReturnTrue() { boolean result = balancedBracketsUsingString.isBalanced(""); assertThat(result).isTrue(); } @Test - public void givenInvalidCharacterString_whenCheckingForBalance_shouldReturnFalse() { + void givenInvalidCharacterString_whenCheckingForBalance_shouldReturnFalse() { boolean result = balancedBracketsUsingString.isBalanced("abc[](){}"); assertThat(result).isFalse(); } @Test - public void givenOddLengthString_whenCheckingForBalance_shouldReturnFalse() { + void givenOddLengthString_whenCheckingForBalance_shouldReturnFalse() { boolean result = balancedBracketsUsingString.isBalanced("{{[]()}}}"); assertThat(result).isFalse(); } @Test - public void givenEvenLengthString_whenCheckingForBalance_shouldReturnFalse() { + void givenEvenLengthString_whenCheckingForBalance_shouldReturnFalse() { boolean result = balancedBracketsUsingString.isBalanced("{{[]()}}}}"); assertThat(result).isFalse(); } @Test - public void givenEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() { + void givenEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() { boolean result = balancedBracketsUsingString.isBalanced("{[(])}"); assertThat(result).isFalse(); } @Test - public void givenAnotherEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() { + void givenAnotherEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() { boolean result = balancedBracketsUsingString.isBalanced("{{}("); assertThat(result).isFalse(); } @Test - public void givenEvenLengthBalancedString_whenCheckingForBalance_shouldReturnTrue() { + void givenEvenLengthBalancedString_whenCheckingForBalance_shouldReturnTrue() { boolean result = balancedBracketsUsingString.isBalanced("{[()]}"); assertThat(result).isTrue(); } @Test - public void givenBalancedString_whenCheckingForBalance_shouldReturnTrue() { + void givenBalancedString_whenCheckingForBalance_shouldReturnTrue() { boolean result = balancedBracketsUsingString.isBalanced("{{[[(())]]}}"); assertThat(result).isTrue(); } @Test - public void givenAnotherBalancedString_whenCheckingForBalance_shouldReturnTrue() { + void givenAnotherBalancedString_whenCheckingForBalance_shouldReturnTrue() { boolean result = balancedBracketsUsingString.isBalanced("{{([])}}"); assertThat(result).isTrue(); } @Test - public void givenUnBalancedString_whenCheckingForBalance_shouldReturnFalse() { + void givenUnBalancedString_whenCheckingForBalance_shouldReturnFalse() { boolean result = balancedBracketsUsingString.isBalanced("{{)[](}}"); assertThat(result).isFalse(); } diff --git a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java index e61e1e668d..7261dfffc6 100644 --- a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/boruvka/BoruvkaUnitTest.java @@ -2,17 +2,17 @@ package com.baeldung.algorithms.boruvka; import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import com.google.common.graph.MutableValueGraph; import com.google.common.graph.ValueGraphBuilder; -public class BoruvkaUnitTest { +class BoruvkaUnitTest { private MutableValueGraph graph; - @Before + @BeforeEach public void setup() { graph = ValueGraphBuilder.undirected() .build(); @@ -26,7 +26,7 @@ public class BoruvkaUnitTest { } @Test - public void givenInputGraph_whenBoruvkaPerformed_thenMinimumSpanningTree() { + void givenInputGraph_whenBoruvkaPerformed_thenMinimumSpanningTree() { BoruvkaMST boruvkaMST = new BoruvkaMST(graph); MutableValueGraph mst = boruvkaMST.getMST(); diff --git a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java index 34d3e188f2..d7aa952037 100644 --- a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/gradientdescent/GradientDescentUnitTest.java @@ -1,15 +1,15 @@ package com.baeldung.algorithms.gradientdescent; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.function.Function; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class GradientDescentUnitTest { +class GradientDescentUnitTest { @Test - public void givenFunction_whenStartingPointIsOne_thenLocalMinimumIsFound() { + void givenFunction_whenStartingPointIsOne_thenLocalMinimumIsFound() { Function df = x -> StrictMath.abs(StrictMath.pow(x, 3)) - (3 * StrictMath.pow(x, 2)) + x; GradientDescent gd = new GradientDescent(); diff --git a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java index a503b006de..ea90ea14c1 100644 --- a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/greedy/GreedyAlgorithmUnitTest.java @@ -1,13 +1,14 @@ package com.baeldung.algorithms.greedy; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import org.junit.jupiter.api.Test; import java.util.Arrays; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -public class GreedyAlgorithmUnitTest { + +class GreedyAlgorithmUnitTest { private SocialConnector prepareNetwork() { SocialConnector sc = new SocialConnector(); @@ -35,21 +36,21 @@ public class GreedyAlgorithmUnitTest { } @Test - public void greedyAlgorithmTest() { + void greedyAlgorithmTest() { GreedyAlgorithm ga = new GreedyAlgorithm(prepareNetwork()); assertEquals(ga.findMostFollowersPath("root"), 5); } @Test - public void nongreedyAlgorithmTest() { + void nongreedyAlgorithmTest() { NonGreedyAlgorithm nga = new NonGreedyAlgorithm(prepareNetwork(), 0); - Assertions.assertThrows(IllegalStateException.class, () -> { + assertThrows(IllegalStateException.class, () -> { nga.findMostFollowersPath("root"); }); } @Test - public void nongreedyAlgorithmUnboundedTest() { + void nongreedyAlgorithmUnboundedTest() { SocialConnector sc = prepareNetwork(); sc.switchCounter(); NonGreedyAlgorithm nga = new NonGreedyAlgorithm(sc, 0); diff --git a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java index a7206c6cd0..9367942dc6 100644 --- a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/kruskal/KruskalUnitTest.java @@ -1,21 +1,23 @@ package com.baeldung.algorithms.kruskal; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertEquals; -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.BeforeEach; +import org.junit.jupiter.api.Test; + import com.google.common.graph.MutableValueGraph; import com.google.common.graph.ValueGraph; import com.google.common.graph.ValueGraphBuilder; import com.baeldung.algorithms.kruskal.Kruskal; -public class KruskalUnitTest { +class KruskalUnitTest { private MutableValueGraph graph; - @Before + @BeforeEach public void setup() { graph = ValueGraphBuilder.undirected().build(); graph.putEdgeValue(0, 1, 8.0); @@ -28,7 +30,7 @@ public class KruskalUnitTest { } @Test - public void givenGraph_whenMinimumSpanningTree_thenOutputCorrectResult() { + void givenGraph_whenMinimumSpanningTree_thenOutputCorrectResult() { final Kruskal kruskal = new Kruskal(); ValueGraph spanningTree = kruskal.minSpanningTree(graph); @@ -47,7 +49,7 @@ public class KruskalUnitTest { } @Test - public void givenGraph_whenMaximumSpanningTree_thenOutputCorrectResult() { + void givenGraph_whenMaximumSpanningTree_thenOutputCorrectResult() { final Kruskal kruskal = new Kruskal(); ValueGraph spanningTree = kruskal.maxSpanningTree(graph); diff --git a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java index 0940677959..0d222c0841 100644 --- a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java @@ -1,13 +1,13 @@ package com.baeldung.algorithms.linkedlist; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import org.junit.jupiter.api.Test; -public class LinkedListReversalUnitTest { +class LinkedListReversalUnitTest { @Test - public void givenLinkedList_whenIterativeReverse_thenOutputCorrectResult() { + void givenLinkedList_whenIterativeReverse_thenOutputCorrectResult() { ListNode head = constructLinkedList(); ListNode node = head; for (int i = 1; i <= 5; i++) { @@ -25,7 +25,7 @@ public class LinkedListReversalUnitTest { } @Test - public void givenLinkedList_whenRecursiveReverse_thenOutputCorrectResult() { + void givenLinkedList_whenRecursiveReverse_thenOutputCorrectResult() { ListNode head = constructLinkedList(); ListNode node = head; for (int i = 1; i <= 5; i++) { diff --git a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java index f84c860dcc..c5b78bbf48 100644 --- a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java @@ -2,17 +2,17 @@ package com.baeldung.algorithms.minheapmerge; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class MinHeapUnitTest { +class MinHeapUnitTest { private final int[][] inputArray = { { 0, 6 }, { 1, 5, 10, 100 }, { 2, 4, 200, 650 } }; private final int[] expectedArray = { 0, 1, 2, 4, 5, 6, 10, 100, 200, 650 }; @Test - public void givenSortedArrays_whenMerged_thenShouldReturnASingleSortedarray() { + void givenSortedArrays_whenMerged_thenShouldReturnASingleSortedarray() { int[] resultArray = MinHeap.merge(inputArray); assertThat(resultArray.length, is(equalTo(10))); diff --git a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java index 41fa5e067e..d979d1c856 100644 --- a/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/topkelements/TopKElementsFinderUnitTest.java @@ -1,13 +1,13 @@ package com.baeldung.algorithms.topkelements; -import org.junit.Test; - import java.util.Arrays; import java.util.List; import static org.assertj.core.api.Java6Assertions.assertThat; -public class TopKElementsFinderUnitTest { +import org.junit.jupiter.api.Test; + +class TopKElementsFinderUnitTest { private final TopKElementsFinder bruteForceFinder = new BruteForceTopKElementsFinder(); private final TopKElementsFinder maxHeapFinder = new MaxHeapTopKElementsFinder(); private final TopKElementsFinder treeSetFinder = new TreeSetTopKElementsFinder(); @@ -20,27 +20,27 @@ public class TopKElementsFinderUnitTest { @Test - public void givenArrayDistinctIntegers_whenBruteForceFindTopK_thenReturnKLargest() { + void givenArrayDistinctIntegers_whenBruteForceFindTopK_thenReturnKLargest() { assertThat(bruteForceFinder.findTopK(distinctIntegers, k)).containsOnlyElementsOf(distinctIntegersTopK); } @Test - public void givenArrayDistinctIntegers_whenMaxHeapFindTopK_thenReturnKLargest() { + void givenArrayDistinctIntegers_whenMaxHeapFindTopK_thenReturnKLargest() { assertThat(maxHeapFinder.findTopK(distinctIntegers, k)).containsOnlyElementsOf(distinctIntegersTopK); } @Test - public void givenArrayDistinctIntegers_whenTreeSetFindTopK_thenReturnKLargest() { + void givenArrayDistinctIntegers_whenTreeSetFindTopK_thenReturnKLargest() { assertThat(treeSetFinder.findTopK(distinctIntegers, k)).containsOnlyElementsOf(distinctIntegersTopK); } @Test - public void givenArrayNonDistinctIntegers_whenBruteForceFindTopK_thenReturnKLargest() { + void givenArrayNonDistinctIntegers_whenBruteForceFindTopK_thenReturnKLargest() { assertThat(bruteForceFinder.findTopK(nonDistinctIntegers, k)).containsOnlyElementsOf(nonDistinctIntegersTopK); } @Test - public void givenArrayNonDistinctIntegers_whenMaxHeapFindTopK_thenReturnKLargest() { + void givenArrayNonDistinctIntegers_whenMaxHeapFindTopK_thenReturnKLargest() { assertThat(maxHeapFinder.findTopK(nonDistinctIntegers, k)).containsOnlyElementsOf(nonDistinctIntegersTopK); } } diff --git a/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/luhn/LuhnCheckerUnitTest.java b/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/luhn/LuhnCheckerUnitTest.java index dd1b184b81..9f7c93c1b3 100644 --- a/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/luhn/LuhnCheckerUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/luhn/LuhnCheckerUnitTest.java @@ -1,63 +1,66 @@ package com.baeldung.algorithms.luhn; -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 static org.junit.jupiter.api.Assertions.assertTrue; -public class LuhnCheckerUnitTest { +import org.junit.jupiter.api.Test; + +class LuhnCheckerUnitTest { @Test - public void whenCardNumberDoesMeetLuhnCriteria_thenCheckLuhnReturnsTrue() { + void whenCardNumberDoesMeetLuhnCriteria_thenCheckLuhnReturnsTrue() { String cardNumber = "8649"; boolean result = LuhnChecker.checkLuhn(cardNumber); - Assert.assertTrue(result); + assertTrue(result); } @Test - public void whenCardNumberDoesNotMeetLuhnCriteria_thenCheckLuhnReturnsFalse() { + void whenCardNumberDoesNotMeetLuhnCriteria_thenCheckLuhnReturnsFalse() { String cardNumber = "8642"; boolean result = LuhnChecker.checkLuhn(cardNumber); - Assert.assertFalse(result); + assertFalse(result); } @Test - public void whenCardNumberHasNoSecondDigits_thenCheckLuhnCalculatesCorrectly() { + void whenCardNumberHasNoSecondDigits_thenCheckLuhnCalculatesCorrectly() { String cardNumber = "0505050505050505"; boolean result = LuhnChecker.checkLuhn(cardNumber); - Assert.assertTrue(result); + assertTrue(result); } @Test - public void whenCardNumberHasSecondDigits_thenCheckLuhnCalculatesCorrectly() { + void whenCardNumberHasSecondDigits_thenCheckLuhnCalculatesCorrectly() { String cardNumber = "75757575757575"; boolean result = LuhnChecker.checkLuhn(cardNumber); - Assert.assertTrue(result); + assertTrue(result); } @Test - public void whenDoubleAndSumDigitsIsCalled_thenOutputIsCorrect() { - Assert.assertEquals(LuhnChecker.doubleAndSumDigits(0), 0); - Assert.assertEquals(LuhnChecker.doubleAndSumDigits(1), 2); - Assert.assertEquals(LuhnChecker.doubleAndSumDigits(2), 4); - Assert.assertEquals(LuhnChecker.doubleAndSumDigits(3), 6); - Assert.assertEquals(LuhnChecker.doubleAndSumDigits(4), 8); - Assert.assertEquals(LuhnChecker.doubleAndSumDigits(5), 1); - Assert.assertEquals(LuhnChecker.doubleAndSumDigits(6), 3); - Assert.assertEquals(LuhnChecker.doubleAndSumDigits(7), 5); - Assert.assertEquals(LuhnChecker.doubleAndSumDigits(8), 7); - Assert.assertEquals(LuhnChecker.doubleAndSumDigits(9), 9); + void whenDoubleAndSumDigitsIsCalled_thenOutputIsCorrect() { + assertEquals(0,LuhnChecker.doubleAndSumDigits(0)); + assertEquals(2,LuhnChecker.doubleAndSumDigits(1)); + assertEquals(4, LuhnChecker.doubleAndSumDigits(2)); + assertEquals(6, LuhnChecker.doubleAndSumDigits(3)); + assertEquals(8, LuhnChecker.doubleAndSumDigits(4)); + assertEquals(1, LuhnChecker.doubleAndSumDigits(5)); + assertEquals(3, LuhnChecker.doubleAndSumDigits(6)); + assertEquals(5, LuhnChecker.doubleAndSumDigits(7)); + assertEquals(7, LuhnChecker.doubleAndSumDigits(8)); + assertEquals(9, LuhnChecker.doubleAndSumDigits(9)); } @Test - public void whenCardNumberNonNumeric_thenCheckLuhnReturnsFalse() { + void whenCardNumberNonNumeric_thenCheckLuhnReturnsFalse() { String cardNumber = "test"; boolean result = LuhnChecker.checkLuhn(cardNumber); - Assert.assertFalse(result); + assertFalse(result); } @Test - public void whenCardNumberIsNull_thenCheckLuhnReturnsFalse() { + void whenCardNumberIsNull_thenCheckLuhnReturnsFalse() { String cardNumber = null; boolean result = LuhnChecker.checkLuhn(cardNumber); - Assert.assertFalse(result); + assertFalse(result); } } diff --git a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java index eb3fb4f718..8a4dbb2141 100644 --- a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java +++ b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/binarysearch/BinarySearchUnitTest.java @@ -1,11 +1,13 @@ package com.baeldung.algorithms.binarysearch; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.util.Arrays; import java.util.List; -import org.junit.Assert; -import org.junit.Test; -public class BinarySearchUnitTest { +import org.junit.jupiter.api.Test; + +class BinarySearchUnitTest { int[] sortedArray = { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 }; int key = 6; @@ -15,27 +17,27 @@ public class BinarySearchUnitTest { List sortedList = Arrays.asList(0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9); @Test - public void givenASortedArrayOfIntegers_whenBinarySearchRunIterativelyForANumber_thenGetIndexOfTheNumber() { + void givenASortedArrayOfIntegers_whenBinarySearchRunIterativelyForANumber_thenGetIndexOfTheNumber() { BinarySearch binSearch = new BinarySearch(); - Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchIteratively(sortedArray, key, low, high)); + assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchIteratively(sortedArray, key, low, high)); } @Test - public void givenASortedArrayOfIntegers_whenBinarySearchRunRecursivelyForANumber_thenGetIndexOfTheNumber() { + void givenASortedArrayOfIntegers_whenBinarySearchRunRecursivelyForANumber_thenGetIndexOfTheNumber() { BinarySearch binSearch = new BinarySearch(); - Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchRecursively(sortedArray, key, low, high)); + assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchRecursively(sortedArray, key, low, high)); } @Test - public void givenASortedArrayOfIntegers_whenBinarySearchRunUsingArraysClassStaticMethodForANumber_thenGetIndexOfTheNumber() { + void givenASortedArrayOfIntegers_whenBinarySearchRunUsingArraysClassStaticMethodForANumber_thenGetIndexOfTheNumber() { BinarySearch binSearch = new BinarySearch(); - Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchUsingJavaArrays(sortedArray, key)); + assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchUsingJavaArrays(sortedArray, key)); } @Test - public void givenASortedListOfIntegers_whenBinarySearchRunUsingCollectionsClassStaticMethodForANumber_thenGetIndexOfTheNumber() { + void givenASortedListOfIntegers_whenBinarySearchRunUsingCollectionsClassStaticMethodForANumber_thenGetIndexOfTheNumber() { BinarySearch binSearch = new BinarySearch(); - Assert.assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchUsingJavaCollections(sortedList, key)); + assertEquals(expectedIndexForSearchKey, binSearch.runBinarySearchUsingJavaCollections(sortedList, key)); } } diff --git a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java index f98b4377ed..dc83d8eac8 100644 --- a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java +++ b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java @@ -1,15 +1,15 @@ package com.baeldung.algorithms.dfs; -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 static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import org.junit.jupiter.api.Test; -public class BinaryTreeUnitTest { +class BinaryTreeUnitTest { @Test - public void givenABinaryTree_WhenAddingElements_ThenTreeNotEmpty() { + void givenABinaryTree_WhenAddingElements_ThenTreeNotEmpty() { BinaryTree bt = createBinaryTree(); @@ -17,7 +17,7 @@ public class BinaryTreeUnitTest { } @Test - public void givenABinaryTree_WhenAddingElements_ThenTreeContainsThoseElements() { + void givenABinaryTree_WhenAddingElements_ThenTreeContainsThoseElements() { BinaryTree bt = createBinaryTree(); @@ -28,7 +28,7 @@ public class BinaryTreeUnitTest { } @Test - public void givenABinaryTree_WhenAddingExistingElement_ThenElementIsNotAdded() { + void givenABinaryTree_WhenAddingExistingElement_ThenElementIsNotAdded() { BinaryTree bt = createBinaryTree(); @@ -40,7 +40,7 @@ public class BinaryTreeUnitTest { } @Test - public void givenABinaryTree_WhenLookingForNonExistingElement_ThenReturnsFalse() { + void givenABinaryTree_WhenLookingForNonExistingElement_ThenReturnsFalse() { BinaryTree bt = createBinaryTree(); @@ -48,7 +48,7 @@ public class BinaryTreeUnitTest { } @Test - public void givenABinaryTree_WhenDeletingElements_ThenTreeDoesNotContainThoseElements() { + void givenABinaryTree_WhenDeletingElements_ThenTreeDoesNotContainThoseElements() { BinaryTree bt = createBinaryTree(); @@ -58,7 +58,7 @@ public class BinaryTreeUnitTest { } @Test - public void givenABinaryTree_WhenDeletingNonExistingElement_ThenTreeDoesNotDelete() { + void givenABinaryTree_WhenDeletingNonExistingElement_ThenTreeDoesNotDelete() { BinaryTree bt = createBinaryTree(); @@ -71,7 +71,7 @@ public class BinaryTreeUnitTest { } @Test - public void it_deletes_the_root() { + void it_deletes_the_root() { int value = 12; BinaryTree bt = new BinaryTree(); bt.add(value); @@ -82,7 +82,7 @@ public class BinaryTreeUnitTest { } @Test - public void givenABinaryTree_WhenTraversingInOrder_ThenPrintValues() { + void givenABinaryTree_WhenTraversingInOrder_ThenPrintValues() { BinaryTree bt = createBinaryTree(); @@ -92,7 +92,7 @@ public class BinaryTreeUnitTest { } @Test - public void givenABinaryTree_WhenTraversingPreOrder_ThenPrintValues() { + void givenABinaryTree_WhenTraversingPreOrder_ThenPrintValues() { BinaryTree bt = createBinaryTree(); @@ -102,7 +102,7 @@ public class BinaryTreeUnitTest { } @Test - public void givenABinaryTree_WhenTraversingPostOrder_ThenPrintValues() { + void givenABinaryTree_WhenTraversingPostOrder_ThenPrintValues() { BinaryTree bt = createBinaryTree(); diff --git a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java index 7af25a85ca..086eb77a82 100644 --- a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java +++ b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/GraphUnitTest.java @@ -2,12 +2,12 @@ package com.baeldung.algorithms.dfs; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class GraphUnitTest { +class GraphUnitTest { @Test - public void givenDirectedGraph_whenDFS_thenPrintAllValues() { + void givenDirectedGraph_whenDFS_thenPrintAllValues() { Graph graph = createDirectedGraph(); graph.dfs(0); System.out.println(); @@ -15,7 +15,7 @@ public class GraphUnitTest { } @Test - public void givenDirectedGraph_whenGetTopologicalSort_thenPrintValuesSorted() { + void givenDirectedGraph_whenGetTopologicalSort_thenPrintValuesSorted() { Graph graph = createDirectedGraph(); List list = graph.topologicalSort(0); System.out.println(list); diff --git a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java index cabedcefad..c9e95b0cc9 100644 --- a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java +++ b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java @@ -1,27 +1,28 @@ package com.baeldung.algorithms.interpolationsearch; -import org.junit.Before; -import org.junit.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -public class InterpolationSearchUnitTest { +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class InterpolationSearchUnitTest { private int[] myData; - @Before + @BeforeEach public void setUp() { myData = new int[]{13,21,34,55,69,73,84,101}; } @Test - public void givenSortedArray_whenLookingFor84_thenReturn6() { + void givenSortedArray_whenLookingFor84_thenReturn6() { int pos = InterpolationSearch.interpolationSearch(myData, 84); assertEquals(6, pos); } @Test - public void givenSortedArray_whenLookingFor19_thenReturnMinusOne() { + void givenSortedArray_whenLookingFor19_thenReturnMinusOne() { int pos = InterpolationSearch.interpolationSearch(myData, 19); assertEquals(-1, pos); } diff --git a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java index 740e89d8e7..1349be59c0 100644 --- a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java +++ b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/kthsmallest/KthSmallestUnitTest.java @@ -9,13 +9,13 @@ import java.util.*; import static com.baeldung.algorithms.kthsmallest.KthSmallest.*; import static org.junit.jupiter.api.Assertions.*; -public class KthSmallestUnitTest { +class KthSmallestUnitTest { @Nested class Exceptions { @Test - public void when_at_least_one_list_is_null_then_an_exception_is_thrown() { + void when_at_least_one_list_is_null_then_an_exception_is_thrown() { Executable executable1 = () -> findKthSmallestElement(1, null, null); Executable executable2 = () -> findKthSmallestElement(1, new int[]{2}, null); @@ -27,7 +27,7 @@ public class KthSmallestUnitTest { } @Test - public void when_at_least_one_list_is_empty_then_an_exception_is_thrown() { + void when_at_least_one_list_is_empty_then_an_exception_is_thrown() { Executable executable1 = () -> findKthSmallestElement(1, new int[]{}, new int[]{2}); Executable executable2 = () -> findKthSmallestElement(1, new int[]{2}, new int[]{}); @@ -39,19 +39,19 @@ public class KthSmallestUnitTest { } @Test - public void when_k_is_smaller_than_0_then_an_exception_is_thrown() { + void when_k_is_smaller_than_0_then_an_exception_is_thrown() { Executable executable1 = () -> findKthSmallestElement(-1, new int[]{2}, new int[]{2}); assertThrows(IllegalArgumentException.class, executable1); } @Test - public void when_k_is_smaller_than_1_then_an_exception_is_thrown() { + void when_k_is_smaller_than_1_then_an_exception_is_thrown() { Executable executable1 = () -> findKthSmallestElement(0, new int[]{2}, new int[]{2}); assertThrows(IllegalArgumentException.class, executable1); } @Test - public void when_k_bigger_then_the_two_lists_then_an_exception_is_thrown() { + void when_k_bigger_then_the_two_lists_then_an_exception_is_thrown() { Executable executable1 = () -> findKthSmallestElement(6, new int[]{1, 5, 6}, new int[]{2, 5}); assertThrows(NoSuchElementException.class, executable1); } diff --git a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java index 59afed65de..3770ca4ddd 100644 --- a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java +++ b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/mcts/MCTSUnitTest.java @@ -1,12 +1,13 @@ package com.baeldung.algorithms.mcts; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.List; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import com.baeldung.algorithms.mcts.montecarlo.MonteCarloTreeSearch; import com.baeldung.algorithms.mcts.montecarlo.State; @@ -15,31 +16,31 @@ import com.baeldung.algorithms.mcts.tictactoe.Board; import com.baeldung.algorithms.mcts.tictactoe.Position; import com.baeldung.algorithms.mcts.tree.Tree; -public class MCTSUnitTest { +class MCTSUnitTest { private Tree gameTree; private MonteCarloTreeSearch mcts; - @Before + @BeforeEach public void initGameTree() { gameTree = new Tree(); mcts = new MonteCarloTreeSearch(); } @Test - public void givenStats_whenGetUCTForNode_thenUCTMatchesWithManualData() { + void givenStats_whenGetUCTForNode_thenUCTMatchesWithManualData() { double uctValue = 15.79; assertEquals(UCT.uctValue(600, 300, 20), uctValue, 0.01); } @Test - public void giveninitBoardState_whenGetAllPossibleStates_thenNonEmptyList() { + void giveninitBoardState_whenGetAllPossibleStates_thenNonEmptyList() { State initState = gameTree.getRoot().getState(); List possibleStates = initState.getAllPossibleStates(); assertTrue(possibleStates.size() > 0); } @Test - public void givenEmptyBoard_whenPerformMove_thenLessAvailablePossitions() { + void givenEmptyBoard_whenPerformMove_thenLessAvailablePossitions() { Board board = new Board(); int initAvailablePositions = board.getEmptyPositions().size(); board.performMove(Board.P1, new Position(1, 1)); @@ -48,7 +49,7 @@ public class MCTSUnitTest { } @Test - public void givenEmptyBoard_whenSimulateInterAIPlay_thenGameDraw() { + void givenEmptyBoard_whenSimulateInterAIPlay_thenGameDraw() { Board board = new Board(); int player = Board.P1; @@ -61,11 +62,11 @@ public class MCTSUnitTest { player = 3 - player; } int winStatus = board.checkStatus(); - assertEquals(winStatus, Board.DRAW); + assertEquals(Board.DRAW, winStatus); } @Test - public void givenEmptyBoard_whenLevel1VsLevel3_thenLevel3WinsOrDraw() { + void givenEmptyBoard_whenLevel1VsLevel3_thenLevel3WinsOrDraw() { Board board = new Board(); MonteCarloTreeSearch mcts1 = new MonteCarloTreeSearch(); mcts1.setLevel(1); diff --git a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java index 4389795ffb..6bb8ad3e09 100644 --- a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java +++ b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java @@ -1,21 +1,22 @@ package com.baeldung.algorithms.quadtree; -import org.junit.Assert; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class QuadTreeSearchUnitTest { +class QuadTreeSearchUnitTest { private static final Logger LOGGER = LoggerFactory.getLogger(QuadTreeSearchUnitTest.class); private static QuadTree quadTree; - @BeforeClass + @BeforeAll public static void setUp() { Region area = new Region(0, 0, 400, 400); quadTree = new QuadTree(area); @@ -32,30 +33,30 @@ public class QuadTreeSearchUnitTest { } @Test - public void givenQuadTree_whenSearchingForRange_thenReturn1MatchingItem() { + void givenQuadTree_whenSearchingForRange_thenReturn1MatchingItem() { Region searchArea = new Region(200, 200, 250, 250); List result = quadTree.search(searchArea, null, ""); LOGGER.debug(result.toString()); LOGGER.debug(quadTree.printSearchTraversePath()); - Assert.assertEquals(1, result.size()); - Assert.assertArrayEquals(new float[] { 245, 238 }, + assertEquals(1, result.size()); + assertArrayEquals(new float[] { 245, 238 }, new float[]{result.get(0).getX(), result.get(0).getY() }, 0); } @Test - public void givenQuadTree_whenSearchingForRange_thenReturn2MatchingItems() { + void givenQuadTree_whenSearchingForRange_thenReturn2MatchingItems() { Region searchArea = new Region(0, 0, 100, 100); List result = quadTree.search(searchArea, null, ""); LOGGER.debug(result.toString()); LOGGER.debug(quadTree.printSearchTraversePath()); - Assert.assertEquals(2, result.size()); - Assert.assertArrayEquals(new float[] { 21, 25 }, + assertEquals(2, result.size()); + assertArrayEquals(new float[] { 21, 25 }, new float[]{result.get(0).getX(), result.get(0).getY() }, 0); - Assert.assertArrayEquals(new float[] { 55, 53 }, + assertArrayEquals(new float[] { 55, 53 }, new float[]{result.get(1).getX(), result.get(1).getY() }, 0); } diff --git a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java index d9a4f2962c..7ae9a6fcc4 100644 --- a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java +++ b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java @@ -1,71 +1,72 @@ package com.baeldung.algorithms.suffixtree; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + import java.util.List; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class SuffixTreeUnitTest { +class SuffixTreeUnitTest { private static final Logger LOGGER = LoggerFactory.getLogger(SuffixTreeUnitTest.class); private static SuffixTree suffixTree; - @BeforeClass + @BeforeAll public static void setUp() { suffixTree = new SuffixTree("havanabanana"); printTree(); } @Test - public void givenSuffixTree_whenSearchingForA_thenReturn6Matches() { + void givenSuffixTree_whenSearchingForA_thenReturn6Matches() { List matches = suffixTree.searchText("a"); matches.stream() .forEach(m -> LOGGER.debug(m)); - Assert.assertArrayEquals(new String[] { "h[a]vanabanana", "hav[a]nabanana", "havan[a]banana", "havanab[a]nana", "havanaban[a]na", "havanabanan[a]" }, matches.toArray()); + assertArrayEquals(new String[] { "h[a]vanabanana", "hav[a]nabanana", "havan[a]banana", "havanab[a]nana", "havanaban[a]na", "havanabanan[a]" }, matches.toArray()); } @Test - public void givenSuffixTree_whenSearchingForNab_thenReturn1Match() { + void givenSuffixTree_whenSearchingForNab_thenReturn1Match() { List matches = suffixTree.searchText("nab"); matches.stream() .forEach(m -> LOGGER.debug(m)); - Assert.assertArrayEquals(new String[] { "hava[nab]anana" }, matches.toArray()); + assertArrayEquals(new String[] { "hava[nab]anana" }, matches.toArray()); } @Test - public void givenSuffixTree_whenSearchingForNag_thenReturnNoMatches() { + void givenSuffixTree_whenSearchingForNag_thenReturnNoMatches() { List matches = suffixTree.searchText("nag"); matches.stream() .forEach(m -> LOGGER.debug(m)); - Assert.assertArrayEquals(new String[] {}, matches.toArray()); + assertArrayEquals(new String[] {}, matches.toArray()); } @Test - public void givenSuffixTree_whenSearchingForBanana_thenReturn2Matches() { + void givenSuffixTree_whenSearchingForBanana_thenReturn2Matches() { List matches = suffixTree.searchText("ana"); matches.stream() .forEach(m -> LOGGER.debug(m)); - Assert.assertArrayEquals(new String[] { "hav[ana]banana", "havanab[ana]na", "havanaban[ana]" }, matches.toArray()); + assertArrayEquals(new String[] { "hav[ana]banana", "havanab[ana]na", "havanaban[ana]" }, matches.toArray()); } @Test - public void givenSuffixTree_whenSearchingForNa_thenReturn4Matches() { + void givenSuffixTree_whenSearchingForNa_thenReturn4Matches() { List matches = suffixTree.searchText("na"); matches.stream() .forEach(m -> LOGGER.debug(m)); - Assert.assertArrayEquals(new String[] { "hava[na]banana", "havanaba[na]na", "havanabana[na]" }, matches.toArray()); + assertArrayEquals(new String[] { "hava[na]banana", "havanaba[na]na", "havanabana[na]" }, matches.toArray()); } @Test - public void givenSuffixTree_whenSearchingForX_thenReturnNoMatches() { + void givenSuffixTree_whenSearchingForX_thenReturnNoMatches() { List matches = suffixTree.searchText("x"); matches.stream() .forEach(m -> LOGGER.debug(m)); - Assert.assertArrayEquals(new String[] {}, matches.toArray()); + assertArrayEquals(new String[] {}, matches.toArray()); } private static void printTree() { diff --git a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java index 543ccb912f..a1a5e9cbbe 100644 --- a/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java +++ b/algorithms-modules/algorithms-searching/src/test/java/com/baeldung/algorithms/textsearch/TextSearchAlgorithmsUnitTest.java @@ -1,23 +1,24 @@ package com.baeldung.algorithms.textsearch; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class TextSearchAlgorithmsUnitTest { +class TextSearchAlgorithmsUnitTest { @Test - public void testStringSearchAlgorithms() { + void testStringSearchAlgorithms() { String text = "This is some nice text."; String pattern = "some"; int realPosition = text.indexOf(pattern); - Assert.assertTrue(realPosition == TextSearchAlgorithms.simpleTextSearch(pattern.toCharArray(), text.toCharArray())); - Assert.assertTrue(realPosition == TextSearchAlgorithms.RabinKarpMethod(pattern.toCharArray(), text.toCharArray())); - Assert.assertTrue(realPosition == TextSearchAlgorithms.KnuthMorrisPrattSearch(pattern.toCharArray(), text.toCharArray())); - Assert.assertTrue(realPosition == TextSearchAlgorithms.BoyerMooreHorspoolSimpleSearch(pattern.toCharArray(), text.toCharArray())); - Assert.assertTrue(realPosition == TextSearchAlgorithms.BoyerMooreHorspoolSearch(pattern.toCharArray(), text.toCharArray())); + assertEquals(TextSearchAlgorithms.simpleTextSearch(pattern.toCharArray(), text.toCharArray()), realPosition); + assertEquals(TextSearchAlgorithms.RabinKarpMethod(pattern.toCharArray(), text.toCharArray()), realPosition); + assertEquals(TextSearchAlgorithms.KnuthMorrisPrattSearch(pattern.toCharArray(), text.toCharArray()) , realPosition); + assertEquals(TextSearchAlgorithms.BoyerMooreHorspoolSimpleSearch(pattern.toCharArray(), text.toCharArray()), realPosition); + assertEquals(TextSearchAlgorithms.BoyerMooreHorspoolSearch(pattern.toCharArray(), text.toCharArray()), realPosition); } } diff --git a/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java index aaa5de87e1..d8b9887605 100644 --- a/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java +++ b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/bynumber/NaturalOrderComparatorsUnitTest.java @@ -1,17 +1,19 @@ package com.baeldung.algorithms.bynumber; -import org.junit.Test; + + +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; -public class NaturalOrderComparatorsUnitTest { +class NaturalOrderComparatorsUnitTest { @Test - public void givenSimpleStringsContainingIntsAndDoubles_whenSortedByRegex_checkSortingCorrect() { + void givenSimpleStringsContainingIntsAndDoubles_whenSortedByRegex_checkSortingCorrect() { List testStrings = Arrays.asList("a1", "b3", "c4", "d2.2", "d2.4", "d2.3d"); @@ -25,7 +27,7 @@ public class NaturalOrderComparatorsUnitTest { } @Test - public void givenSimpleStringsContainingIntsAndDoublesWithAnInvalidNumber_whenSortedByRegex_checkSortingCorrect() { + void givenSimpleStringsContainingIntsAndDoublesWithAnInvalidNumber_whenSortedByRegex_checkSortingCorrect() { List testStrings = Arrays.asList("a1", "b3", "c4", "d2.2", "d2.4", "d2.3.3d"); @@ -39,7 +41,7 @@ public class NaturalOrderComparatorsUnitTest { } @Test - public void givenAllForseenProblems_whenSortedByRegex_checkSortingCorrect() { + void givenAllForseenProblems_whenSortedByRegex_checkSortingCorrect() { List testStrings = Arrays.asList("a1", "b3", "c4", "d2.2", "d2.f4", "d2.3.3d"); @@ -53,7 +55,7 @@ public class NaturalOrderComparatorsUnitTest { } @Test - public void givenComplexStringsContainingSeparatedNumbers_whenSortedByRegex_checkNumbersCondensedAndSorted() { + void givenComplexStringsContainingSeparatedNumbers_whenSortedByRegex_checkNumbersCondensedAndSorted() { List testStrings = Arrays.asList("a1b2c5", "b3ght3.2", "something65.thensomething5"); //125, 33.2, 65.5 @@ -66,7 +68,7 @@ public class NaturalOrderComparatorsUnitTest { } @Test - public void givenStringsNotContainingNumbers_whenSortedByRegex_checkOrderNotChanged() { + void givenStringsNotContainingNumbers_whenSortedByRegex_checkOrderNotChanged() { List testStrings = Arrays.asList("a", "c", "d", "e"); List expected = new ArrayList<>(testStrings); diff --git a/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/gravitysort/GravitySortUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/gravitysort/GravitySortUnitTest.java index 89fc1ed687..c1ef611ab6 100644 --- a/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/gravitysort/GravitySortUnitTest.java +++ b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/gravitysort/GravitySortUnitTest.java @@ -1,15 +1,16 @@ package com.baeldung.algorithms.gravitysort; -import org.junit.Assert; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; -public class GravitySortUnitTest { +import org.junit.jupiter.api.Test; + +class GravitySortUnitTest { @Test - public void givenIntegerArray_whenSortedWithGravitySort_thenGetSortedArray() { + void givenIntegerArray_whenSortedWithGravitySort_thenGetSortedArray() { int[] actual = { 9, 9, 100, 3, 57, 12, 3, 78, 0, 2, 2, 40, 21, 9 }; int[] expected = { 0, 2, 2, 3, 3, 9, 9, 9, 12, 21, 40, 57, 78, 100 }; GravitySort.sort(actual); - Assert.assertArrayEquals(expected, actual); + assertArrayEquals(expected, actual); } } diff --git a/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java index 321b905f68..2d87dfaf1e 100644 --- a/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java +++ b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java @@ -1,23 +1,22 @@ package com.baeldung.algorithms.inoutsort; -import static org.junit.Assert.*; -import static org.junit.Assert.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class InOutSortUnitTest { +class InOutSortUnitTest { @Test - public void givenArray_whenInPlaceSort_thenReversed() { + void givenArray_whenInPlaceSort_thenReversed() { int[] input = {1, 2, 3, 4, 5, 6, 7}; int[] expected = {7, 6, 5, 4, 3, 2, 1}; - assertArrayEquals("the two arrays are not equal", expected, InOutSort.reverseInPlace(input)); + assertArrayEquals(expected, InOutSort.reverseInPlace(input), "the two arrays are not equal"); } @Test - public void givenArray_whenOutOfPlaceSort_thenReversed() { + void givenArray_whenOutOfPlaceSort_thenReversed() { int[] input = {1, 2, 3, 4, 5, 6, 7}; int[] expected = {7, 6, 5, 4, 3, 2, 1}; - assertArrayEquals("the two arrays are not equal", expected, InOutSort.reverseOutOfPlace(input)); + assertArrayEquals(expected, InOutSort.reverseOutOfPlace(input), "the two arrays are not equal"); } } diff --git a/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java index 847f7f8acb..02cb01ab71 100644 --- a/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java +++ b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/BentleyMcilroyPartitioningUnitTest.java @@ -1,16 +1,17 @@ package com.baeldung.algorithms.quicksort; -import org.junit.Assert; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; -public class BentleyMcilroyPartitioningUnitTest { +import org.junit.jupiter.api.Test; + +class BentleyMcilroyPartitioningUnitTest { @Test - public void given_IntegerArray_whenSortedWithBentleyMcilroyPartitioning_thenGetSortedArray() { + void given_IntegerArray_whenSortedWithBentleyMcilroyPartitioning_thenGetSortedArray() { int[] actual = {3, 2, 2, 2, 3, 7, 7, 3, 2, 2, 7, 3, 3}; int[] expected = {2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 7, 7, 7}; BentleyMcIlroyPartioning.quicksort(actual, 0, actual.length - 1); - Assert.assertArrayEquals(expected, actual); + assertArrayEquals(expected, actual); } } diff --git a/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java index a8e27253cc..f8eec55e8f 100644 --- a/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java +++ b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/quicksort/DNFThreeWayQuickSortUnitTest.java @@ -1,15 +1,16 @@ package com.baeldung.algorithms.quicksort; -import org.junit.Assert; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; -public class DNFThreeWayQuickSortUnitTest { +import org.junit.jupiter.api.Test; + +class DNFThreeWayQuickSortUnitTest { @Test - public void givenIntegerArray_whenSortedWithThreeWayQuickSort_thenGetSortedArray() { + void givenIntegerArray_whenSortedWithThreeWayQuickSort_thenGetSortedArray() { int[] actual = {3, 5, 5, 5, 3, 7, 7, 3, 5, 5, 7, 3, 3}; int[] expected = {3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 7, 7, 7}; DutchNationalFlagPartioning.quicksort(actual, 0, actual.length - 1); - Assert.assertArrayEquals(expected, actual); + assertArrayEquals(expected, actual); } } diff --git a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java index 210ee2378a..edbd352020 100644 --- a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java +++ b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bubblesort/BubbleSortUnitTest.java @@ -4,10 +4,10 @@ import static org.junit.jupiter.api.Assertions.assertArrayEquals; import org.junit.jupiter.api.Test; -public class BubbleSortUnitTest { +class BubbleSortUnitTest { @Test - public void givenIntegerArray_whenSortedWithBubbleSort_thenGetSortedArray() { + void givenIntegerArray_whenSortedWithBubbleSort_thenGetSortedArray() { Integer[] array = { 2, 1, 4, 6, 3, 5 }; Integer[] sortedArray = { 1, 2, 3, 4, 5, 6 }; BubbleSort bubbleSort = new BubbleSort(); @@ -16,7 +16,7 @@ public class BubbleSortUnitTest { } @Test - public void givenIntegerArray_whenSortedWithOptimizedBubbleSort_thenGetSortedArray() { + void givenIntegerArray_whenSortedWithOptimizedBubbleSort_thenGetSortedArray() { Integer[] array = { 2, 1, 4, 6, 3, 5 }; Integer[] sortedArray = { 1, 2, 3, 4, 5, 6 }; BubbleSort bubbleSort = new BubbleSort(); diff --git a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java index 4671819673..3916834c83 100644 --- a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java +++ b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java @@ -1,24 +1,26 @@ package com.baeldung.algorithms.bucketsort; -import static org.junit.Assert.assertEquals; + + +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.Arrays; import java.util.List; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -public class IntegerBucketSorterUnitTest { +class IntegerBucketSorterUnitTest { private IntegerBucketSorter sorter; - @Before + @BeforeEach public void setUp() throws Exception { sorter = new IntegerBucketSorter(); } @Test - public void givenUnsortedList_whenSortedUsingBucketSorter_checkSortingCorrect() { + void givenUnsortedList_whenSortedUsingBucketSorter_checkSortingCorrect() { List unsorted = Arrays.asList(80,50,60,30,20,10,70,0,40,500,600,602,200,15); List expected = Arrays.asList(0,10,15,20,30,40,50,60,70,80,200,500,600,602); @@ -26,7 +28,5 @@ public class IntegerBucketSorterUnitTest { List actual = sorter.sort(unsorted); assertEquals(expected, actual); - - } } \ No newline at end of file diff --git a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java index 96e4936eaf..b4240f0287 100644 --- a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java +++ b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java @@ -1,16 +1,16 @@ package com.baeldung.algorithms.heapsort; -import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import java.util.Arrays; import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class HeapUnitTest { +class HeapUnitTest { @Test - public void givenNotEmptyHeap_whenPopCalled_thenItShouldReturnSmallestElement() { + void givenNotEmptyHeap_whenPopCalled_thenItShouldReturnSmallestElement() { // given Heap heap = Heap.of(3, 5, 1, 4, 2); @@ -22,7 +22,7 @@ public class HeapUnitTest { } @Test - public void givenNotEmptyIterable_whenSortCalled_thenItShouldReturnElementsInSortedList() { + void givenNotEmptyIterable_whenSortCalled_thenItShouldReturnElementsInSortedList() { // given List elements = Arrays.asList(3, 5, 1, 4, 2); diff --git a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java index b3d7e8c534..5845df45ae 100644 --- a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java +++ b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/insertionsort/InsertionSortUnitTest.java @@ -1,25 +1,25 @@ package com.baeldung.algorithms.insertionsort; -import com.baeldung.algorithms.insertionsort.InsertionSort; -import org.junit.Test; -import static org.junit.Assert.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; -public class InsertionSortUnitTest { +import org.junit.jupiter.api.Test; + +class InsertionSortUnitTest { @Test - public void givenUnsortedArray_whenInsertionSortImperative_thenSortedAsc() { + void givenUnsortedArray_whenInsertionSortImperative_thenSortedAsc() { int[] input = {6, 2, 3, 4, 5, 1}; InsertionSort.insertionSortImperative(input); int[] expected = {1, 2, 3, 4, 5, 6}; - assertArrayEquals("the two arrays are not equal", expected, input); + assertArrayEquals(expected, input, "the two arrays are not equal"); } @Test - public void givenUnsortedArray_whenInsertionSortRecursive_thenSortedAsc() { + void givenUnsortedArray_whenInsertionSortRecursive_thenSortedAsc() { int[] input = {6, 4, 5, 2, 3, 1}; InsertionSort.insertionSortRecursive(input); int[] expected = {1, 2, 3, 4, 5, 6}; - assertArrayEquals("the two arrays are not equal", expected, input); + assertArrayEquals( expected, input, "the two arrays are not equal"); } } diff --git a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java index 5cd14b7bd0..cc663458bd 100644 --- a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java +++ b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/mergesort/MergeSortUnitTest.java @@ -1,17 +1,17 @@ package com.baeldung.algorithms.mergesort; -import org.junit.Assert; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class MergeSortUnitTest { +class MergeSortUnitTest { @Test - public void positiveTest() { + void positiveTest() { int[] actual = { 5, 1, 6, 2, 3, 4 }; int[] expected = { 1, 2, 3, 4, 5, 6 }; MergeSort.mergeSort(actual, actual.length); - Assert.assertArrayEquals(expected, actual); + assertArrayEquals(expected, actual); } } diff --git a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java index c9af5b4bf8..c4e53cc50b 100644 --- a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java +++ b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/QuickSortUnitTest.java @@ -1,17 +1,17 @@ package com.baeldung.algorithms.quicksort; -import com.baeldung.algorithms.quicksort.QuickSort; -import org.junit.Assert; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; -public class QuickSortUnitTest { +import org.junit.jupiter.api.Test; + +class QuickSortUnitTest { @Test - public void givenIntegerArray_whenSortedWithQuickSort_thenGetSortedArray() { + void givenIntegerArray_whenSortedWithQuickSort_thenGetSortedArray() { int[] actual = { 9, 5, 1, 0, 6, 2, 3, 4, 7, 8 }; int[] expected = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; QuickSort.quickSort(actual, 0, actual.length-1); - Assert.assertArrayEquals(expected, actual); + assertArrayEquals(expected, actual); } } diff --git a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java index cd8c7c1241..bb0b5c6bd3 100644 --- a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java +++ b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/quicksort/ThreeWayQuickSortUnitTest.java @@ -1,15 +1,16 @@ package com.baeldung.algorithms.quicksort; -import org.junit.Assert; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; -public class ThreeWayQuickSortUnitTest { +import org.junit.jupiter.api.Test; + +class ThreeWayQuickSortUnitTest { @Test public void givenIntegerArray_whenSortedWithThreeWayQuickSort_thenGetSortedArray() { int[] actual = { 3, 5, 5, 5, 3, 7, 7, 3, 5, 5, 7, 3, 3 }; int[] expected = { 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 7, 7, 7 }; ThreeWayQuickSort.threeWayQuickSort(actual, 0, actual.length-1); - Assert.assertArrayEquals(expected, actual); + assertArrayEquals(expected, actual); } } diff --git a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java index 0f6c751ade..66225344cd 100644 --- a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java +++ b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java @@ -1,13 +1,13 @@ package com.baeldung.algorithms.radixsort; -import static org.junit.Assert.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class RadixSortUnitTest { +class RadixSortUnitTest { @Test - public void givenUnsortedArray_whenRadixSort_thenArraySorted() { + void givenUnsortedArray_whenRadixSort_thenArraySorted() { int[] numbers = { 387, 468, 134, 123, 68, 221, 769, 37, 7 }; RadixSort.sort(numbers); int[] numbersSorted = { 7, 37, 68, 123, 134, 221, 387, 468, 769 }; diff --git a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java index 85efd1d3da..3cbc88e128 100644 --- a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java +++ b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java @@ -1,25 +1,24 @@ package com.baeldung.algorithms.selectionsort; -import static org.junit.Assert.*; -import static org.junit.Assert.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class SelectionSortUnitTest { +class SelectionSortUnitTest { @Test - public void givenUnsortedArray_whenSelectionSort_SortAscending_thenSortedAsc() { + void givenUnsortedArray_whenSelectionSort_SortAscending_thenSortedAsc() { int[] input = { 5, 4, 1, 6, 2 }; SelectionSort.sortAscending(input); int[] expected = {1, 2, 4, 5, 6}; - assertArrayEquals("the two arrays are not equal", expected, input); + assertArrayEquals(expected, input, "the two arrays are not equal"); } @Test - public void givenUnsortedArray_whenSelectionSort_SortDescending_thenSortedDesc() { + void givenUnsortedArray_whenSelectionSort_SortDescending_thenSortedDesc() { int[] input = { 5, 4, 1, 6, 2 }; SelectionSort.sortDescending(input); int[] expected = {6, 5, 4, 2, 1}; - assertArrayEquals("the two arrays are not equal", expected, input); + assertArrayEquals(expected, input, "the two arrays are not equal"); } } diff --git a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java index 91a27c41d0..38a861c2c0 100644 --- a/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java +++ b/algorithms-modules/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java @@ -1,17 +1,17 @@ package com.baeldung.algorithms.shellsort; -import static org.junit.Assert.*; -import static org.junit.Assert.assertArrayEquals; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; -public class ShellSortUnitTest { +import org.junit.jupiter.api.Test; + +class ShellSortUnitTest { @Test - public void givenUnsortedArray_whenShellSort_thenSortedAsc() { + void givenUnsortedArray_whenShellSort_thenSortedAsc() { int[] input = {41, 15, 82, 5, 65, 19, 32, 43, 8}; ShellSort.sort(input); int[] expected = {5, 8, 15, 19, 32, 41, 43, 65, 82}; - assertArrayEquals("the two arrays are not equal", expected, input); + assertArrayEquals( expected, input, "the two arrays are not equal"); } } diff --git a/pom.xml b/pom.xml index 431d712c6b..05f8326e4c 100644 --- a/pom.xml +++ b/pom.xml @@ -330,8 +330,6 @@ parent-spring-5 parent-java - algorithms-modules - apache-cxf-modules apache-libraries apache-poi @@ -615,8 +613,6 @@ parent-spring-5 parent-java - algorithms-modules - apache-cxf-modules apache-libraries apache-poi @@ -912,6 +908,7 @@ + algorithms-modules core-java-modules/core-java-9 core-java-modules/core-java-9-improvements core-java-modules/core-java-9-jigsaw @@ -1108,6 +1105,7 @@ + algorithms-modules core-java-modules/core-java-9 core-java-modules/core-java-9-improvements core-java-modules/core-java-9-jigsaw From 16d05291af3c67b894b30082246dc27583008304 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 7 Feb 2023 15:39:57 +0000 Subject: [PATCH 415/592] Java 15035 (#13421) * [JAVA-15035] Created module httpclient4 and moved related code * [JAVA-15035] Upgraded httpclient-simple to spring-boot-e * [JAVA-15035] Moved modules to to right profiles * [JAVA-15026] Upgraded headers code to apache 5.2 + moved code related to 4.5 to httpclient4 module * [JAVA-14911] Final clean up for http-client module --------- Co-authored-by: panagiotiskakos --- httpclient-simple/pom.xml | 184 +++-------- .../MyBasicAuthenticationEntryPoint.java | 4 +- ...entsClientHttpRequestFactoryBasicAuth.java | 15 +- .../baeldung/client/RestTemplateFactory.java | 4 +- .../com/baeldung/filter/CustomFilter.java | 8 +- .../CustomWebSecurityConfigurerAdapter.java | 33 +- ...uestAwareAuthenticationSuccessHandler.java | 6 +- .../RestAuthenticationEntryPoint.java | 4 +- .../main/java/com/baeldung/web/dto/Bar.java | 2 +- .../main/java/com/baeldung/web/dto/Foo.java | 2 +- .../com/baeldung/client/ClientLiveTest.java | 37 +-- .../client/RestClientLiveManualTest.java | 100 ++---- .../httpclient/HttpClientHeadersLiveTest.java | 116 +++---- .../httpclient/HttpClientParamsLiveTest.java | 80 +++-- .../httpclient/HttpClientTimeoutLiveTest.java | 1 - .../httpclient/HttpsClientSslLiveTest.java | 134 +++----- .../base/HttpClientBasicLiveTest.java | 10 +- .../java/com/baeldung/test/LiveTestSuite.java | 16 - httpclient4/.gitignore | 13 + httpclient4/README.md | 13 + httpclient4/pom.xml | 291 ++++++++++++++++++ .../MyBasicAuthenticationEntryPoint.java | 30 ++ ...entsClientHttpRequestFactoryBasicAuth.java | 39 +++ .../baeldung/client/RestTemplateFactory.java | 44 +++ .../baeldung/client/spring/ClientConfig.java | 16 + .../com/baeldung/filter/CustomFilter.java | 18 ++ .../CustomWebSecurityConfigurerAdapter.java | 49 +++ ...uestAwareAuthenticationSuccessHandler.java | 48 +++ .../RestAuthenticationEntryPoint.java | 23 ++ .../baeldung/spring/SecSecurityConfig.java | 16 + .../java/com/baeldung/spring/WebConfig.java | 30 ++ .../web/controller/BarController.java | 31 ++ .../web/controller/FooController.java | 33 ++ .../main/java/com/baeldung/web/dto/Bar.java | 14 + .../main/java/com/baeldung/web/dto/Foo.java | 14 + httpclient4/src/main/resources/logback.xml | 19 ++ .../src/main/resources/webSecurityConfig.xml | 28 ++ .../src/main/webapp/WEB-INF/api-servlet.xml | 6 + httpclient4/src/main/webapp/WEB-INF/web.xml | 43 +++ .../com/baeldung/client/ClientLiveTest.java | 99 ++++++ .../client/RestClientV4LiveManualTest.java | 92 ++++++ .../HttpClientHeaderV4LiveTest.java | 24 ++ .../HttpClientTimeoutV4LiveTest.java | 2 +- .../httpclient/HttpsClientV4SslLiveTest.java | 111 +++++++ .../com/baeldung/httpclient/ResponseUtil.java | 0 httpclient4/src/test/resources/.gitignore | 13 + httpclient4/src/test/resources/test.in | 1 + pom.xml | 6 +- 48 files changed, 1441 insertions(+), 481 deletions(-) delete mode 100644 httpclient-simple/src/test/java/com/baeldung/test/LiveTestSuite.java create mode 100644 httpclient4/.gitignore create mode 100644 httpclient4/README.md create mode 100644 httpclient4/pom.xml create mode 100644 httpclient4/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java create mode 100644 httpclient4/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java create mode 100644 httpclient4/src/main/java/com/baeldung/client/RestTemplateFactory.java create mode 100644 httpclient4/src/main/java/com/baeldung/client/spring/ClientConfig.java create mode 100644 httpclient4/src/main/java/com/baeldung/filter/CustomFilter.java create mode 100644 httpclient4/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java create mode 100644 httpclient4/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java create mode 100644 httpclient4/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java create mode 100644 httpclient4/src/main/java/com/baeldung/spring/SecSecurityConfig.java create mode 100644 httpclient4/src/main/java/com/baeldung/spring/WebConfig.java create mode 100644 httpclient4/src/main/java/com/baeldung/web/controller/BarController.java create mode 100644 httpclient4/src/main/java/com/baeldung/web/controller/FooController.java create mode 100644 httpclient4/src/main/java/com/baeldung/web/dto/Bar.java create mode 100644 httpclient4/src/main/java/com/baeldung/web/dto/Foo.java create mode 100644 httpclient4/src/main/resources/logback.xml create mode 100644 httpclient4/src/main/resources/webSecurityConfig.xml create mode 100644 httpclient4/src/main/webapp/WEB-INF/api-servlet.xml create mode 100644 httpclient4/src/main/webapp/WEB-INF/web.xml create mode 100644 httpclient4/src/test/java/com/baeldung/client/ClientLiveTest.java create mode 100644 httpclient4/src/test/java/com/baeldung/client/RestClientV4LiveManualTest.java create mode 100644 httpclient4/src/test/java/com/baeldung/httpclient/HttpClientHeaderV4LiveTest.java rename {httpclient-simple => httpclient4}/src/test/java/com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java (97%) create mode 100644 httpclient4/src/test/java/com/baeldung/httpclient/HttpsClientV4SslLiveTest.java rename {httpclient-simple => httpclient4}/src/test/java/com/baeldung/httpclient/ResponseUtil.java (100%) create mode 100644 httpclient4/src/test/resources/.gitignore create mode 100644 httpclient4/src/test/resources/test.in diff --git a/httpclient-simple/pom.xml b/httpclient-simple/pom.xml index c39983564f..eea056477c 100644 --- a/httpclient-simple/pom.xml +++ b/httpclient-simple/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 httpclient-simple 0.1-SNAPSHOT @@ -10,90 +10,61 @@ com.baeldung - parent-spring-5 + parent-boot-3 0.0.1-SNAPSHOT - ../parent-spring-5 + ../parent-boot-3 - - org.springframework.security - spring-security-web - ${spring-security.version} + org.springframework.boot + spring-boot-starter - org.springframework.security - spring-security-config - ${spring-security.version} - - - - org.springframework - spring-core - ${spring.version} - - - commons-logging - commons-logging - - + org.springframework.boot + spring-boot-starter-security - org.springframework - spring-context - ${spring.version} + org.springframework.boot + spring-boot-starter-jdbc - org.springframework - spring-jdbc - ${spring.version} + org.springframework.boot + spring-boot-starter-aop - org.springframework - spring-beans - ${spring.version} + org.springframework.boot + spring-boot-starter-web - org.springframework - spring-aop - ${spring.version} + jakarta.xml.bind + jakarta.xml.bind-api + 4.0.0 - org.springframework - spring-tx - ${spring.version} - - - org.springframework - spring-expression - ${spring.version} - - - org.springframework - spring-web - ${spring.version} - - - org.springframework - spring-webmvc - ${spring.version} - - - org.springframework - spring-oxm - ${spring.version} + com.sun.xml.bind + jaxb-impl + 4.0.0 + runtime + com.fasterxml.jackson.core jackson-databind ${jackson.version} + - org.apache.httpcomponents - httpcore - ${httpcore.version} + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + org.apache.httpcomponents.client5 + httpclient5 + ${httpclient5.version} commons-logging @@ -112,7 +83,6 @@ - org.apache.httpcomponents.client5 httpclient5-fluent @@ -124,67 +94,11 @@ - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - - org.apache.httpcomponents - httpclient - ${httpclient.version} - - - commons-logging - commons-logging - - - - - org.apache.httpcomponents - fluent-hc - ${httpclient.version} - - - commons-logging - commons-logging - - - - - org.apache.httpcomponents.client5 - httpclient5 - ${httpclient5.version} - - - commons-logging - commons-logging - - - - - org.apache.httpcomponents - httpmime - ${httpclient.version} - commons-codec commons-codec ${commons-codec.version} - - org.apache.httpcomponents - httpasyncclient - ${httpasyncclient.version} - - - commons-logging - commons-logging - - - com.github.tomakehurst wiremock @@ -210,13 +124,6 @@ guava ${guava.version} - - - org.springframework - spring-test - ${spring.version} - test - @@ -231,26 +138,13 @@ org.apache.maven.plugins maven-war-plugin - ${maven-war-plugin.version} + 3.3.2 - org.codehaus.cargo - cargo-maven2-plugin - ${cargo-maven2-plugin.version} + org.springframework.boot + spring-boot-maven-plugin - true - - jetty8x - embedded - - - - - - - 8082 - - + true @@ -263,7 +157,7 @@ org.codehaus.cargo - cargo-maven2-plugin + cargo-maven3-plugin start-server @@ -310,13 +204,11 @@ + 17 1.10 - 4.1.4 2.5.1 - 4.4.11 - 4.5.8 5.2 5.2 diff --git a/httpclient-simple/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java b/httpclient-simple/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java index cafd8cfb7b..487794cc7f 100644 --- a/httpclient-simple/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java +++ b/httpclient-simple/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java @@ -3,8 +3,8 @@ package com.baeldung.basic; import java.io.IOException; import java.io.PrintWriter; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint; diff --git a/httpclient-simple/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java b/httpclient-simple/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java index 81f82a2c1c..7a0599cd49 100644 --- a/httpclient-simple/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java +++ b/httpclient-simple/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java @@ -2,13 +2,13 @@ package com.baeldung.client; import java.net.URI; -import org.apache.http.HttpHost; -import org.apache.http.client.AuthCache; -import org.apache.http.client.protocol.HttpClientContext; -import org.apache.http.impl.auth.BasicScheme; -import org.apache.http.impl.client.BasicAuthCache; -import org.apache.http.protocol.BasicHttpContext; -import org.apache.http.protocol.HttpContext; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.client5.http.auth.AuthCache; +import org.apache.hc.client5.http.impl.auth.BasicAuthCache; +import org.apache.hc.client5.http.impl.auth.BasicScheme; +import org.apache.hc.client5.http.protocol.HttpClientContext; +import org.apache.hc.core5.http.protocol.BasicHttpContext; +import org.apache.hc.core5.http.protocol.HttpContext; import org.springframework.http.HttpMethod; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; @@ -21,6 +21,7 @@ public class HttpComponentsClientHttpRequestFactoryBasicAuth extends HttpCompone this.host = host; } + @Override protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { return createHttpContext(); } diff --git a/httpclient-simple/src/main/java/com/baeldung/client/RestTemplateFactory.java b/httpclient-simple/src/main/java/com/baeldung/client/RestTemplateFactory.java index aac4f8cebd..fafaae0157 100644 --- a/httpclient-simple/src/main/java/com/baeldung/client/RestTemplateFactory.java +++ b/httpclient-simple/src/main/java/com/baeldung/client/RestTemplateFactory.java @@ -1,6 +1,6 @@ package com.baeldung.client; -import org.apache.http.HttpHost; +import org.apache.hc.core5.http.HttpHost; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.http.client.ClientHttpRequestFactory; @@ -35,7 +35,7 @@ public class RestTemplateFactory implements FactoryBean, Initializ @Override public void afterPropertiesSet() { - HttpHost host = new HttpHost("localhost", 8082, "http"); + HttpHost host = new HttpHost("http", "localhost", 8082); final ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactoryBasicAuth(host); restTemplate = new RestTemplate(requestFactory); restTemplate.getInterceptors().add(new BasicAuthenticationInterceptor("user1", "user1Pass")); diff --git a/httpclient-simple/src/main/java/com/baeldung/filter/CustomFilter.java b/httpclient-simple/src/main/java/com/baeldung/filter/CustomFilter.java index 6bb12610fa..a9509ddafa 100644 --- a/httpclient-simple/src/main/java/com/baeldung/filter/CustomFilter.java +++ b/httpclient-simple/src/main/java/com/baeldung/filter/CustomFilter.java @@ -2,10 +2,10 @@ package com.baeldung.filter; import org.springframework.web.filter.GenericFilterBean; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import java.io.IOException; public class CustomFilter extends GenericFilterBean { diff --git a/httpclient-simple/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java b/httpclient-simple/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java index fb597e46c8..859b900170 100644 --- a/httpclient-simple/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java +++ b/httpclient-simple/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java @@ -7,41 +7,38 @@ 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; @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth - .inMemoryAuthentication() - .withUser("user1") - .password(passwordEncoder().encode("user1Pass")) - .authorities("ROLE_USER"); + .inMemoryAuthentication() + .withUser("user1") + .password(passwordEncoder().encode("user1Pass")) + .authorities("ROLE_USER"); } - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeRequests() - .antMatchers("/securityNone") - .permitAll() - .anyRequest() - .authenticated() - .and() - .httpBasic() - .authenticationEntryPoint(authenticationEntryPoint); + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + + http.authorizeHttpRequests((authorize) -> authorize.anyRequest() + .authenticated()) + .httpBasic() + .authenticationEntryPoint(authenticationEntryPoint); http.addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class); + return http.build(); } - + @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); diff --git a/httpclient-simple/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java b/httpclient-simple/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java index 7dc53e3e1e..d53aa5bdfe 100644 --- a/httpclient-simple/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java +++ b/httpclient-simple/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java @@ -2,9 +2,9 @@ package com.baeldung.security; import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; diff --git a/httpclient-simple/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java b/httpclient-simple/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java index 1ae89adb89..615982fae4 100644 --- a/httpclient-simple/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java +++ b/httpclient-simple/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java @@ -2,8 +2,8 @@ package com.baeldung.security; import java.io.IOException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; diff --git a/httpclient-simple/src/main/java/com/baeldung/web/dto/Bar.java b/httpclient-simple/src/main/java/com/baeldung/web/dto/Bar.java index eb139b0ec1..1bb7476669 100644 --- a/httpclient-simple/src/main/java/com/baeldung/web/dto/Bar.java +++ b/httpclient-simple/src/main/java/com/baeldung/web/dto/Bar.java @@ -2,7 +2,7 @@ package com.baeldung.web.dto; import java.io.Serializable; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Bar implements Serializable { diff --git a/httpclient-simple/src/main/java/com/baeldung/web/dto/Foo.java b/httpclient-simple/src/main/java/com/baeldung/web/dto/Foo.java index 23cfab132d..f904be0ad9 100644 --- a/httpclient-simple/src/main/java/com/baeldung/web/dto/Foo.java +++ b/httpclient-simple/src/main/java/com/baeldung/web/dto/Foo.java @@ -2,7 +2,7 @@ package com.baeldung.web.dto; import java.io.Serializable; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Foo implements Serializable { diff --git a/httpclient-simple/src/test/java/com/baeldung/client/ClientLiveTest.java b/httpclient-simple/src/test/java/com/baeldung/client/ClientLiveTest.java index 78e9813f06..1c7e766a72 100644 --- a/httpclient-simple/src/test/java/com/baeldung/client/ClientLiveTest.java +++ b/httpclient-simple/src/test/java/com/baeldung/client/ClientLiveTest.java @@ -1,25 +1,23 @@ package com.baeldung.client; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; -import com.baeldung.client.spring.ClientConfig; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + import com.baeldung.web.dto.Foo; -import org.junit.Test; -import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; + import org.springframework.web.client.ResourceAccessException; import org.springframework.web.client.RestTemplate; -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { ClientConfig.class }, loader = AnnotationConfigContextLoader.class) -public class ClientLiveTest { +class ClientLiveTest { @Autowired private RestTemplate secureRestTemplate; @@ -27,21 +25,24 @@ public class ClientLiveTest { // tests @Test - public final void whenContextIsBootstrapped_thenNoExceptions() { + void whenContextIsBootstrapped_thenNoExceptions() { // } @Test - public final void whenSecuredRestApiIsConsumed_then200OK() { + void whenSecuredRestApiIsConsumed_then200OK() { final ResponseEntity responseEntity = secureRestTemplate.exchange("http://localhost:8082/httpclient-simple/api/foos/1", HttpMethod.GET, null, Foo.class); assertThat(responseEntity.getStatusCode().value(), is(200)); } - @Test(expected = ResourceAccessException.class) - public final void whenHttpsUrlIsConsumed_thenException() { + @Test + void whenHttpsUrlIsConsumed_thenException() { final String urlOverHttps = "https://localhost:8443/httpclient-simple/api/bars/1"; - final ResponseEntity response = new RestTemplate().exchange(urlOverHttps, HttpMethod.GET, null, String.class); - assertThat(response.getStatusCode().value(), equalTo(200)); + assertThrows(ResourceAccessException.class, () -> { + final ResponseEntity response = new RestTemplate() + .exchange(urlOverHttps, HttpMethod.GET, null, String.class); + assertThat(response.getStatusCode().value(), equalTo(200)); + }); } } diff --git a/httpclient-simple/src/test/java/com/baeldung/client/RestClientLiveManualTest.java b/httpclient-simple/src/test/java/com/baeldung/client/RestClientLiveManualTest.java index d133bc376c..efa0695aaf 100644 --- a/httpclient-simple/src/test/java/com/baeldung/client/RestClientLiveManualTest.java +++ b/httpclient-simple/src/test/java/com/baeldung/client/RestClientLiveManualTest.java @@ -1,112 +1,78 @@ package com.baeldung.client; -import static org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; -import java.io.IOException; import java.security.GeneralSecurityException; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLPeerUnverifiedException; -import org.apache.http.HttpResponse; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.config.Registry; -import org.apache.http.config.RegistryBuilder; -import org.apache.http.conn.scheme.Scheme; -import org.apache.http.conn.socket.ConnectionSocketFactory; -import org.apache.http.conn.socket.PlainConnectionSocketFactory; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLSocketFactory; -import org.apache.http.conn.ssl.TrustStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.conn.BasicHttpClientConnectionManager; -import org.apache.http.ssl.SSLContexts; -import org.junit.Ignore; -import org.junit.Test; +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.client5.http.impl.io.BasicHttpClientConnectionManager; +import org.apache.hc.client5.http.socket.ConnectionSocketFactory; +import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory; +import org.apache.hc.client5.http.ssl.NoopHostnameVerifier; +import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; +import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.core5.http.config.Registry; +import org.apache.hc.core5.http.config.RegistryBuilder; +import org.apache.hc.core5.ssl.SSLContexts; +import org.apache.hc.core5.ssl.TrustStrategy; +import org.junit.jupiter.api.Test; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.ResourceAccessException; import org.springframework.web.client.RestTemplate; +import com.baeldung.handler.CustomHttpClientResponseHandler; + + /** * This test requires a localhost server over HTTPS
    * It should only be manually run, not part of the automated build * */ -public class RestClientLiveManualTest { +class RestClientLiveManualTest { final String urlOverHttps = "http://localhost:8082/httpclient-simple/api/bars/1"; - // tests - // old httpClient will throw UnsupportedOperationException - @Ignore - @Test - public final void givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenOk() throws GeneralSecurityException { - final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); - final CloseableHttpClient httpClient = (CloseableHttpClient) requestFactory.getHttpClient(); - - final TrustStrategy acceptingTrustStrategy = (cert, authType) -> true; - - final SSLSocketFactory sf = new SSLSocketFactory(acceptingTrustStrategy, ALLOW_ALL_HOSTNAME_VERIFIER); - httpClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", 8443, sf)); - - final ResponseEntity response = new RestTemplate(requestFactory).exchange(urlOverHttps, HttpMethod.GET, null, String.class); - assertThat(response.getStatusCode().value(), equalTo(200)); - } - // new httpClient : 4.4 and above @Test - public final void givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenOk_2() throws GeneralSecurityException { + void givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenOk() throws GeneralSecurityException { final TrustStrategy acceptingTrustStrategy = (cert, authType) -> true; final SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build(); final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE); final Registry socketFactoryRegistry = RegistryBuilder. create() - .register("https", sslsf) - .register("http", new PlainConnectionSocketFactory()) - .build(); + .register("https", sslsf) + .register("http", new PlainConnectionSocketFactory()) + .build(); final BasicHttpClientConnectionManager connectionManager = new BasicHttpClientConnectionManager(socketFactoryRegistry); final CloseableHttpClient httpClient = HttpClients.custom() - .setSSLSocketFactory(sslsf) - .setConnectionManager(connectionManager) - .build(); + .setConnectionManager(connectionManager) + .build(); final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); final ResponseEntity response = new RestTemplate(requestFactory).exchange(urlOverHttps, HttpMethod.GET, null, String.class); assertThat(response.getStatusCode().value(), equalTo(200)); } - @Test - public final void givenAcceptingAllCertificatesUsing4_4_whenHttpsUrlIsConsumed_thenCorrect() throws ClientProtocolException, IOException { - final CloseableHttpClient httpClient = HttpClients.custom().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); - final HttpGet getMethod = new HttpGet(urlOverHttps); - final HttpResponse response = httpClient.execute(getMethod); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); - } @Test - public final void givenAcceptingAllCertificatesUsing4_4_whenUsingRestTemplate_thenCorrect() throws ClientProtocolException, IOException { - final CloseableHttpClient httpClient = HttpClients.custom().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); - final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); - requestFactory.setHttpClient(httpClient); - - final ResponseEntity response = new RestTemplate(requestFactory).exchange(urlOverHttps, HttpMethod.GET, null, String.class); - assertThat(response.getStatusCode().value(), equalTo(200)); - } - - @Test(expected = SSLPeerUnverifiedException.class) - public void whenHttpsUrlIsConsumed_thenException() throws ClientProtocolException, IOException { - CloseableHttpClient httpClient = HttpClients.createDefault(); + void whenHttpsUrlIsConsumed_thenException() { String urlOverHttps = "https://localhost:8082/httpclient-simple"; HttpGet getMethod = new HttpGet(urlOverHttps); - HttpResponse response = httpClient.execute(getMethod); - assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + assertThrows(SSLPeerUnverifiedException.class, () -> { + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpResponse response = httpClient.execute(getMethod, new CustomHttpClientResponseHandler()); + assertThat(response.getCode(), equalTo(200)); + }); } } diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientHeadersLiveTest.java b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientHeadersLiveTest.java index 44262851fd..616b6470af 100644 --- a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientHeadersLiveTest.java +++ b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientHeadersLiveTest.java @@ -1,100 +1,76 @@ package com.baeldung.httpclient; import com.google.common.collect.Lists; -import org.apache.http.Header; -import org.apache.http.HttpHeaders; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpUriRequest; -import org.apache.http.client.methods.RequestBuilder; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.message.BasicHeader; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; + +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.impl.classic.BasicHttpClientResponseHandler; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpHeaders; +import org.apache.hc.core5.http.message.BasicHeader; + +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.IOException; import java.util.List; -public class HttpClientHeadersLiveTest { +class HttpClientHeadersLiveTest { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); private static final String SAMPLE_URL = "http://www.github.com"; - private CloseableHttpClient client; - - private CloseableHttpResponse response; - - @Before - public final void before() { - client = HttpClientBuilder.create().build(); - } - - @After - public final void after() throws IllegalStateException, IOException { - ResponseUtil.closeResponse(response); - } - - // tests - headers - deprecated - @Test - public final void givenNewApi_whenClientUsesCustomUserAgent_thenCorrect() throws ClientProtocolException, IOException { - client = HttpClients.custom().setUserAgent("Mozilla/5.0 Firefox/26.0").build(); - + void whenClientUsesCustomUserAgent_thenCorrect() throws IOException { final HttpGet request = new HttpGet(SAMPLE_URL); - response = client.execute(request); + + try (CloseableHttpClient client = HttpClients.custom() + .setUserAgent("Mozilla/5.0 Firefox/26.0") + .build()) { + + String response = client.execute(request, new BasicHttpClientResponseHandler()); + logger.info("Response -> {}", response); + } } - // tests - headers - user agent - @Test - public final void givenConfigOnRequest_whenRequestHasCustomUserAgent_thenCorrect() throws ClientProtocolException, IOException { - client = HttpClients.custom().build(); + void whenRequestHasCustomUserAgent_thenCorrect() throws IOException { final HttpGet request = new HttpGet(SAMPLE_URL); request.setHeader(HttpHeaders.USER_AGENT, "Mozilla/5.0 Firefox/26.0"); - response = client.execute(request); + + try (CloseableHttpClient client = HttpClients.createDefault()) { + String response = client.execute(request, new BasicHttpClientResponseHandler()); + logger.info("Response -> {}", response); + } } @Test - public final void givenConfigOnClient_whenRequestHasCustomUserAgent_thenCorrect() throws ClientProtocolException, IOException { - client = HttpClients.custom().setUserAgent("Mozilla/5.0 Firefox/26.0").build(); - response = client.execute(new HttpGet(SAMPLE_URL)); - } - - // tests - headers - content type - - @Test - public final void givenUsingNewApi_whenRequestHasCustomContentType_thenCorrect() throws ClientProtocolException, IOException { - client = HttpClients.custom().build(); + void whenRequestHasCustomContentType_thenCorrect() throws IOException { final HttpGet request = new HttpGet(SAMPLE_URL); request.setHeader(HttpHeaders.CONTENT_TYPE, "application/json"); - response = client.execute(request); + + try (CloseableHttpClient client = HttpClients.createDefault()) { + String response = client.execute(request, new BasicHttpClientResponseHandler()); + logger.debug("Response -> {}", response); + } } @Test - public final void givenRequestBuildWithBuilderWithNewApi_whenRequestHasCustomContentType_thenCorrect() throws ClientProtocolException, IOException { - final CloseableHttpClient client2 = HttpClients.custom().build(); + void givenConfigOnClient_whenRequestHasCustomContentType_thenCorrect() throws IOException { final HttpGet request = new HttpGet(SAMPLE_URL); - request.setHeader(HttpHeaders.CONTENT_TYPE, "application/json"); - response = client2.execute(request); - } - - @Test - public final void givenRequestBuildWithBuilder_whenRequestHasCustomContentType_thenCorrect() throws ClientProtocolException, IOException { - client = HttpClients.custom().build(); - final HttpUriRequest request = RequestBuilder.get().setUri(SAMPLE_URL).setHeader(HttpHeaders.CONTENT_TYPE, "application/json").build(); - response = client.execute(request); - } - - @Test - public final void givenConfigOnClient_whenRequestHasCustomContentType_thenCorrect() throws ClientProtocolException, IOException { final Header header = new BasicHeader(HttpHeaders.CONTENT_TYPE, "application/json"); final List
    headers = Lists.newArrayList(header); - client = HttpClients.custom().setDefaultHeaders(headers).build(); - final HttpUriRequest request = RequestBuilder.get().setUri(SAMPLE_URL).build(); - response = client.execute(request); - } + + try (CloseableHttpClient client = HttpClients.custom() + .setDefaultHeaders(headers) + .build()) { + + String response = client.execute(request, new BasicHttpClientResponseHandler()); + logger.debug("Response -> {}", response); + } + } } diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientParamsLiveTest.java b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientParamsLiveTest.java index f56a6863a3..ef662e1bd8 100644 --- a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientParamsLiveTest.java +++ b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientParamsLiveTest.java @@ -1,7 +1,8 @@ package com.baeldung.httpclient; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertThat; + import java.io.IOException; import java.net.URI; @@ -14,28 +15,25 @@ import org.apache.hc.client5.http.classic.methods.HttpGet; import org.apache.hc.client5.http.classic.methods.HttpPost; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; -import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; import org.apache.hc.client5.http.ClientProtocolException; import org.apache.hc.client5.http.entity.UrlEncodedFormEntity; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.http.HttpStatus; import org.apache.hc.core5.http.NameValuePair; import org.apache.hc.core5.http.message.BasicNameValuePair; import org.apache.hc.core5.net.URIBuilder; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -import org.junit.Before; -import org.junit.Test; +import com.baeldung.handler.CustomHttpClientResponseHandler; -public class HttpClientParamsLiveTest { +class HttpClientParamsLiveTest { - private CloseableHttpClient client; - - private CloseableHttpResponse response; private List nameValuePairs; - @Before + @BeforeEach public void setUp() { - client = HttpClientBuilder.create() - .build(); nameValuePairs = new ArrayList<>(); NameValuePair param1NameValuePair = new BasicNameValuePair("param1", "value1"); NameValuePair param2NameValuePair = new BasicNameValuePair("param2", "value2"); @@ -44,63 +42,83 @@ public class HttpClientParamsLiveTest { } @Test - public void givenStringNameValuePairParams_whenGetRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { + void givenStringNameValuePairParams_whenGetRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { HttpGet httpGet = new HttpGet("https://postman-echo.com/get"); URI uri = new URIBuilder(httpGet.getUri()).addParameter("param1", "value1") .addParameter("param2", "value2") .build(); httpGet.setUri(uri); - response = client.execute(httpGet); - assertThat(response.getCode(), equalTo(200)); - client.close(); + try (CloseableHttpClient client = HttpClients.createDefault(); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(httpGet, new CustomHttpClientResponseHandler())) { + + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } } @Test - public void givenStringNameValuePairParams_whenPostRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { + void givenStringNameValuePairParams_whenPostRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { HttpPost httpPost = new HttpPost("https://postman-echo.com/post"); URI uri = new URIBuilder(httpPost.getUri()).addParameter("param1", "value1") .addParameter("param2", "value2") .build(); httpPost.setUri(uri); - response = client.execute(httpPost); - assertThat(response.getCode(), equalTo(200)); - client.close(); + try (CloseableHttpClient client = HttpClients.createDefault(); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(httpPost, new CustomHttpClientResponseHandler())) { + + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } } @Test - public void givenNameValuePairParams_whenGetRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { + void givenNameValuePairParams_whenGetRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { HttpGet httpGet = new HttpGet("https://postman-echo.com/get"); URI uri = new URIBuilder(httpGet.getUri()).addParameters(nameValuePairs) .build(); httpGet.setUri(uri); - response = client.execute(httpGet); - assertThat(response.getCode(), equalTo(200)); - client.close(); + try (CloseableHttpClient client = HttpClients.createDefault(); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(httpGet, new CustomHttpClientResponseHandler())) { + + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } } @Test - public void givenNameValuePairsParams_whenPostRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { + void givenNameValuePairsParams_whenPostRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { HttpPost httpPost = new HttpPost("https://postman-echo.com/post"); URI uri = new URIBuilder(httpPost.getUri()).addParameters(nameValuePairs) .build(); httpPost.setUri(uri); - response = client.execute(httpPost); - assertThat(response.getCode(), equalTo(200)); - client.close(); + try (CloseableHttpClient client = HttpClients.createDefault(); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(httpPost, new CustomHttpClientResponseHandler())) { + + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } } @Test - public void givenUrlEncodedEntityParams_whenPostRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { + void givenUrlEncodedEntityParams_whenPostRequest_thenResponseOk() throws URISyntaxException, ClientProtocolException, IOException { HttpPost httpPost = new HttpPost("https://postman-echo.com/post"); httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, StandardCharsets.UTF_8)); - response = client.execute(httpPost); - assertThat(response.getCode(), equalTo(200)); - client.close(); + try (CloseableHttpClient client = HttpClients.createDefault(); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(httpPost, new CustomHttpClientResponseHandler())) { + + final int statusCode = response.getCode(); + assertThat(statusCode, equalTo(HttpStatus.SC_OK)); + } } } diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientTimeoutLiveTest.java b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientTimeoutLiveTest.java index ab80d5665f..f3d0a1c27f 100644 --- a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientTimeoutLiveTest.java +++ b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientTimeoutLiveTest.java @@ -3,7 +3,6 @@ package com.baeldung.httpclient; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.when; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpsClientSslLiveTest.java b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpsClientSslLiveTest.java index 24ceab0069..54633ba932 100644 --- a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpsClientSslLiveTest.java +++ b/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpsClientSslLiveTest.java @@ -1,7 +1,6 @@ package com.baeldung.httpclient; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.io.IOException; import java.security.GeneralSecurityException; @@ -9,73 +8,50 @@ import java.security.GeneralSecurityException; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLHandshakeException; -import org.apache.http.HttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.config.Registry; -import org.apache.http.config.RegistryBuilder; -import org.apache.http.conn.socket.ConnectionSocketFactory; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.conn.ssl.TrustStrategy; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.apache.http.ssl.SSLContextBuilder; -import org.apache.http.ssl.SSLContexts; -import org.junit.Test; +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; +import org.apache.hc.client5.http.io.HttpClientConnectionManager; +import org.apache.hc.client5.http.ssl.NoopHostnameVerifier; +import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; +import org.apache.hc.client5.http.ssl.TrustSelfSignedStrategy; +import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.core5.http.HttpStatus; +import org.apache.hc.core5.ssl.SSLContextBuilder; +import org.apache.hc.core5.ssl.SSLContexts; +import org.apache.hc.core5.ssl.TrustStrategy; +import org.hamcrest.MatcherAssert; +import org.hamcrest.Matchers; +import org.junit.jupiter.api.Test; + +import com.baeldung.handler.CustomHttpClientResponseHandler; /** * This test requires a localhost server over HTTPS
    * It should only be manually run, not part of the automated build * */ -public class HttpsClientSslLiveTest { +class HttpsClientSslLiveTest { // "https://localhost:8443/spring-security-rest-basic-auth/api/bars/1" // local // "https://mms.nw.ru/" // hosted private static final String HOST_WITH_SSL = "https://mms.nw.ru/"; - // tests - - @Test(expected = SSLHandshakeException.class) - public final void whenHttpsUrlIsConsumed_thenException() throws IOException { - final CloseableHttpClient httpClient = HttpClientBuilder.create() - .build(); - + @Test + void whenHttpsUrlIsConsumed_thenException() { final HttpGet getMethod = new HttpGet(HOST_WITH_SSL); - final HttpResponse response = httpClient.execute(getMethod); - assertThat(response.getStatusLine() - .getStatusCode(), equalTo(200)); + + assertThrows(SSLHandshakeException.class, () -> { + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpResponse response = httpClient.execute(getMethod, new CustomHttpClientResponseHandler()); + MatcherAssert.assertThat(response.getCode(), Matchers.equalTo(200)); + }); + } @Test - public final void givenHttpClientPre4_3_whenAcceptingAllCertificates_thenCanConsumeHttpsUriWithSelfSignedCertificate() throws IOException, GeneralSecurityException { - final TrustStrategy acceptingTrustStrategy = (certificate, authType) -> true; - - final SSLContext sslContext = SSLContexts.custom() - .loadTrustMaterial(null, acceptingTrustStrategy) - .build(); - - final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE); - Registry socketFactoryRegistry = RegistryBuilder. create().register("https", sslsf).build(); - PoolingHttpClientConnectionManager clientConnectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); - - final CloseableHttpClient httpClient = HttpClients.custom() - .setSSLSocketFactory(sslsf) - .setConnectionManager(clientConnectionManager) - .build(); - - final HttpGet getMethod = new HttpGet(HOST_WITH_SSL); - final HttpResponse response = httpClient.execute(getMethod); - assertThat(response.getStatusLine() - .getStatusCode(), equalTo(200)); - - httpClient.close(); - } - - @Test - public final void givenHttpClientAfter4_3_whenAcceptingAllCertificates_thenCanConsumeHttpsUriWithSelfSignedCertificate() throws IOException, GeneralSecurityException { + void whenAcceptingAllCertificates_thenCanConsumeHttpsUriWithSelfSignedCertificate() throws IOException, GeneralSecurityException { final TrustStrategy acceptingTrustStrategy = (certificate, authType) -> true; final SSLContext sslContext = SSLContexts.custom() .loadTrustMaterial(null, acceptingTrustStrategy) @@ -83,55 +59,45 @@ public class HttpsClientSslLiveTest { final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE); - final CloseableHttpClient httpClient = HttpClients.custom() + final HttpClientConnectionManager cm = PoolingHttpClientConnectionManagerBuilder.create() .setSSLSocketFactory(sslsf) .build(); final HttpGet getMethod = new HttpGet(HOST_WITH_SSL); - final HttpResponse response = httpClient.execute(getMethod); - assertThat(response.getStatusLine() - .getStatusCode(), equalTo(200)); + try (CloseableHttpClient client = HttpClients.custom() + .setConnectionManager(cm) + .build(); - httpClient.close(); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(getMethod, new CustomHttpClientResponseHandler())) { + + final int statusCode = response.getCode(); + MatcherAssert.assertThat(statusCode, Matchers.equalTo(HttpStatus.SC_OK)); + } } @Test - public final void givenHttpClientPost4_3_whenAcceptingAllCertificates_thenCanConsumeHttpsUriWithSelfSignedCertificate() throws IOException, GeneralSecurityException { + void usingBuilder_whenAcceptingAllCertificates_thenCanConsumeHttpsUriWithSelfSignedCertificate() throws IOException, GeneralSecurityException { final SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()) .build(); final NoopHostnameVerifier hostnameVerifier = new NoopHostnameVerifier(); final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier); - final CloseableHttpClient httpClient = HttpClients.custom() - .setSSLHostnameVerifier(hostnameVerifier) + final HttpClientConnectionManager cm = PoolingHttpClientConnectionManagerBuilder.create() .setSSLSocketFactory(sslsf) .build(); - // new - final HttpGet getMethod = new HttpGet(HOST_WITH_SSL); - final HttpResponse response = httpClient.execute(getMethod); - assertThat(response.getStatusLine() - .getStatusCode(), equalTo(200)); - httpClient.close(); - - } - - @Test - public final void givenIgnoringCertificates_whenHttpsUrlIsConsumed_thenCorrect() throws Exception { - final SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (certificate, authType) -> true) + try (CloseableHttpClient client = HttpClients.custom() + .setConnectionManager(cm) .build(); - final CloseableHttpClient client = HttpClients.custom() - .setSSLContext(sslContext) - .setSSLHostnameVerifier(new NoopHostnameVerifier()) - .build(); - final HttpGet httpGet = new HttpGet(HOST_WITH_SSL); - httpGet.setHeader("Accept", "application/xml"); + CloseableHttpResponse response = (CloseableHttpResponse) client + .execute(getMethod, new CustomHttpClientResponseHandler())) { - final HttpResponse response = client.execute(httpGet); - assertThat(response.getStatusLine() - .getStatusCode(), equalTo(200)); + final int statusCode = response.getCode(); + MatcherAssert.assertThat(statusCode, Matchers.equalTo(HttpStatus.SC_OK)); + } } } diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/base/HttpClientBasicLiveTest.java b/httpclient-simple/src/test/java/com/baeldung/httpclient/base/HttpClientBasicLiveTest.java index e05017ccdd..b850f2e8ba 100644 --- a/httpclient-simple/src/test/java/com/baeldung/httpclient/base/HttpClientBasicLiveTest.java +++ b/httpclient-simple/src/test/java/com/baeldung/httpclient/base/HttpClientBasicLiveTest.java @@ -19,12 +19,12 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.notNullValue; -public class HttpClientBasicLiveTest { +class HttpClientBasicLiveTest { private static final String SAMPLE_URL = "http://www.github.com"; @Test - public final void whenExecutingBasicGetRequest_thenNoExceptions() throws IOException { + void whenExecutingBasicGetRequest_thenNoExceptions() throws IOException { final HttpGet request = new HttpGet(SAMPLE_URL); try (CloseableHttpClient client = HttpClientBuilder.create().build(); @@ -35,7 +35,7 @@ public class HttpClientBasicLiveTest { } @Test - public final void givenGetRequestExecuted_whenAnalyzingTheResponse_thenCorrectStatusCode() throws IOException { + void givenGetRequestExecuted_whenAnalyzingTheResponse_thenCorrectStatusCode() throws IOException { final HttpGet request = new HttpGet(SAMPLE_URL); try (CloseableHttpClient client = HttpClientBuilder.create().build(); @@ -48,7 +48,7 @@ public class HttpClientBasicLiveTest { @Test - public final void givenGetRequestExecuted_whenAnalyzingTheResponse_thenCorrectMimeType() throws IOException { + void givenGetRequestExecuted_whenAnalyzingTheResponse_thenCorrectMimeType() throws IOException { final HttpGet request = new HttpGet(SAMPLE_URL); try (CloseableHttpClient client = HttpClientBuilder.create().build(); @@ -63,7 +63,7 @@ public class HttpClientBasicLiveTest { @Test - public final void givenGetRequestExecuted_whenAnalyzingTheResponse_thenCorrectBody() throws IOException, ParseException { + void givenGetRequestExecuted_whenAnalyzingTheResponse_thenCorrectBody() throws IOException, ParseException { final HttpGet request = new HttpGet(SAMPLE_URL); try (CloseableHttpClient client = HttpClientBuilder.create().build(); diff --git a/httpclient-simple/src/test/java/com/baeldung/test/LiveTestSuite.java b/httpclient-simple/src/test/java/com/baeldung/test/LiveTestSuite.java deleted file mode 100644 index c864349e02..0000000000 --- a/httpclient-simple/src/test/java/com/baeldung/test/LiveTestSuite.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.test; - -import com.baeldung.client.ClientLiveTest; -import com.baeldung.client.RestClientLiveManualTest; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -@RunWith(Suite.class) -@Suite.SuiteClasses({ -// @formatter:off - RestClientLiveManualTest.class - ,ClientLiveTest.class -}) // -public class LiveTestSuite { - -} diff --git a/httpclient4/.gitignore b/httpclient4/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/httpclient4/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/httpclient4/README.md b/httpclient4/README.md new file mode 100644 index 0000000000..08e04c511d --- /dev/null +++ b/httpclient4/README.md @@ -0,0 +1,13 @@ +## Apache HttpClient + +This module contains articles about Apache HttpClient 4.5 + +### Relevant Articles + +- [Apache HttpClient with SSL](https://www.baeldung.com/httpclient-ssl) +- [Apache HttpClient Timeout](https://www.baeldung.com/httpclient-timeout) + +### Running the Tests +To run the live tests, use the command: mvn clean install -Plive +This will start an embedded Jetty server on port 8082 using the Cargo plugin configured in the pom.xml file, +for the live Maven profile \ No newline at end of file diff --git a/httpclient4/pom.xml b/httpclient4/pom.xml new file mode 100644 index 0000000000..8f896283b3 --- /dev/null +++ b/httpclient4/pom.xml @@ -0,0 +1,291 @@ + + + 4.0.0 + httpclient4 + 0.1-SNAPSHOT + httpclient4 + war + + + com.baeldung + parent-spring-5 + 0.0.1-SNAPSHOT + ../parent-spring-5 + + + + + + org.springframework.security + spring-security-web + ${spring-security.version} + + + org.springframework.security + spring-security-config + ${spring-security.version} + + + + org.springframework + spring-core + ${spring.version} + + + commons-logging + commons-logging + + + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-aop + ${spring.version} + + + org.springframework + spring-tx + ${spring.version} + + + org.springframework + spring-expression + ${spring.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + org.springframework + spring-oxm + ${spring.version} + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + org.apache.httpcomponents + httpcore + ${httpcore.version} + + + commons-logging + commons-logging + + + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + commons-logging + commons-logging + + + + + org.apache.httpcomponents + fluent-hc + ${httpclient.version} + + + commons-logging + commons-logging + + + + + org.apache.httpcomponents + httpmime + ${httpclient.version} + + + commons-codec + commons-codec + ${commons-codec.version} + + + org.apache.httpcomponents + httpasyncclient + ${httpasyncclient.version} + + + commons-logging + commons-logging + + + + + com.github.tomakehurst + wiremock + ${wiremock.version} + test + + + + javax.servlet + javax.servlet-api + ${javax.servlet-api.version} + provided + + + javax.servlet + jstl + ${jstl.version} + runtime + + + + com.google.guava + guava + ${guava.version} + + + + org.springframework + spring-test + ${spring.version} + test + + + + + httpclient-simple + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + true + + jetty8x + embedded + + + + + + + 8082 + + + + + + + + + + live + + + + org.codehaus.cargo + cargo-maven2-plugin + + + start-server + pre-integration-test + + start + + + + stop-server + post-integration-test + + stop + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + none + + + **/*LiveTest.java + + + cargo + + + + + + + + + + + + + 1.10 + 4.1.5 + + 2.5.1 + 4.4.16 + 4.5.14 + + 1.6.1 + + + \ No newline at end of file diff --git a/httpclient4/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java b/httpclient4/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java new file mode 100644 index 0000000000..cafd8cfb7b --- /dev/null +++ b/httpclient4/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java @@ -0,0 +1,30 @@ +package com.baeldung.basic; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint; +import org.springframework.stereotype.Component; + +@Component +public class MyBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint { + + @Override + public void commence(final HttpServletRequest request, final HttpServletResponse response, final AuthenticationException authException) throws IOException { + response.addHeader("WWW-Authenticate", "Basic realm=\"" + getRealmName() + "\""); + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + final PrintWriter writer = response.getWriter(); + writer.println("HTTP Status " + HttpServletResponse.SC_UNAUTHORIZED + " - " + authException.getMessage()); + } + + @Override + public void afterPropertiesSet() { + setRealmName("Baeldung"); + super.afterPropertiesSet(); + } + +} diff --git a/httpclient4/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java b/httpclient4/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java new file mode 100644 index 0000000000..81f82a2c1c --- /dev/null +++ b/httpclient4/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java @@ -0,0 +1,39 @@ +package com.baeldung.client; + +import java.net.URI; + +import org.apache.http.HttpHost; +import org.apache.http.client.AuthCache; +import org.apache.http.client.protocol.HttpClientContext; +import org.apache.http.impl.auth.BasicScheme; +import org.apache.http.impl.client.BasicAuthCache; +import org.apache.http.protocol.BasicHttpContext; +import org.apache.http.protocol.HttpContext; +import org.springframework.http.HttpMethod; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; + +public class HttpComponentsClientHttpRequestFactoryBasicAuth extends HttpComponentsClientHttpRequestFactory { + + HttpHost host; + + public HttpComponentsClientHttpRequestFactoryBasicAuth(HttpHost host) { + super(); + this.host = host; + } + + protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { + return createHttpContext(); + } + + private HttpContext createHttpContext() { + + AuthCache authCache = new BasicAuthCache(); + + BasicScheme basicAuth = new BasicScheme(); + authCache.put(host, basicAuth); + + BasicHttpContext localcontext = new BasicHttpContext(); + localcontext.setAttribute(HttpClientContext.AUTH_CACHE, authCache); + return localcontext; + } +} \ No newline at end of file diff --git a/httpclient4/src/main/java/com/baeldung/client/RestTemplateFactory.java b/httpclient4/src/main/java/com/baeldung/client/RestTemplateFactory.java new file mode 100644 index 0000000000..aac4f8cebd --- /dev/null +++ b/httpclient4/src/main/java/com/baeldung/client/RestTemplateFactory.java @@ -0,0 +1,44 @@ +package com.baeldung.client; + +import org.apache.http.HttpHost; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.support.BasicAuthenticationInterceptor; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +@Component +public class RestTemplateFactory implements FactoryBean, InitializingBean { + private RestTemplate restTemplate; + + public RestTemplateFactory() { + super(); + } + + // API + + @Override + public RestTemplate getObject() { + return restTemplate; + } + + @Override + public Class getObjectType() { + return RestTemplate.class; + } + + @Override + public boolean isSingleton() { + return true; + } + + @Override + public void afterPropertiesSet() { + HttpHost host = new HttpHost("localhost", 8082, "http"); + final ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactoryBasicAuth(host); + restTemplate = new RestTemplate(requestFactory); + restTemplate.getInterceptors().add(new BasicAuthenticationInterceptor("user1", "user1Pass")); + } + +} \ No newline at end of file diff --git a/httpclient4/src/main/java/com/baeldung/client/spring/ClientConfig.java b/httpclient4/src/main/java/com/baeldung/client/spring/ClientConfig.java new file mode 100644 index 0000000000..03994b55a5 --- /dev/null +++ b/httpclient4/src/main/java/com/baeldung/client/spring/ClientConfig.java @@ -0,0 +1,16 @@ +package com.baeldung.client.spring; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan("com.baeldung.client") +public class ClientConfig { + + public ClientConfig() { + super(); + } + + // beans + +} \ No newline at end of file diff --git a/httpclient4/src/main/java/com/baeldung/filter/CustomFilter.java b/httpclient4/src/main/java/com/baeldung/filter/CustomFilter.java new file mode 100644 index 0000000000..6bb12610fa --- /dev/null +++ b/httpclient4/src/main/java/com/baeldung/filter/CustomFilter.java @@ -0,0 +1,18 @@ +package com.baeldung.filter; + +import org.springframework.web.filter.GenericFilterBean; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.io.IOException; + +public class CustomFilter extends GenericFilterBean { + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + chain.doFilter(request, response); + } + +} diff --git a/httpclient4/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java b/httpclient4/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java new file mode 100644 index 0000000000..fb597e46c8 --- /dev/null +++ b/httpclient4/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java @@ -0,0 +1,49 @@ +package com.baeldung.filter; + +import com.baeldung.security.RestAuthenticationEntryPoint; +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.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.authentication.www.BasicAuthenticationFilter; + +@Configuration +@EnableWebSecurity +public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { + + @Autowired private RestAuthenticationEntryPoint authenticationEntryPoint; + + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + auth + .inMemoryAuthentication() + .withUser("user1") + .password(passwordEncoder().encode("user1Pass")) + .authorities("ROLE_USER"); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeRequests() + .antMatchers("/securityNone") + .permitAll() + .anyRequest() + .authenticated() + .and() + .httpBasic() + .authenticationEntryPoint(authenticationEntryPoint); + + http.addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/httpclient4/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java b/httpclient4/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java new file mode 100644 index 0000000000..7dc53e3e1e --- /dev/null +++ b/httpclient4/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java @@ -0,0 +1,48 @@ +package com.baeldung.security; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; +import org.springframework.security.web.savedrequest.HttpSessionRequestCache; +import org.springframework.security.web.savedrequest.RequestCache; +import org.springframework.security.web.savedrequest.SavedRequest; +import org.springframework.util.StringUtils; + +public class MySavedRequestAwareAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { + + private RequestCache requestCache = new HttpSessionRequestCache(); + + @Override + public void onAuthenticationSuccess(final HttpServletRequest request, final HttpServletResponse response, final Authentication authentication) throws ServletException, IOException { + final SavedRequest savedRequest = requestCache.getRequest(request, response); + + if (savedRequest == null) { + super.onAuthenticationSuccess(request, response, authentication); + + return; + } + final String targetUrlParameter = getTargetUrlParameter(); + if (isAlwaysUseDefaultTargetUrl() || (targetUrlParameter != null && StringUtils.hasText(request.getParameter(targetUrlParameter)))) { + requestCache.removeRequest(request, response); + super.onAuthenticationSuccess(request, response, authentication); + + return; + } + + clearAuthenticationAttributes(request); + + // Use the DefaultSavedRequest URL + // final String targetUrl = savedRequest.getRedirectUrl(); + // logger.debug("Redirecting to DefaultSavedRequest Url: " + targetUrl); + // getRedirectStrategy().sendRedirect(request, response, targetUrl); + } + + public void setRequestCache(final RequestCache requestCache) { + this.requestCache = requestCache; + } +} diff --git a/httpclient4/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java b/httpclient4/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java new file mode 100644 index 0000000000..1ae89adb89 --- /dev/null +++ b/httpclient4/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java @@ -0,0 +1,23 @@ +package com.baeldung.security; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; + +/** + * The Entry Point will not redirect to any sort of Login - it will return the 401 + */ +@Component +public final class RestAuthenticationEntryPoint implements AuthenticationEntryPoint { + + @Override + public void commence(final HttpServletRequest request, final HttpServletResponse response, final AuthenticationException authException) throws IOException { + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); + } + +} \ No newline at end of file diff --git a/httpclient4/src/main/java/com/baeldung/spring/SecSecurityConfig.java b/httpclient4/src/main/java/com/baeldung/spring/SecSecurityConfig.java new file mode 100644 index 0000000000..4ba9d47f8d --- /dev/null +++ b/httpclient4/src/main/java/com/baeldung/spring/SecSecurityConfig.java @@ -0,0 +1,16 @@ +package com.baeldung.spring; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.ImportResource; + +@Configuration +@ImportResource({ "classpath:webSecurityConfig.xml" }) +@ComponentScan("com.baeldung.security") +public class SecSecurityConfig { + + public SecSecurityConfig() { + super(); + } + +} diff --git a/httpclient4/src/main/java/com/baeldung/spring/WebConfig.java b/httpclient4/src/main/java/com/baeldung/spring/WebConfig.java new file mode 100644 index 0000000000..8d5c1dc7f1 --- /dev/null +++ b/httpclient4/src/main/java/com/baeldung/spring/WebConfig.java @@ -0,0 +1,30 @@ +package com.baeldung.spring; + +import java.util.List; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@EnableWebMvc +@ComponentScan("com.baeldung.web") +public class WebConfig implements WebMvcConfigurer { + + public WebConfig() { + super(); + } + + // beans + + @Override + public void configureMessageConverters(final List> converters) { + converters.add(new MappingJackson2HttpMessageConverter()); + } + + // + +} \ No newline at end of file diff --git a/httpclient4/src/main/java/com/baeldung/web/controller/BarController.java b/httpclient4/src/main/java/com/baeldung/web/controller/BarController.java new file mode 100644 index 0000000000..02e6af03af --- /dev/null +++ b/httpclient4/src/main/java/com/baeldung/web/controller/BarController.java @@ -0,0 +1,31 @@ +package com.baeldung.web.controller; + +import com.baeldung.web.dto.Bar; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +@RequestMapping(value = "/bars") +public class BarController { + + @Autowired + private ApplicationEventPublisher eventPublisher; + + public BarController() { + super(); + } + + // API + + @RequestMapping(value = "/{id}", method = RequestMethod.GET) + @ResponseBody + public Bar findOne(@PathVariable("id") final Long id) { + return new Bar(); + } + +} diff --git a/httpclient4/src/main/java/com/baeldung/web/controller/FooController.java b/httpclient4/src/main/java/com/baeldung/web/controller/FooController.java new file mode 100644 index 0000000000..461a5e351a --- /dev/null +++ b/httpclient4/src/main/java/com/baeldung/web/controller/FooController.java @@ -0,0 +1,33 @@ +package com.baeldung.web.controller; + +import com.baeldung.web.dto.Foo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +@RequestMapping(value = "/foos") +public class FooController { + + @Autowired + private ApplicationEventPublisher eventPublisher; + + public FooController() { + super(); + } + + // API + + @RequestMapping(value = "/{id}", method = RequestMethod.GET) + @ResponseBody + @PreAuthorize("hasRole('ROLE_USER')") + public Foo findOne(@PathVariable("id") final Long id) { + return new Foo(); + } + +} diff --git a/httpclient4/src/main/java/com/baeldung/web/dto/Bar.java b/httpclient4/src/main/java/com/baeldung/web/dto/Bar.java new file mode 100644 index 0000000000..eb139b0ec1 --- /dev/null +++ b/httpclient4/src/main/java/com/baeldung/web/dto/Bar.java @@ -0,0 +1,14 @@ +package com.baeldung.web.dto; + +import java.io.Serializable; + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +public class Bar implements Serializable { + + public Bar() { + super(); + } + +} diff --git a/httpclient4/src/main/java/com/baeldung/web/dto/Foo.java b/httpclient4/src/main/java/com/baeldung/web/dto/Foo.java new file mode 100644 index 0000000000..23cfab132d --- /dev/null +++ b/httpclient4/src/main/java/com/baeldung/web/dto/Foo.java @@ -0,0 +1,14 @@ +package com.baeldung.web.dto; + +import java.io.Serializable; + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +public class Foo implements Serializable { + + public Foo() { + super(); + } + +} diff --git a/httpclient4/src/main/resources/logback.xml b/httpclient4/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/httpclient4/src/main/resources/logback.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/httpclient4/src/main/resources/webSecurityConfig.xml b/httpclient4/src/main/resources/webSecurityConfig.xml new file mode 100644 index 0000000000..2ff9a1de15 --- /dev/null +++ b/httpclient4/src/main/resources/webSecurityConfig.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/httpclient4/src/main/webapp/WEB-INF/api-servlet.xml b/httpclient4/src/main/webapp/WEB-INF/api-servlet.xml new file mode 100644 index 0000000000..1dbff70b83 --- /dev/null +++ b/httpclient4/src/main/webapp/WEB-INF/api-servlet.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/httpclient4/src/main/webapp/WEB-INF/web.xml b/httpclient4/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..4b2dd54266 --- /dev/null +++ b/httpclient4/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,43 @@ + + + + Spring Security Custom Application + + + + contextClass + org.springframework.web.context.support.AnnotationConfigWebApplicationContext + + + contextConfigLocation + com.baeldung.spring + + + + org.springframework.web.context.ContextLoaderListener + + + + + api + org.springframework.web.servlet.DispatcherServlet + 1 + + + api + /api/* + + + + + springSecurityFilterChain + org.springframework.web.filter.DelegatingFilterProxy + + + springSecurityFilterChain + /* + + + \ No newline at end of file diff --git a/httpclient4/src/test/java/com/baeldung/client/ClientLiveTest.java b/httpclient4/src/test/java/com/baeldung/client/ClientLiveTest.java new file mode 100644 index 0000000000..2785bc5d08 --- /dev/null +++ b/httpclient4/src/test/java/com/baeldung/client/ClientLiveTest.java @@ -0,0 +1,99 @@ +package com.baeldung.client; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLPeerUnverifiedException; + +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.config.Registry; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.conn.ssl.TrustStrategy; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.BasicHttpClientConnectionManager; +import org.apache.http.ssl.SSLContexts; + +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + + +class ClientLiveTest { + + final String urlOverHttps = "http://localhost:8082/httpclient-simple/api/bars/1"; + + @Test + void givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenOk_2() throws GeneralSecurityException { + + final TrustStrategy acceptingTrustStrategy = (cert, authType) -> true; + final SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build(); + final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE); + final Registry socketFactoryRegistry = RegistryBuilder. create() + .register("https", sslsf) + .register("http", new PlainConnectionSocketFactory()) + .build(); + + final BasicHttpClientConnectionManager connectionManager = new BasicHttpClientConnectionManager(socketFactoryRegistry); + final CloseableHttpClient httpClient = HttpClients.custom() + .setSSLSocketFactory(sslsf) + .setConnectionManager(connectionManager) + .build(); + + final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + final ResponseEntity response = new RestTemplate(requestFactory).exchange(urlOverHttps, HttpMethod.GET, null, String.class); + assertThat(response.getStatusCode().value(), equalTo(200)); + } + + @Test + void givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenCorrect() throws IOException { + final HttpGet getMethod = new HttpGet(urlOverHttps); + + try (final CloseableHttpClient httpClient = HttpClients.custom() + .setSSLHostnameVerifier(new NoopHostnameVerifier()) + .build()) { + + final HttpResponse response = httpClient.execute(getMethod); + assertThat(response.getStatusLine() + .getStatusCode(), equalTo(200)); + } + } + + @Test + void givenAcceptingAllCertificates_whenUsingRestTemplate_thenCorrect() { + final CloseableHttpClient httpClient = HttpClients.custom() + .setSSLHostnameVerifier(new NoopHostnameVerifier()) + .build(); + final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); + requestFactory.setHttpClient(httpClient); + + final ResponseEntity response = new RestTemplate(requestFactory).exchange(urlOverHttps, HttpMethod.GET, null, String.class); + assertThat(response.getStatusCode().value(), equalTo(200)); + } + + @Test + void whenHttpsUrlIsConsumed_thenException() { + String urlOverHttps = "https://localhost:8082/httpclient-simple"; + HttpGet getMethod = new HttpGet(urlOverHttps); + + assertThrows(SSLPeerUnverifiedException.class, () -> { + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpResponse response = httpClient.execute(getMethod); + assertThat(response.getStatusLine() + .getStatusCode(), equalTo(200)); + }); + } +} \ No newline at end of file diff --git a/httpclient4/src/test/java/com/baeldung/client/RestClientV4LiveManualTest.java b/httpclient4/src/test/java/com/baeldung/client/RestClientV4LiveManualTest.java new file mode 100644 index 0000000000..c336e6a068 --- /dev/null +++ b/httpclient4/src/test/java/com/baeldung/client/RestClientV4LiveManualTest.java @@ -0,0 +1,92 @@ +package com.baeldung.client; + +import static org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import javax.net.ssl.SSLContext; + + +import org.apache.http.HttpResponse; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.config.Registry; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; + +import org.apache.http.conn.ssl.TrustStrategy; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.BasicHttpClientConnectionManager; +import org.apache.http.ssl.SSLContexts; + +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +/** + * This test requires a localhost server over HTTPS
    + * It should only be manually run, not part of the automated build + * */ +public class RestClientV4LiveManualTest { + + final String urlOverHttps = "http://localhost:8082/httpclient-simple/api/bars/1"; + + @Test + void givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenOk_2() throws GeneralSecurityException { + + final TrustStrategy acceptingTrustStrategy = (cert, authType) -> true; + final SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build(); + final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE); + final Registry socketFactoryRegistry = RegistryBuilder. create() + .register("https", sslsf) + .register("http", new PlainConnectionSocketFactory()) + .build(); + + final BasicHttpClientConnectionManager connectionManager = new BasicHttpClientConnectionManager(socketFactoryRegistry); + final CloseableHttpClient httpClient = HttpClients.custom() + .setSSLSocketFactory(sslsf) + .setConnectionManager(connectionManager) + .build(); + + final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + final ResponseEntity response = new RestTemplate(requestFactory).exchange(urlOverHttps, HttpMethod.GET, null, String.class); + assertThat(response.getStatusCode().value(), equalTo(200)); + } + + @Test + void givenAcceptingAllCertificatesUsing4_4_whenHttpsUrlIsConsumed_thenCorrect() throws IOException { + final CloseableHttpClient httpClient = HttpClients.custom().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); + + final HttpGet getMethod = new HttpGet(urlOverHttps); + final HttpResponse response = httpClient.execute(getMethod); + assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + } + + @Test + void givenAcceptingAllCertificatesUsing4_4_whenUsingRestTemplate_thenCorrect(){ + final CloseableHttpClient httpClient = HttpClients.custom().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); + final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); + requestFactory.setHttpClient(httpClient); + + final ResponseEntity response = new RestTemplate(requestFactory).exchange(urlOverHttps, HttpMethod.GET, null, String.class); + assertThat(response.getStatusCode().value(), equalTo(200)); + } + + @Test + public void whenHttpsUrlIsConsumed_thenException() throws ClientProtocolException, IOException { + CloseableHttpClient httpClient = HttpClients.createDefault(); + String urlOverHttps = "https://localhost:8082/httpclient-simple"; + HttpGet getMethod = new HttpGet(urlOverHttps); + HttpResponse response = httpClient.execute(getMethod); + assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); + } +} diff --git a/httpclient4/src/test/java/com/baeldung/httpclient/HttpClientHeaderV4LiveTest.java b/httpclient4/src/test/java/com/baeldung/httpclient/HttpClientHeaderV4LiveTest.java new file mode 100644 index 0000000000..eef813b3ff --- /dev/null +++ b/httpclient4/src/test/java/com/baeldung/httpclient/HttpClientHeaderV4LiveTest.java @@ -0,0 +1,24 @@ +package com.baeldung.httpclient; + +import java.io.IOException; +import org.apache.http.HttpHeaders; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.client.methods.RequestBuilder; +import org.apache.http.impl.client.HttpClients; +import org.junit.jupiter.api.Test; + +class HttpClientHeaderV4LiveTest { + + private static final String SAMPLE_URL = "http://www.github.com"; + + @Test + void givenRequestBuildWithBuilder_whenRequestHasCustomContentType_thenCorrect() throws IOException { + HttpClient client = HttpClients.custom().build(); + HttpUriRequest request = RequestBuilder.get() + .setUri(SAMPLE_URL) + .setHeader(HttpHeaders.CONTENT_TYPE, "application/json") + .build(); + client.execute(request); + } +} \ No newline at end of file diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java b/httpclient4/src/test/java/com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java similarity index 97% rename from httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java rename to httpclient4/src/test/java/com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java index 9bf523590e..4d4dd7be15 100644 --- a/httpclient-simple/src/test/java/com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java +++ b/httpclient4/src/test/java/com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java @@ -76,7 +76,7 @@ class HttpClientTimeoutV4LiveTest { */ @Test @Disabled - public final void givenTimeoutIsConfigured_whenTimingOut_thenTimeoutException() throws IOException { + void givenTimeoutIsConfigured_whenTimingOut_thenTimeoutException() throws IOException { final int timeout = 3; final RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000).setSocketTimeout(timeout * 1000).build(); diff --git a/httpclient4/src/test/java/com/baeldung/httpclient/HttpsClientV4SslLiveTest.java b/httpclient4/src/test/java/com/baeldung/httpclient/HttpsClientV4SslLiveTest.java new file mode 100644 index 0000000000..6c7bcf9b08 --- /dev/null +++ b/httpclient4/src/test/java/com/baeldung/httpclient/HttpsClientV4SslLiveTest.java @@ -0,0 +1,111 @@ +package com.baeldung.httpclient; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLHandshakeException; + +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +import org.apache.http.conn.ssl.TrustStrategy; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.HttpClients; + +import org.apache.http.ssl.SSLContextBuilder; +import org.apache.http.ssl.SSLContexts; +import org.junit.jupiter.api.Test; + +class HttpsClientV4SslLiveTest { + + + // "https://localhost:8443/spring-security-rest-basic-auth/api/bars/1" // local + // "https://mms.nw.ru/" // hosted + private static final String HOST_WITH_SSL = "https://mms.nw.ru/"; + + // tests + + @Test + void whenHttpsUrlIsConsumed_thenException() { + final HttpGet getMethod = new HttpGet(HOST_WITH_SSL); + + assertThrows(SSLHandshakeException.class, () -> { + final CloseableHttpClient httpClient = HttpClientBuilder + .create() + .build(); + final HttpResponse response = httpClient.execute(getMethod); + assertThat(response.getStatusLine() + .getStatusCode(), equalTo(200)); + }); + } + + + @Test + void whenAcceptingAllCertificates_thenCanConsumeHttpsUriWithSelfSignedCertificate() throws IOException, GeneralSecurityException { + final TrustStrategy acceptingTrustStrategy = (certificate, authType) -> true; + final SSLContext sslContext = SSLContexts.custom() + .loadTrustMaterial(null, acceptingTrustStrategy) + .build(); + + final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE); + + final CloseableHttpClient httpClient = HttpClients.custom() + .setSSLSocketFactory(sslsf) + .build(); + + final HttpGet getMethod = new HttpGet(HOST_WITH_SSL); + final HttpResponse response = httpClient.execute(getMethod); + assertThat(response.getStatusLine() + .getStatusCode(), equalTo(200)); + + httpClient.close(); + } + + @Test + void using_builder_whenAcceptingAllCertificates_thenCanConsumeHttpsUriWithSelfSignedCertificate() throws IOException, GeneralSecurityException { + final SSLContext sslContext = new SSLContextBuilder() + .loadTrustMaterial(null, new TrustSelfSignedStrategy()) + .build(); + final NoopHostnameVerifier hostnameVerifier = new NoopHostnameVerifier(); + + final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier); + final CloseableHttpClient httpClient = HttpClients.custom() + .setSSLHostnameVerifier(hostnameVerifier) + .setSSLSocketFactory(sslsf) + .build(); + + final HttpGet getMethod = new HttpGet(HOST_WITH_SSL); + final HttpResponse response = httpClient.execute(getMethod); + assertThat(response.getStatusLine() + .getStatusCode(), equalTo(200)); + httpClient.close(); + + } + + @Test + void givenIgnoringCertificates_whenHttpsUrlIsConsumed_thenCorrect() throws Exception { + final SSLContext sslContext = new SSLContextBuilder() + .loadTrustMaterial(null, (certificate, authType) -> true) + .build(); + + final CloseableHttpClient client = HttpClients.custom() + .setSSLContext(sslContext) + .setSSLHostnameVerifier(new NoopHostnameVerifier()) + .build(); + final HttpGet httpGet = new HttpGet(HOST_WITH_SSL); + httpGet.setHeader("Accept", "application/xml"); + + final HttpResponse response = client.execute(httpGet); + assertThat(response.getStatusLine() + .getStatusCode(), equalTo(200)); + } + +} \ No newline at end of file diff --git a/httpclient-simple/src/test/java/com/baeldung/httpclient/ResponseUtil.java b/httpclient4/src/test/java/com/baeldung/httpclient/ResponseUtil.java similarity index 100% rename from httpclient-simple/src/test/java/com/baeldung/httpclient/ResponseUtil.java rename to httpclient4/src/test/java/com/baeldung/httpclient/ResponseUtil.java diff --git a/httpclient4/src/test/resources/.gitignore b/httpclient4/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/httpclient4/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/httpclient4/src/test/resources/test.in b/httpclient4/src/test/resources/test.in new file mode 100644 index 0000000000..95d09f2b10 --- /dev/null +++ b/httpclient4/src/test/resources/test.in @@ -0,0 +1 @@ +hello world \ No newline at end of file diff --git a/pom.xml b/pom.xml index 05f8326e4c..4016d669a4 100644 --- a/pom.xml +++ b/pom.xml @@ -365,7 +365,7 @@ apache-httpclient - httpclient-simple + httpclient4 jackson-modules @@ -648,7 +648,7 @@ apache-httpclient - httpclient-simple + httpclient4 jackson-modules @@ -976,6 +976,7 @@ akka-modules annotations apache-httpclient + httpclient-simple antlr apache-kafka apache-kafka-2 @@ -1201,6 +1202,7 @@ graphql-modules grpc hazelcast + httpclient-simple hystrix jackson-simple java-blockchain From ac4255ef72675d692c2421a7c21438f83ba8118b Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 7 Feb 2023 15:51:29 +0000 Subject: [PATCH 416/592] [JAVA-12714] Removed compiler plugin (#13420) Co-authored-by: panagiotiskakos --- java-websocket/pom.xml | 9 --------- libraries-server-2/pom.xml | 4 ---- spring-di/pom.xml | 4 ---- spring-exceptions/pom.xml | 4 ---- spring-katharsis/pom.xml | 4 ---- spring-mobile/pom.xml | 9 --------- vaadin/pom.xml | 4 ---- 7 files changed, 38 deletions(-) diff --git a/java-websocket/pom.xml b/java-websocket/pom.xml index 7c3f32b092..ffc2b0631e 100644 --- a/java-websocket/pom.xml +++ b/java-websocket/pom.xml @@ -28,15 +28,6 @@ - - - - org.apache.maven.plugins - maven-compiler-plugin - - - - 1.1 2.8.0 diff --git a/libraries-server-2/pom.xml b/libraries-server-2/pom.xml index 359954a6d2..7377fa3fa9 100644 --- a/libraries-server-2/pom.xml +++ b/libraries-server-2/pom.xml @@ -34,10 +34,6 @@ - - org.apache.maven.plugins - maven-compiler-plugin - org.eclipse.jetty jetty-maven-plugin diff --git a/spring-di/pom.xml b/spring-di/pom.xml index 9d2a260a06..af0601deb6 100644 --- a/spring-di/pom.xml +++ b/spring-di/pom.xml @@ -111,10 +111,6 @@ - - org.apache.maven.plugins - maven-compiler-plugin - org.apache.maven.plugins maven-war-plugin diff --git a/spring-exceptions/pom.xml b/spring-exceptions/pom.xml index 6d573b6813..0621009bdd 100644 --- a/spring-exceptions/pom.xml +++ b/spring-exceptions/pom.xml @@ -144,10 +144,6 @@ - - org.apache.maven.plugins - maven-compiler-plugin - org.apache.maven.plugins maven-war-plugin diff --git a/spring-katharsis/pom.xml b/spring-katharsis/pom.xml index 2fcc87e2dd..b836a42bca 100644 --- a/spring-katharsis/pom.xml +++ b/spring-katharsis/pom.xml @@ -55,10 +55,6 @@ - - org.apache.maven.plugins - maven-compiler-plugin - org.codehaus.cargo cargo-maven2-plugin diff --git a/spring-mobile/pom.xml b/spring-mobile/pom.xml index bac1d2cdc9..7f715c8735 100644 --- a/spring-mobile/pom.xml +++ b/spring-mobile/pom.xml @@ -32,15 +32,6 @@ - - - - org.apache.maven.plugins - maven-compiler-plugin - - - - 1.1.5.RELEASE diff --git a/vaadin/pom.xml b/vaadin/pom.xml index 82963f9e7f..aa37a2392a 100644 --- a/vaadin/pom.xml +++ b/vaadin/pom.xml @@ -76,10 +76,6 @@ - - org.apache.maven.plugins - maven-compiler-plugin - org.apache.maven.plugins maven-war-plugin From 3f661205032d32a66d21b50d7371d2ccc2d9b8ac Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 7 Feb 2023 23:21:05 +0530 Subject: [PATCH 417/592] Update README.md (#13444) --- httpclient4/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/httpclient4/README.md b/httpclient4/README.md index 08e04c511d..445db1108b 100644 --- a/httpclient4/README.md +++ b/httpclient4/README.md @@ -6,8 +6,9 @@ This module contains articles about Apache HttpClient 4.5 - [Apache HttpClient with SSL](https://www.baeldung.com/httpclient-ssl) - [Apache HttpClient Timeout](https://www.baeldung.com/httpclient-timeout) +- [Custom HTTP Header with the Apache HttpClient](https://www.baeldung.com/httpclient-custom-http-header) ### Running the Tests To run the live tests, use the command: mvn clean install -Plive This will start an embedded Jetty server on port 8082 using the Cargo plugin configured in the pom.xml file, -for the live Maven profile \ No newline at end of file +for the live Maven profile From 0adee1c8d75f338b12af5b757a904f30c3730f08 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Wed, 8 Feb 2023 01:49:49 +0100 Subject: [PATCH 418/592] =?UTF-8?q?[streamOf-vs-intStreamRange]=20Understa?= =?UTF-8?q?nding=20the=20Difference=20Between=20Str=E2=80=A6=20(#13429)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [streamOf-vs-intStreamRange] Understanding the Difference Between Stream.of and IntStream.range * [streamOf-vs-intStreamRange] fix indent --- ...weenStreamOfAndIntStreamRangeUnitTest.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/streamofvsintstream/DiffBetweenStreamOfAndIntStreamRangeUnitTest.java diff --git a/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/streamofvsintstream/DiffBetweenStreamOfAndIntStreamRangeUnitTest.java b/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/streamofvsintstream/DiffBetweenStreamOfAndIntStreamRangeUnitTest.java new file mode 100644 index 0000000000..23957fe2c6 --- /dev/null +++ b/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/streamofvsintstream/DiffBetweenStreamOfAndIntStreamRangeUnitTest.java @@ -0,0 +1,66 @@ +package com.baeldung.streams.streamofvsintstream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.TreeSet; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import org.junit.jupiter.api.Test; + +public class DiffBetweenStreamOfAndIntStreamRangeUnitTest { + @Test + void givenStreamOfAndIntStreamRange_whenPeekSortAndFirst_shouldResultDifferent() { + Stream normalStream = Stream.of(1, 2, 3, 4, 5); + IntStream intStreamByRange = IntStream.range(1, 6); + List normalStreamPeekResult = new ArrayList<>(); + List intStreamPeekResult = new ArrayList<>(); + + // First, the regular Stream + normalStream.peek(normalStreamPeekResult::add) + .sorted() + .findFirst(); + assertEquals(Arrays.asList(1, 2, 3, 4, 5), normalStreamPeekResult); + + // Then, the IntStream + intStreamByRange.peek(intStreamPeekResult::add) + .sorted() + .findFirst(); + assertEquals(Arrays.asList(1), intStreamPeekResult); + } + + @Test + void givenStream_whenPeekAndFirst_shouldHaveOnlyFirstElement() { + Stream normalStream = Stream.of(1, 2, 3, 4, 5); + IntStream intStreamByRange = IntStream.range(1, 6); + List normalStreamPeekResult = new ArrayList<>(); + List intStreamPeekResult = new ArrayList<>(); + + // First, the regular Stream + normalStream.peek(normalStreamPeekResult::add) + .findFirst(); + assertEquals(Arrays.asList(1), normalStreamPeekResult); + + // Then, the IntStream + intStreamByRange.peek(intStreamPeekResult::add) + .findFirst(); + assertEquals(Arrays.asList(1), intStreamPeekResult); + } + + @Test + void givenSortedStream_whenPeekSortAndFirst_shouldOnlyHaveOneElement() { + List peekResult = new ArrayList<>(); + + TreeSet treeSet = new TreeSet<>(Arrays.asList("CCC", "BBB", "AAA", "DDD", "KKK")); + + treeSet.stream() + .peek(peekResult::add) + .sorted() + .findFirst(); + + assertEquals(Arrays.asList("AAA"), peekResult); + } +} \ No newline at end of file From ed738777df2cdb8c2f01bbd629cb7e3c6bbce2ea Mon Sep 17 00:00:00 2001 From: exaucae Date: Wed, 8 Feb 2023 01:19:46 +0000 Subject: [PATCH 419/592] feat: add jextract & FFM API examples --- .../{HelloWorld.java => core/Greetings.java} | 12 +- .../java/panama/core/MemoryAllocation.java | 26 + .../java/panama/core/MemoryLayout.java | 56 + .../java/panama/jextract/Greetings.java | 17 + .../main/java/foreign/c/Constants$root.java | 23 + java-panama/src/main/java/foreign/c/FILE.java | 14 + .../main/java/foreign/c/RuntimeHelper.java | 233 ++ .../src/main/java/foreign/c/_iobuf.java | 162 ++ .../src/main/java/foreign/c/constants$0.java | 52 + .../src/main/java/foreign/c/constants$1.java | 54 + .../src/main/java/foreign/c/constants$10.java | 61 + .../src/main/java/foreign/c/constants$11.java | 60 + .../src/main/java/foreign/c/constants$12.java | 58 + .../src/main/java/foreign/c/constants$13.java | 53 + .../src/main/java/foreign/c/constants$14.java | 52 + .../src/main/java/foreign/c/constants$15.java | 50 + .../src/main/java/foreign/c/constants$16.java | 61 + .../src/main/java/foreign/c/constants$17.java | 64 + .../src/main/java/foreign/c/constants$18.java | 63 + .../src/main/java/foreign/c/constants$19.java | 62 + .../src/main/java/foreign/c/constants$2.java | 60 + .../src/main/java/foreign/c/constants$20.java | 56 + .../src/main/java/foreign/c/constants$21.java | 18 + .../src/main/java/foreign/c/constants$3.java | 64 + .../src/main/java/foreign/c/constants$4.java | 64 + .../src/main/java/foreign/c/constants$5.java | 63 + .../src/main/java/foreign/c/constants$6.java | 67 + .../src/main/java/foreign/c/constants$7.java | 69 + .../src/main/java/foreign/c/constants$8.java | 61 + .../src/main/java/foreign/c/constants$9.java | 59 + .../src/main/java/foreign/c/stdio_h.java | 1881 +++++++++++++++++ java-panama/src/main/resources/hello.c | 5 + 32 files changed, 3694 insertions(+), 6 deletions(-) rename java-panama/src/main/java/com/baeldung/java/panama/{HelloWorld.java => core/Greetings.java} (80%) create mode 100644 java-panama/src/main/java/com/baeldung/java/panama/core/MemoryAllocation.java create mode 100644 java-panama/src/main/java/com/baeldung/java/panama/core/MemoryLayout.java create mode 100644 java-panama/src/main/java/com/baeldung/java/panama/jextract/Greetings.java create mode 100644 java-panama/src/main/java/foreign/c/Constants$root.java create mode 100644 java-panama/src/main/java/foreign/c/FILE.java create mode 100644 java-panama/src/main/java/foreign/c/RuntimeHelper.java create mode 100644 java-panama/src/main/java/foreign/c/_iobuf.java create mode 100644 java-panama/src/main/java/foreign/c/constants$0.java create mode 100644 java-panama/src/main/java/foreign/c/constants$1.java create mode 100644 java-panama/src/main/java/foreign/c/constants$10.java create mode 100644 java-panama/src/main/java/foreign/c/constants$11.java create mode 100644 java-panama/src/main/java/foreign/c/constants$12.java create mode 100644 java-panama/src/main/java/foreign/c/constants$13.java create mode 100644 java-panama/src/main/java/foreign/c/constants$14.java create mode 100644 java-panama/src/main/java/foreign/c/constants$15.java create mode 100644 java-panama/src/main/java/foreign/c/constants$16.java create mode 100644 java-panama/src/main/java/foreign/c/constants$17.java create mode 100644 java-panama/src/main/java/foreign/c/constants$18.java create mode 100644 java-panama/src/main/java/foreign/c/constants$19.java create mode 100644 java-panama/src/main/java/foreign/c/constants$2.java create mode 100644 java-panama/src/main/java/foreign/c/constants$20.java create mode 100644 java-panama/src/main/java/foreign/c/constants$21.java create mode 100644 java-panama/src/main/java/foreign/c/constants$3.java create mode 100644 java-panama/src/main/java/foreign/c/constants$4.java create mode 100644 java-panama/src/main/java/foreign/c/constants$5.java create mode 100644 java-panama/src/main/java/foreign/c/constants$6.java create mode 100644 java-panama/src/main/java/foreign/c/constants$7.java create mode 100644 java-panama/src/main/java/foreign/c/constants$8.java create mode 100644 java-panama/src/main/java/foreign/c/constants$9.java create mode 100644 java-panama/src/main/java/foreign/c/stdio_h.java create mode 100644 java-panama/src/main/resources/hello.c diff --git a/java-panama/src/main/java/com/baeldung/java/panama/HelloWorld.java b/java-panama/src/main/java/com/baeldung/java/panama/core/Greetings.java similarity index 80% rename from java-panama/src/main/java/com/baeldung/java/panama/HelloWorld.java rename to java-panama/src/main/java/com/baeldung/java/panama/core/Greetings.java index 79c57cdbc4..7c210f1216 100644 --- a/java-panama/src/main/java/com/baeldung/java/panama/HelloWorld.java +++ b/java-panama/src/main/java/com/baeldung/java/panama/core/Greetings.java @@ -1,14 +1,12 @@ -package com.baeldung.java.panama; +package com.baeldung.java.panama.core; import java.lang.foreign.*; import java.lang.invoke.MethodHandle; -import java.util.Objects; -import static java.lang.foreign.ValueLayout.ADDRESS; -import static java.lang.foreign.ValueLayout.JAVA_INT; +import static java.lang.foreign.ValueLayout.*; -public class HelloWorld { +public class Greetings { public static void main(String[] args) throws Throwable { @@ -27,7 +25,9 @@ public class HelloWorld { .orElse(null); - Objects.requireNonNull(methodHandle); + if(methodHandle == null){ + throw new NoSuchMethodError("Method Handle was not found"); + }; try (MemorySession memorySession = MemorySession.openConfined()) { MemorySegment greetingSegment = memorySession.allocateUtf8String(greeting); diff --git a/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryAllocation.java b/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryAllocation.java new file mode 100644 index 0000000000..710f1a1e87 --- /dev/null +++ b/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryAllocation.java @@ -0,0 +1,26 @@ +package com.baeldung.java.panama.core; + +import java.lang.foreign.MemorySegment; +import java.lang.foreign.MemorySession; +import java.lang.foreign.ValueLayout; +import java.lang.foreign.SegmentAllocator; + + + +public class MemoryAllocation { + + public static void main(String[] args) throws Throwable { + + + try (MemorySession session = MemorySession.openConfined()) { + String[] greetingStrings = {"hello", "world", "panama", "baeldung"}; + SegmentAllocator allocator = SegmentAllocator.implicitAllocator(); + MemorySegment offHeapSegment = allocator.allocateArray(ValueLayout.ADDRESS, greetingStrings.length); + for (int i = 0; i < greetingStrings.length; i++) { + // Allocate a string off-heap, then store a pointer to it + MemorySegment cString = allocator.allocateUtf8String(greetingStrings[i]); + offHeapSegment.setAtIndex(ValueLayout.ADDRESS, i, cString); + } + } + } +} diff --git a/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryLayout.java b/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryLayout.java new file mode 100644 index 0000000000..620577f887 --- /dev/null +++ b/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryLayout.java @@ -0,0 +1,56 @@ +package com.baeldung.java.panama.core; + +import java.lang.foreign.GroupLayout; +import java.lang.foreign.MemorySegment; +import java.lang.foreign.MemorySession; +import java.lang.foreign.SequenceLayout; +import java.lang.invoke.VarHandle; + +import static java.lang.foreign.MemoryLayout.sequenceLayout; +import static java.lang.foreign.MemoryLayout.structLayout; +import static java.lang.foreign.ValueLayout.*; + + +public class MemoryLayout { + + public static void main(String[] args) { + + GroupLayout pointLayout = structLayout( + JAVA_DOUBLE.withName("x"), + JAVA_DOUBLE.withName("y") + ); + + SequenceLayout ptsLayout = sequenceLayout(10, + pointLayout); + + VarHandle xvarHandle = pointLayout.varHandle(PathElement.groupElement("x")); + VarHandle yvarHandle = pointLayout.varHandle(PathElement.groupElement("y")); + + try (MemorySession memorySession = MemorySession.openConfined()) { + + MemorySegment pointSegment = memorySession.allocate(pointLayout); + xvarHandle.set(pointSegment, 3d); + yvarHandle.set(pointSegment, 4d); + + System.out.println(pointSegment.toString()); + + } + + } + + static class ValueLayout { + + public static void main(String[] args) { + + try (MemorySession memorySession = MemorySession.openConfined()) { + int byteSize = 5; + int index = 3; + float value = 6; + MemorySegment segment = MemorySegment.allocateNative(byteSize, memorySession); + segment.setAtIndex(JAVA_FLOAT, index, value); + float result = segment.getAtIndex(JAVA_FLOAT, index); + System.out.println("Float value is:" + result); + } + } + } +} diff --git a/java-panama/src/main/java/com/baeldung/java/panama/jextract/Greetings.java b/java-panama/src/main/java/com/baeldung/java/panama/jextract/Greetings.java new file mode 100644 index 0000000000..7a22c70fce --- /dev/null +++ b/java-panama/src/main/java/com/baeldung/java/panama/jextract/Greetings.java @@ -0,0 +1,17 @@ +package com.baeldung.java.panama.jextract; + +import java.lang.foreign.MemorySegment; +import java.lang.foreign.MemorySession; +import static foreign.c.stdio_h.printf; + +public class Greetings { + + public static void main(String[] args) { + String greeting = "Hello World from Project Panama Baeldung Article, using JExtract!"; + + try (MemorySession memorySession = MemorySession.openConfined()) { + MemorySegment greetingSegment = memorySession.allocateUtf8String(greeting); + printf(greetingSegment); + } + } +} diff --git a/java-panama/src/main/java/foreign/c/Constants$root.java b/java-panama/src/main/java/foreign/c/Constants$root.java new file mode 100644 index 0000000000..2a8f1bad0c --- /dev/null +++ b/java-panama/src/main/java/foreign/c/Constants$root.java @@ -0,0 +1,23 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +public class Constants$root { + + static final OfBoolean C_BOOL$LAYOUT = JAVA_BOOLEAN; + static final OfByte C_CHAR$LAYOUT = JAVA_BYTE; + static final OfShort C_SHORT$LAYOUT = JAVA_SHORT.withBitAlignment(16); + static final OfInt C_INT$LAYOUT = JAVA_INT.withBitAlignment(32); + static final OfInt C_LONG$LAYOUT = JAVA_INT.withBitAlignment(32); + static final OfLong C_LONG_LONG$LAYOUT = JAVA_LONG.withBitAlignment(64); + static final OfFloat C_FLOAT$LAYOUT = JAVA_FLOAT.withBitAlignment(32); + static final OfDouble C_DOUBLE$LAYOUT = JAVA_DOUBLE.withBitAlignment(64); + static final OfAddress C_POINTER$LAYOUT = ADDRESS.withBitAlignment(64); +} + + diff --git a/java-panama/src/main/java/foreign/c/FILE.java b/java-panama/src/main/java/foreign/c/FILE.java new file mode 100644 index 0000000000..1956914637 --- /dev/null +++ b/java-panama/src/main/java/foreign/c/FILE.java @@ -0,0 +1,14 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +public class FILE extends _iobuf { + +} + + diff --git a/java-panama/src/main/java/foreign/c/RuntimeHelper.java b/java-panama/src/main/java/foreign/c/RuntimeHelper.java new file mode 100644 index 0000000000..5fd36bdc7b --- /dev/null +++ b/java-panama/src/main/java/foreign/c/RuntimeHelper.java @@ -0,0 +1,233 @@ +package foreign.c; +// Generated by jextract + +import java.lang.foreign.Addressable; +import java.lang.foreign.Linker; +import java.lang.foreign.FunctionDescriptor; +import java.lang.foreign.GroupLayout; +import java.lang.foreign.SymbolLookup; +import java.lang.foreign.MemoryAddress; +import java.lang.foreign.MemoryLayout; +import java.lang.foreign.MemorySegment; +import java.lang.foreign.MemorySession; +import java.lang.foreign.SegmentAllocator; +import java.lang.foreign.ValueLayout; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.io.File; +import java.nio.file.Path; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Optional; +import java.util.stream.Stream; + +import static java.lang.foreign.Linker.*; +import static java.lang.foreign.ValueLayout.*; + +final class RuntimeHelper { + + private RuntimeHelper() {} + private final static Linker LINKER = Linker.nativeLinker(); + private final static ClassLoader LOADER = RuntimeHelper.class.getClassLoader(); + private final static MethodHandles.Lookup MH_LOOKUP = MethodHandles.lookup(); + private final static SymbolLookup SYMBOL_LOOKUP; + + final static SegmentAllocator CONSTANT_ALLOCATOR = + (size, align) -> MemorySegment.allocateNative(size, align, MemorySession.openImplicit()); + + static { + + SymbolLookup loaderLookup = SymbolLookup.loaderLookup(); + SYMBOL_LOOKUP = name -> loaderLookup.lookup(name).or(() -> LINKER.defaultLookup().lookup(name)); + } + + static T requireNonNull(T obj, String symbolName) { + if (obj == null) { + throw new UnsatisfiedLinkError("unresolved symbol: " + symbolName); + } + return obj; + } + + private final static SegmentAllocator THROWING_ALLOCATOR = (x, y) -> { throw new AssertionError("should not reach here"); }; + + static final MemorySegment lookupGlobalVariable(String name, MemoryLayout layout) { + return SYMBOL_LOOKUP.lookup(name).map(symbol -> MemorySegment.ofAddress(symbol.address(), layout.byteSize(), MemorySession.openShared())).orElse(null); + } + + static final MethodHandle downcallHandle(String name, FunctionDescriptor fdesc) { + return SYMBOL_LOOKUP.lookup(name). + map(addr -> LINKER.downcallHandle(addr, fdesc)). + orElse(null); + } + + static final MethodHandle downcallHandle(FunctionDescriptor fdesc) { + return LINKER.downcallHandle(fdesc); + } + + static final MethodHandle downcallHandleVariadic(String name, FunctionDescriptor fdesc) { + return SYMBOL_LOOKUP.lookup(name). + map(addr -> VarargsInvoker.make(addr, fdesc)). + orElse(null); + } + + static final MemorySegment upcallStub(Class fi, Z z, FunctionDescriptor fdesc, MemorySession session) { + try { + MethodHandle handle = MH_LOOKUP.findVirtual(fi, "apply", Linker.upcallType(fdesc)); + handle = handle.bindTo(z); + return LINKER.upcallStub(handle, fdesc, session); + } catch (Throwable ex) { + throw new AssertionError(ex); + } + } + + static MemorySegment asArray(MemoryAddress addr, MemoryLayout layout, int numElements, MemorySession session) { + return MemorySegment.ofAddress(addr, numElements * layout.byteSize(), session); + } + + // Internals only below this point + + private static class VarargsInvoker { + private static final MethodHandle INVOKE_MH; + private final MemorySegment symbol; + private final FunctionDescriptor function; + + private VarargsInvoker(MemorySegment symbol, FunctionDescriptor function) { + this.symbol = symbol; + this.function = function; + } + + static { + try { + INVOKE_MH = MethodHandles.lookup().findVirtual(VarargsInvoker.class, "invoke", MethodType.methodType(Object.class, SegmentAllocator.class, Object[].class)); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + static MethodHandle make(MemorySegment symbol, FunctionDescriptor function) { + VarargsInvoker invoker = new VarargsInvoker(symbol, function); + MethodHandle handle = INVOKE_MH.bindTo(invoker).asCollector(Object[].class, function.argumentLayouts().size() + 1); + MethodType mtype = MethodType.methodType(function.returnLayout().isPresent() ? carrier(function.returnLayout().get(), true) : void.class); + for (MemoryLayout layout : function.argumentLayouts()) { + mtype = mtype.appendParameterTypes(carrier(layout, false)); + } + mtype = mtype.appendParameterTypes(Object[].class); + if (mtype.returnType().equals(MemorySegment.class)) { + mtype = mtype.insertParameterTypes(0, SegmentAllocator.class); + } else { + handle = MethodHandles.insertArguments(handle, 0, THROWING_ALLOCATOR); + } + return handle.asType(mtype); + } + + static Class carrier(MemoryLayout layout, boolean ret) { + if (layout instanceof ValueLayout valueLayout) { + return (ret || valueLayout.carrier() != MemoryAddress.class) ? + valueLayout.carrier() : Addressable.class; + } else if (layout instanceof GroupLayout) { + return MemorySegment.class; + } else { + throw new AssertionError("Cannot get here!"); + } + } + + private Object invoke(SegmentAllocator allocator, Object[] args) throws Throwable { + // one trailing Object[] + int nNamedArgs = function.argumentLayouts().size(); + assert(args.length == nNamedArgs + 1); + // The last argument is the array of vararg collector + Object[] unnamedArgs = (Object[]) args[args.length - 1]; + + int argsCount = nNamedArgs + unnamedArgs.length; + Class[] argTypes = new Class[argsCount]; + MemoryLayout[] argLayouts = new MemoryLayout[nNamedArgs + unnamedArgs.length]; + + int pos = 0; + for (pos = 0; pos < nNamedArgs; pos++) { + argLayouts[pos] = function.argumentLayouts().get(pos); + } + + assert pos == nNamedArgs; + for (Object o: unnamedArgs) { + argLayouts[pos] = variadicLayout(normalize(o.getClass())); + pos++; + } + assert pos == argsCount; + + FunctionDescriptor f = (function.returnLayout().isEmpty()) ? + FunctionDescriptor.ofVoid(argLayouts) : + FunctionDescriptor.of(function.returnLayout().get(), argLayouts); + MethodHandle mh = LINKER.downcallHandle(symbol, f); + if (mh.type().returnType() == MemorySegment.class) { + mh = mh.bindTo(allocator); + } + // flatten argument list so that it can be passed to an asSpreader MH + Object[] allArgs = new Object[nNamedArgs + unnamedArgs.length]; + System.arraycopy(args, 0, allArgs, 0, nNamedArgs); + System.arraycopy(unnamedArgs, 0, allArgs, nNamedArgs, unnamedArgs.length); + + return mh.asSpreader(Object[].class, argsCount).invoke(allArgs); + } + + private static Class unboxIfNeeded(Class clazz) { + if (clazz == Boolean.class) { + return boolean.class; + } else if (clazz == Void.class) { + return void.class; + } else if (clazz == Byte.class) { + return byte.class; + } else if (clazz == Character.class) { + return char.class; + } else if (clazz == Short.class) { + return short.class; + } else if (clazz == Integer.class) { + return int.class; + } else if (clazz == Long.class) { + return long.class; + } else if (clazz == Float.class) { + return float.class; + } else if (clazz == Double.class) { + return double.class; + } else { + return clazz; + } + } + + private Class promote(Class c) { + if (c == byte.class || c == char.class || c == short.class || c == int.class) { + return long.class; + } else if (c == float.class) { + return double.class; + } else { + return c; + } + } + + private Class normalize(Class c) { + c = unboxIfNeeded(c); + if (c.isPrimitive()) { + return promote(c); + } + if (MemoryAddress.class.isAssignableFrom(c)) { + return MemoryAddress.class; + } + if (MemorySegment.class.isAssignableFrom(c)) { + return MemorySegment.class; + } + throw new IllegalArgumentException("Invalid type for ABI: " + c.getTypeName()); + } + + private MemoryLayout variadicLayout(Class c) { + if (c == long.class) { + return JAVA_LONG; + } else if (c == double.class) { + return JAVA_DOUBLE; + } else if (MemoryAddress.class.isAssignableFrom(c)) { + return ADDRESS; + } else { + throw new IllegalArgumentException("Unhandled variadic argument class: " + c); + } + } + } +} diff --git a/java-panama/src/main/java/foreign/c/_iobuf.java b/java-panama/src/main/java/foreign/c/_iobuf.java new file mode 100644 index 0000000000..b9f546f634 --- /dev/null +++ b/java-panama/src/main/java/foreign/c/_iobuf.java @@ -0,0 +1,162 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +public class _iobuf { + + static final GroupLayout $struct$LAYOUT = MemoryLayout.structLayout( + Constants$root.C_POINTER$LAYOUT.withName("_ptr"), + Constants$root.C_LONG$LAYOUT.withName("_cnt"), + MemoryLayout.paddingLayout(32), + Constants$root.C_POINTER$LAYOUT.withName("_base"), + Constants$root.C_LONG$LAYOUT.withName("_flag"), + Constants$root.C_LONG$LAYOUT.withName("_file"), + Constants$root.C_LONG$LAYOUT.withName("_charbuf"), + Constants$root.C_LONG$LAYOUT.withName("_bufsiz"), + Constants$root.C_POINTER$LAYOUT.withName("_tmpfname") + ).withName("_iobuf"); + public static MemoryLayout $LAYOUT() { + return _iobuf.$struct$LAYOUT; + } + static final VarHandle _ptr$VH = $struct$LAYOUT.varHandle(MemoryLayout.PathElement.groupElement("_ptr")); + public static VarHandle _ptr$VH() { + return _iobuf._ptr$VH; + } + public static MemoryAddress _ptr$get(MemorySegment seg) { + return (java.lang.foreign.MemoryAddress)_iobuf._ptr$VH.get(seg); + } + public static void _ptr$set( MemorySegment seg, MemoryAddress x) { + _iobuf._ptr$VH.set(seg, x); + } + public static MemoryAddress _ptr$get(MemorySegment seg, long index) { + return (java.lang.foreign.MemoryAddress)_iobuf._ptr$VH.get(seg.asSlice(index*sizeof())); + } + public static void _ptr$set(MemorySegment seg, long index, MemoryAddress x) { + _iobuf._ptr$VH.set(seg.asSlice(index*sizeof()), x); + } + static final VarHandle _cnt$VH = $struct$LAYOUT.varHandle(MemoryLayout.PathElement.groupElement("_cnt")); + public static VarHandle _cnt$VH() { + return _iobuf._cnt$VH; + } + public static int _cnt$get(MemorySegment seg) { + return (int)_iobuf._cnt$VH.get(seg); + } + public static void _cnt$set( MemorySegment seg, int x) { + _iobuf._cnt$VH.set(seg, x); + } + public static int _cnt$get(MemorySegment seg, long index) { + return (int)_iobuf._cnt$VH.get(seg.asSlice(index*sizeof())); + } + public static void _cnt$set(MemorySegment seg, long index, int x) { + _iobuf._cnt$VH.set(seg.asSlice(index*sizeof()), x); + } + static final VarHandle _base$VH = $struct$LAYOUT.varHandle(MemoryLayout.PathElement.groupElement("_base")); + public static VarHandle _base$VH() { + return _iobuf._base$VH; + } + public static MemoryAddress _base$get(MemorySegment seg) { + return (java.lang.foreign.MemoryAddress)_iobuf._base$VH.get(seg); + } + public static void _base$set( MemorySegment seg, MemoryAddress x) { + _iobuf._base$VH.set(seg, x); + } + public static MemoryAddress _base$get(MemorySegment seg, long index) { + return (java.lang.foreign.MemoryAddress)_iobuf._base$VH.get(seg.asSlice(index*sizeof())); + } + public static void _base$set(MemorySegment seg, long index, MemoryAddress x) { + _iobuf._base$VH.set(seg.asSlice(index*sizeof()), x); + } + static final VarHandle _flag$VH = $struct$LAYOUT.varHandle(MemoryLayout.PathElement.groupElement("_flag")); + public static VarHandle _flag$VH() { + return _iobuf._flag$VH; + } + public static int _flag$get(MemorySegment seg) { + return (int)_iobuf._flag$VH.get(seg); + } + public static void _flag$set( MemorySegment seg, int x) { + _iobuf._flag$VH.set(seg, x); + } + public static int _flag$get(MemorySegment seg, long index) { + return (int)_iobuf._flag$VH.get(seg.asSlice(index*sizeof())); + } + public static void _flag$set(MemorySegment seg, long index, int x) { + _iobuf._flag$VH.set(seg.asSlice(index*sizeof()), x); + } + static final VarHandle _file$VH = $struct$LAYOUT.varHandle(MemoryLayout.PathElement.groupElement("_file")); + public static VarHandle _file$VH() { + return _iobuf._file$VH; + } + public static int _file$get(MemorySegment seg) { + return (int)_iobuf._file$VH.get(seg); + } + public static void _file$set( MemorySegment seg, int x) { + _iobuf._file$VH.set(seg, x); + } + public static int _file$get(MemorySegment seg, long index) { + return (int)_iobuf._file$VH.get(seg.asSlice(index*sizeof())); + } + public static void _file$set(MemorySegment seg, long index, int x) { + _iobuf._file$VH.set(seg.asSlice(index*sizeof()), x); + } + static final VarHandle _charbuf$VH = $struct$LAYOUT.varHandle(MemoryLayout.PathElement.groupElement("_charbuf")); + public static VarHandle _charbuf$VH() { + return _iobuf._charbuf$VH; + } + public static int _charbuf$get(MemorySegment seg) { + return (int)_iobuf._charbuf$VH.get(seg); + } + public static void _charbuf$set( MemorySegment seg, int x) { + _iobuf._charbuf$VH.set(seg, x); + } + public static int _charbuf$get(MemorySegment seg, long index) { + return (int)_iobuf._charbuf$VH.get(seg.asSlice(index*sizeof())); + } + public static void _charbuf$set(MemorySegment seg, long index, int x) { + _iobuf._charbuf$VH.set(seg.asSlice(index*sizeof()), x); + } + static final VarHandle _bufsiz$VH = $struct$LAYOUT.varHandle(MemoryLayout.PathElement.groupElement("_bufsiz")); + public static VarHandle _bufsiz$VH() { + return _iobuf._bufsiz$VH; + } + public static int _bufsiz$get(MemorySegment seg) { + return (int)_iobuf._bufsiz$VH.get(seg); + } + public static void _bufsiz$set( MemorySegment seg, int x) { + _iobuf._bufsiz$VH.set(seg, x); + } + public static int _bufsiz$get(MemorySegment seg, long index) { + return (int)_iobuf._bufsiz$VH.get(seg.asSlice(index*sizeof())); + } + public static void _bufsiz$set(MemorySegment seg, long index, int x) { + _iobuf._bufsiz$VH.set(seg.asSlice(index*sizeof()), x); + } + static final VarHandle _tmpfname$VH = $struct$LAYOUT.varHandle(MemoryLayout.PathElement.groupElement("_tmpfname")); + public static VarHandle _tmpfname$VH() { + return _iobuf._tmpfname$VH; + } + public static MemoryAddress _tmpfname$get(MemorySegment seg) { + return (java.lang.foreign.MemoryAddress)_iobuf._tmpfname$VH.get(seg); + } + public static void _tmpfname$set( MemorySegment seg, MemoryAddress x) { + _iobuf._tmpfname$VH.set(seg, x); + } + public static MemoryAddress _tmpfname$get(MemorySegment seg, long index) { + return (java.lang.foreign.MemoryAddress)_iobuf._tmpfname$VH.get(seg.asSlice(index*sizeof())); + } + public static void _tmpfname$set(MemorySegment seg, long index, MemoryAddress x) { + _iobuf._tmpfname$VH.set(seg.asSlice(index*sizeof()), x); + } + public static long sizeof() { return $LAYOUT().byteSize(); } + public static MemorySegment allocate(SegmentAllocator allocator) { return allocator.allocate($LAYOUT()); } + public static MemorySegment allocateArray(int len, SegmentAllocator allocator) { + return allocator.allocate(MemoryLayout.sequenceLayout(len, $LAYOUT())); + } + public static MemorySegment ofAddress(MemoryAddress addr, MemorySession session) { return RuntimeHelper.asArray(addr, $LAYOUT(), 1, session); } +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$0.java b/java-panama/src/main/java/foreign/c/constants$0.java new file mode 100644 index 0000000000..4bd3d3fa4b --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$0.java @@ -0,0 +1,52 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$0 { + + static final FunctionDescriptor fopen$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fopen$MH = RuntimeHelper.downcallHandle( + "fopen", + constants$0.fopen$FUNC + ); + static final FunctionDescriptor freopen$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle freopen$MH = RuntimeHelper.downcallHandle( + "freopen", + constants$0.freopen$FUNC + ); + static final FunctionDescriptor fflush$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fflush$MH = RuntimeHelper.downcallHandle( + "fflush", + constants$0.fflush$FUNC + ); + static final FunctionDescriptor fclose$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fclose$MH = RuntimeHelper.downcallHandle( + "fclose", + constants$0.fclose$FUNC + ); + static final FunctionDescriptor remove$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle remove$MH = RuntimeHelper.downcallHandle( + "remove", + constants$0.remove$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$1.java b/java-panama/src/main/java/foreign/c/constants$1.java new file mode 100644 index 0000000000..acd4dbf615 --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$1.java @@ -0,0 +1,54 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$1 { + + static final FunctionDescriptor rename$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle rename$MH = RuntimeHelper.downcallHandle( + "rename", + constants$1.rename$FUNC + ); + static final FunctionDescriptor tmpfile$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT); + static final MethodHandle tmpfile$MH = RuntimeHelper.downcallHandle( + "tmpfile", + constants$1.tmpfile$FUNC + ); + static final FunctionDescriptor tmpnam$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle tmpnam$MH = RuntimeHelper.downcallHandle( + "tmpnam", + constants$1.tmpnam$FUNC + ); + static final FunctionDescriptor _tempnam$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle _tempnam$MH = RuntimeHelper.downcallHandle( + "_tempnam", + constants$1._tempnam$FUNC + ); + static final FunctionDescriptor _rmtmp$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); + static final MethodHandle _rmtmp$MH = RuntimeHelper.downcallHandle( + "_rmtmp", + constants$1._rmtmp$FUNC + ); + static final FunctionDescriptor _unlink$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle _unlink$MH = RuntimeHelper.downcallHandle( + "_unlink", + constants$1._unlink$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$10.java b/java-panama/src/main/java/foreign/c/constants$10.java new file mode 100644 index 0000000000..5f9cef3d67 --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$10.java @@ -0,0 +1,61 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$10 { + + static final FunctionDescriptor getc$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle getc$MH = RuntimeHelper.downcallHandle( + "getc", + constants$10.getc$FUNC + ); + static final FunctionDescriptor putc$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle putc$MH = RuntimeHelper.downcallHandle( + "putc", + constants$10.putc$FUNC + ); + static final FunctionDescriptor getchar$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); + static final MethodHandle getchar$MH = RuntimeHelper.downcallHandle( + "getchar", + constants$10.getchar$FUNC + ); + static final FunctionDescriptor putchar$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG$LAYOUT + ); + static final MethodHandle putchar$MH = RuntimeHelper.downcallHandle( + "putchar", + constants$10.putchar$FUNC + ); + static final FunctionDescriptor fread$FUNC = FunctionDescriptor.of(Constants$root.C_LONG_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG_LONG$LAYOUT, + Constants$root.C_LONG_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fread$MH = RuntimeHelper.downcallHandle( + "fread", + constants$10.fread$FUNC + ); + static final FunctionDescriptor fwrite$FUNC = FunctionDescriptor.of(Constants$root.C_LONG_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG_LONG$LAYOUT, + Constants$root.C_LONG_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fwrite$MH = RuntimeHelper.downcallHandle( + "fwrite", + constants$10.fwrite$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$11.java b/java-panama/src/main/java/foreign/c/constants$11.java new file mode 100644 index 0000000000..c854ef9302 --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$11.java @@ -0,0 +1,60 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$11 { + + static final FunctionDescriptor fseek$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG$LAYOUT + ); + static final MethodHandle fseek$MH = RuntimeHelper.downcallHandle( + "fseek", + constants$11.fseek$FUNC + ); + static final FunctionDescriptor ftell$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle ftell$MH = RuntimeHelper.downcallHandle( + "ftell", + constants$11.ftell$FUNC + ); + static final FunctionDescriptor rewind$FUNC = FunctionDescriptor.ofVoid( + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle rewind$MH = RuntimeHelper.downcallHandle( + "rewind", + constants$11.rewind$FUNC + ); + static final FunctionDescriptor fgetpos$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fgetpos$MH = RuntimeHelper.downcallHandle( + "fgetpos", + constants$11.fgetpos$FUNC + ); + static final FunctionDescriptor fsetpos$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fsetpos$MH = RuntimeHelper.downcallHandle( + "fsetpos", + constants$11.fsetpos$FUNC + ); + static final FunctionDescriptor feof$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle feof$MH = RuntimeHelper.downcallHandle( + "feof", + constants$11.feof$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$12.java b/java-panama/src/main/java/foreign/c/constants$12.java new file mode 100644 index 0000000000..db0d19a2b8 --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$12.java @@ -0,0 +1,58 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$12 { + + static final FunctionDescriptor ferror$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle ferror$MH = RuntimeHelper.downcallHandle( + "ferror", + constants$12.ferror$FUNC + ); + static final FunctionDescriptor clearerr$FUNC = FunctionDescriptor.ofVoid( + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle clearerr$MH = RuntimeHelper.downcallHandle( + "clearerr", + constants$12.clearerr$FUNC + ); + static final FunctionDescriptor perror$FUNC = FunctionDescriptor.ofVoid( + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle perror$MH = RuntimeHelper.downcallHandle( + "perror", + constants$12.perror$FUNC + ); + static final FunctionDescriptor _popen$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle _popen$MH = RuntimeHelper.downcallHandle( + "_popen", + constants$12._popen$FUNC + ); + static final FunctionDescriptor _pclose$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle _pclose$MH = RuntimeHelper.downcallHandle( + "_pclose", + constants$12._pclose$FUNC + ); + static final FunctionDescriptor popen$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle popen$MH = RuntimeHelper.downcallHandle( + "popen", + constants$12.popen$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$13.java b/java-panama/src/main/java/foreign/c/constants$13.java new file mode 100644 index 0000000000..f71ff564a0 --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$13.java @@ -0,0 +1,53 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$13 { + + static final FunctionDescriptor pclose$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle pclose$MH = RuntimeHelper.downcallHandle( + "pclose", + constants$13.pclose$FUNC + ); + static final FunctionDescriptor _flushall$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); + static final MethodHandle _flushall$MH = RuntimeHelper.downcallHandle( + "_flushall", + constants$13._flushall$FUNC + ); + static final FunctionDescriptor _fgetchar$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); + static final MethodHandle _fgetchar$MH = RuntimeHelper.downcallHandle( + "_fgetchar", + constants$13._fgetchar$FUNC + ); + static final FunctionDescriptor _fputchar$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG$LAYOUT + ); + static final MethodHandle _fputchar$MH = RuntimeHelper.downcallHandle( + "_fputchar", + constants$13._fputchar$FUNC + ); + static final FunctionDescriptor _fdopen$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle _fdopen$MH = RuntimeHelper.downcallHandle( + "_fdopen", + constants$13._fdopen$FUNC + ); + static final FunctionDescriptor _fileno$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle _fileno$MH = RuntimeHelper.downcallHandle( + "_fileno", + constants$13._fileno$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$14.java b/java-panama/src/main/java/foreign/c/constants$14.java new file mode 100644 index 0000000000..d1c82c9abb --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$14.java @@ -0,0 +1,52 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$14 { + + static final FunctionDescriptor _fcloseall$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); + static final MethodHandle _fcloseall$MH = RuntimeHelper.downcallHandle( + "_fcloseall", + constants$14._fcloseall$FUNC + ); + static final FunctionDescriptor _fsopen$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG$LAYOUT + ); + static final MethodHandle _fsopen$MH = RuntimeHelper.downcallHandle( + "_fsopen", + constants$14._fsopen$FUNC + ); + static final FunctionDescriptor __mingw_get_output_format$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); + static final MethodHandle __mingw_get_output_format$MH = RuntimeHelper.downcallHandle( + "__mingw_get_output_format", + constants$14.__mingw_get_output_format$FUNC + ); + static final FunctionDescriptor __mingw_set_output_format$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG$LAYOUT + ); + static final MethodHandle __mingw_set_output_format$MH = RuntimeHelper.downcallHandle( + "__mingw_set_output_format", + constants$14.__mingw_set_output_format$FUNC + ); + static final FunctionDescriptor __mingw_get_printf_count_output$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); + static final MethodHandle __mingw_get_printf_count_output$MH = RuntimeHelper.downcallHandle( + "__mingw_get_printf_count_output", + constants$14.__mingw_get_printf_count_output$FUNC + ); + static final FunctionDescriptor __mingw_set_printf_count_output$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG$LAYOUT + ); + static final MethodHandle __mingw_set_printf_count_output$MH = RuntimeHelper.downcallHandle( + "__mingw_set_printf_count_output", + constants$14.__mingw_set_printf_count_output$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$15.java b/java-panama/src/main/java/foreign/c/constants$15.java new file mode 100644 index 0000000000..426e33db00 --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$15.java @@ -0,0 +1,50 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$15 { + + static final FunctionDescriptor _get_output_format$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); + static final MethodHandle _get_output_format$MH = RuntimeHelper.downcallHandle( + "_get_output_format", + constants$15._get_output_format$FUNC + ); + static final FunctionDescriptor _set_output_format$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG$LAYOUT + ); + static final MethodHandle _set_output_format$MH = RuntimeHelper.downcallHandle( + "_set_output_format", + constants$15._set_output_format$FUNC + ); + static final FunctionDescriptor _get_printf_count_output$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); + static final MethodHandle _get_printf_count_output$MH = RuntimeHelper.downcallHandle( + "_get_printf_count_output", + constants$15._get_printf_count_output$FUNC + ); + static final FunctionDescriptor _set_printf_count_output$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG$LAYOUT + ); + static final MethodHandle _set_printf_count_output$MH = RuntimeHelper.downcallHandle( + "_set_printf_count_output", + constants$15._set_printf_count_output$FUNC + ); + static final FunctionDescriptor fgetchar$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); + static final MethodHandle fgetchar$MH = RuntimeHelper.downcallHandle( + "fgetchar", + constants$15.fgetchar$FUNC + ); + static final FunctionDescriptor fputchar$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG$LAYOUT + ); + static final MethodHandle fputchar$MH = RuntimeHelper.downcallHandle( + "fputchar", + constants$15.fputchar$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$16.java b/java-panama/src/main/java/foreign/c/constants$16.java new file mode 100644 index 0000000000..58e06fa164 --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$16.java @@ -0,0 +1,61 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$16 { + + static final FunctionDescriptor fdopen$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fdopen$MH = RuntimeHelper.downcallHandle( + "fdopen", + constants$16.fdopen$FUNC + ); + static final FunctionDescriptor fileno$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fileno$MH = RuntimeHelper.downcallHandle( + "fileno", + constants$16.fileno$FUNC + ); + static final FunctionDescriptor fwprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fwprintf$MH = RuntimeHelper.downcallHandleVariadic( + "fwprintf", + constants$16.fwprintf$FUNC + ); + static final FunctionDescriptor wprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle wprintf$MH = RuntimeHelper.downcallHandleVariadic( + "wprintf", + constants$16.wprintf$FUNC + ); + static final FunctionDescriptor vfwprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle vfwprintf$MH = RuntimeHelper.downcallHandle( + "vfwprintf", + constants$16.vfwprintf$FUNC + ); + static final FunctionDescriptor vwprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle vwprintf$MH = RuntimeHelper.downcallHandle( + "vwprintf", + constants$16.vwprintf$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$17.java b/java-panama/src/main/java/foreign/c/constants$17.java new file mode 100644 index 0000000000..f58aad6fb6 --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$17.java @@ -0,0 +1,64 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$17 { + + static final FunctionDescriptor _snwprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle _snwprintf$MH = RuntimeHelper.downcallHandleVariadic( + "_snwprintf", + constants$17._snwprintf$FUNC + ); + static final FunctionDescriptor _vscwprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle _vscwprintf$MH = RuntimeHelper.downcallHandle( + "_vscwprintf", + constants$17._vscwprintf$FUNC + ); + static final FunctionDescriptor _vsnwprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle _vsnwprintf$MH = RuntimeHelper.downcallHandle( + "_vsnwprintf", + constants$17._vsnwprintf$FUNC + ); + static final FunctionDescriptor fwscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fwscanf$MH = RuntimeHelper.downcallHandleVariadic( + "fwscanf", + constants$17.fwscanf$FUNC + ); + static final FunctionDescriptor wscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle wscanf$MH = RuntimeHelper.downcallHandleVariadic( + "wscanf", + constants$17.wscanf$FUNC + ); + static final FunctionDescriptor swscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle swscanf$MH = RuntimeHelper.downcallHandleVariadic( + "swscanf", + constants$17.swscanf$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$18.java b/java-panama/src/main/java/foreign/c/constants$18.java new file mode 100644 index 0000000000..15af05eb64 --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$18.java @@ -0,0 +1,63 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$18 { + + static final FunctionDescriptor fgetwc$FUNC = FunctionDescriptor.of(Constants$root.C_SHORT$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fgetwc$MH = RuntimeHelper.downcallHandle( + "fgetwc", + constants$18.fgetwc$FUNC + ); + static final FunctionDescriptor fputwc$FUNC = FunctionDescriptor.of(Constants$root.C_SHORT$LAYOUT, + Constants$root.C_SHORT$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fputwc$MH = RuntimeHelper.downcallHandle( + "fputwc", + constants$18.fputwc$FUNC + ); + static final FunctionDescriptor ungetwc$FUNC = FunctionDescriptor.of(Constants$root.C_SHORT$LAYOUT, + Constants$root.C_SHORT$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle ungetwc$MH = RuntimeHelper.downcallHandle( + "ungetwc", + constants$18.ungetwc$FUNC + ); + static final FunctionDescriptor swprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle swprintf$MH = RuntimeHelper.downcallHandleVariadic( + "swprintf", + constants$18.swprintf$FUNC + ); + static final FunctionDescriptor vswprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle vswprintf$MH = RuntimeHelper.downcallHandle( + "vswprintf", + constants$18.vswprintf$FUNC + ); + static final FunctionDescriptor snwprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle snwprintf$MH = RuntimeHelper.downcallHandleVariadic( + "snwprintf", + constants$18.snwprintf$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$19.java b/java-panama/src/main/java/foreign/c/constants$19.java new file mode 100644 index 0000000000..a9cadf6ddb --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$19.java @@ -0,0 +1,62 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$19 { + + static final FunctionDescriptor vsnwprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle vsnwprintf$MH = RuntimeHelper.downcallHandle( + "vsnwprintf", + constants$19.vsnwprintf$FUNC + ); + static final FunctionDescriptor vwscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle vwscanf$MH = RuntimeHelper.downcallHandle( + "vwscanf", + constants$19.vwscanf$FUNC + ); + static final FunctionDescriptor vfwscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle vfwscanf$MH = RuntimeHelper.downcallHandle( + "vfwscanf", + constants$19.vfwscanf$FUNC + ); + static final FunctionDescriptor vswscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle vswscanf$MH = RuntimeHelper.downcallHandle( + "vswscanf", + constants$19.vswscanf$FUNC + ); + static final FunctionDescriptor _fgetwchar$FUNC = FunctionDescriptor.of(Constants$root.C_SHORT$LAYOUT); + static final MethodHandle _fgetwchar$MH = RuntimeHelper.downcallHandle( + "_fgetwchar", + constants$19._fgetwchar$FUNC + ); + static final FunctionDescriptor _fputwchar$FUNC = FunctionDescriptor.of(Constants$root.C_SHORT$LAYOUT, + Constants$root.C_SHORT$LAYOUT + ); + static final MethodHandle _fputwchar$MH = RuntimeHelper.downcallHandle( + "_fputwchar", + constants$19._fputwchar$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$2.java b/java-panama/src/main/java/foreign/c/constants$2.java new file mode 100644 index 0000000000..a522b398aa --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$2.java @@ -0,0 +1,60 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$2 { + + static final FunctionDescriptor tempnam$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle tempnam$MH = RuntimeHelper.downcallHandle( + "tempnam", + constants$2.tempnam$FUNC + ); + static final FunctionDescriptor rmtmp$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); + static final MethodHandle rmtmp$MH = RuntimeHelper.downcallHandle( + "rmtmp", + constants$2.rmtmp$FUNC + ); + static final FunctionDescriptor unlink$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle unlink$MH = RuntimeHelper.downcallHandle( + "unlink", + constants$2.unlink$FUNC + ); + static final FunctionDescriptor setvbuf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG_LONG$LAYOUT + ); + static final MethodHandle setvbuf$MH = RuntimeHelper.downcallHandle( + "setvbuf", + constants$2.setvbuf$FUNC + ); + static final FunctionDescriptor setbuf$FUNC = FunctionDescriptor.ofVoid( + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle setbuf$MH = RuntimeHelper.downcallHandle( + "setbuf", + constants$2.setbuf$FUNC + ); + static final FunctionDescriptor __mingw_fprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle __mingw_fprintf$MH = RuntimeHelper.downcallHandleVariadic( + "__mingw_fprintf", + constants$2.__mingw_fprintf$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$20.java b/java-panama/src/main/java/foreign/c/constants$20.java new file mode 100644 index 0000000000..feec0d4d44 --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$20.java @@ -0,0 +1,56 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$20 { + + static final FunctionDescriptor _getw$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle _getw$MH = RuntimeHelper.downcallHandle( + "_getw", + constants$20._getw$FUNC + ); + static final FunctionDescriptor _putw$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle _putw$MH = RuntimeHelper.downcallHandle( + "_putw", + constants$20._putw$FUNC + ); + static final FunctionDescriptor fgetwchar$FUNC = FunctionDescriptor.of(Constants$root.C_SHORT$LAYOUT); + static final MethodHandle fgetwchar$MH = RuntimeHelper.downcallHandle( + "fgetwchar", + constants$20.fgetwchar$FUNC + ); + static final FunctionDescriptor fputwchar$FUNC = FunctionDescriptor.of(Constants$root.C_SHORT$LAYOUT, + Constants$root.C_SHORT$LAYOUT + ); + static final MethodHandle fputwchar$MH = RuntimeHelper.downcallHandle( + "fputwchar", + constants$20.fputwchar$FUNC + ); + static final FunctionDescriptor getw$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle getw$MH = RuntimeHelper.downcallHandle( + "getw", + constants$20.getw$FUNC + ); + static final FunctionDescriptor putw$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle putw$MH = RuntimeHelper.downcallHandle( + "putw", + constants$20.putw$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$21.java b/java-panama/src/main/java/foreign/c/constants$21.java new file mode 100644 index 0000000000..ed21424dc5 --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$21.java @@ -0,0 +1,18 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$21 { + + static final MemoryAddress NULL$ADDR = MemoryAddress.ofLong(0L); + static final MemorySegment _P_tmpdir$SEGMENT = RuntimeHelper.CONSTANT_ALLOCATOR.allocateUtf8String("\\"); + static final MemorySegment P_tmpdir$SEGMENT = RuntimeHelper.CONSTANT_ALLOCATOR.allocateUtf8String("\\"); + static final MemorySegment _wP_tmpdir$SEGMENT = RuntimeHelper.CONSTANT_ALLOCATOR.allocateUtf8String("\\"); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$3.java b/java-panama/src/main/java/foreign/c/constants$3.java new file mode 100644 index 0000000000..0709e943bd --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$3.java @@ -0,0 +1,64 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$3 { + + static final FunctionDescriptor __mingw_printf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle __mingw_printf$MH = RuntimeHelper.downcallHandleVariadic( + "__mingw_printf", + constants$3.__mingw_printf$FUNC + ); + static final FunctionDescriptor __mingw_sprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle __mingw_sprintf$MH = RuntimeHelper.downcallHandleVariadic( + "__mingw_sprintf", + constants$3.__mingw_sprintf$FUNC + ); + static final FunctionDescriptor __mingw_snprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle __mingw_snprintf$MH = RuntimeHelper.downcallHandleVariadic( + "__mingw_snprintf", + constants$3.__mingw_snprintf$FUNC + ); + static final FunctionDescriptor __mingw_vfprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle __mingw_vfprintf$MH = RuntimeHelper.downcallHandle( + "__mingw_vfprintf", + constants$3.__mingw_vfprintf$FUNC + ); + static final FunctionDescriptor __mingw_vprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle __mingw_vprintf$MH = RuntimeHelper.downcallHandle( + "__mingw_vprintf", + constants$3.__mingw_vprintf$FUNC + ); + static final FunctionDescriptor __mingw_vsprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle __mingw_vsprintf$MH = RuntimeHelper.downcallHandle( + "__mingw_vsprintf", + constants$3.__mingw_vsprintf$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$4.java b/java-panama/src/main/java/foreign/c/constants$4.java new file mode 100644 index 0000000000..b5098ce7fd --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$4.java @@ -0,0 +1,64 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$4 { + + static final FunctionDescriptor __mingw_vsnprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle __mingw_vsnprintf$MH = RuntimeHelper.downcallHandle( + "__mingw_vsnprintf", + constants$4.__mingw_vsnprintf$FUNC + ); + static final FunctionDescriptor _mingw_output_format_control$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG$LAYOUT + ); + static final MethodHandle _mingw_output_format_control$MH = RuntimeHelper.downcallHandle( + "_mingw_output_format_control", + constants$4._mingw_output_format_control$FUNC + ); + static final FunctionDescriptor fprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fprintf$MH = RuntimeHelper.downcallHandleVariadic( + "fprintf", + constants$4.fprintf$FUNC + ); + static final FunctionDescriptor printf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle printf$MH = RuntimeHelper.downcallHandleVariadic( + "printf", + constants$4.printf$FUNC + ); + static final FunctionDescriptor sprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle sprintf$MH = RuntimeHelper.downcallHandleVariadic( + "sprintf", + constants$4.sprintf$FUNC + ); + static final FunctionDescriptor vfprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle vfprintf$MH = RuntimeHelper.downcallHandle( + "vfprintf", + constants$4.vfprintf$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$5.java b/java-panama/src/main/java/foreign/c/constants$5.java new file mode 100644 index 0000000000..663b2d6143 --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$5.java @@ -0,0 +1,63 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$5 { + + static final FunctionDescriptor vprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle vprintf$MH = RuntimeHelper.downcallHandle( + "vprintf", + constants$5.vprintf$FUNC + ); + static final FunctionDescriptor vsprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle vsprintf$MH = RuntimeHelper.downcallHandle( + "vsprintf", + constants$5.vsprintf$FUNC + ); + static final FunctionDescriptor __msvcrt_fprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle __msvcrt_fprintf$MH = RuntimeHelper.downcallHandleVariadic( + "__msvcrt_fprintf", + constants$5.__msvcrt_fprintf$FUNC + ); + static final FunctionDescriptor __msvcrt_printf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle __msvcrt_printf$MH = RuntimeHelper.downcallHandleVariadic( + "__msvcrt_printf", + constants$5.__msvcrt_printf$FUNC + ); + static final FunctionDescriptor __msvcrt_sprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle __msvcrt_sprintf$MH = RuntimeHelper.downcallHandleVariadic( + "__msvcrt_sprintf", + constants$5.__msvcrt_sprintf$FUNC + ); + static final FunctionDescriptor __msvcrt_vfprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle __msvcrt_vfprintf$MH = RuntimeHelper.downcallHandle( + "__msvcrt_vfprintf", + constants$5.__msvcrt_vfprintf$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$6.java b/java-panama/src/main/java/foreign/c/constants$6.java new file mode 100644 index 0000000000..c03430d45d --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$6.java @@ -0,0 +1,67 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$6 { + + static final FunctionDescriptor __msvcrt_vprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle __msvcrt_vprintf$MH = RuntimeHelper.downcallHandle( + "__msvcrt_vprintf", + constants$6.__msvcrt_vprintf$FUNC + ); + static final FunctionDescriptor __msvcrt_vsprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle __msvcrt_vsprintf$MH = RuntimeHelper.downcallHandle( + "__msvcrt_vsprintf", + constants$6.__msvcrt_vsprintf$FUNC + ); + static final FunctionDescriptor _snprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle _snprintf$MH = RuntimeHelper.downcallHandleVariadic( + "_snprintf", + constants$6._snprintf$FUNC + ); + static final FunctionDescriptor _vsnprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle _vsnprintf$MH = RuntimeHelper.downcallHandle( + "_vsnprintf", + constants$6._vsnprintf$FUNC + ); + static final FunctionDescriptor _vscprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle _vscprintf$MH = RuntimeHelper.downcallHandle( + "_vscprintf", + constants$6._vscprintf$FUNC + ); + static final FunctionDescriptor snprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle snprintf$MH = RuntimeHelper.downcallHandleVariadic( + "snprintf", + constants$6.snprintf$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$7.java b/java-panama/src/main/java/foreign/c/constants$7.java new file mode 100644 index 0000000000..21676e164a --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$7.java @@ -0,0 +1,69 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$7 { + + static final FunctionDescriptor vsnprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle vsnprintf$MH = RuntimeHelper.downcallHandle( + "vsnprintf", + constants$7.vsnprintf$FUNC + ); + static final FunctionDescriptor vscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle vscanf$MH = RuntimeHelper.downcallHandle( + "vscanf", + constants$7.vscanf$FUNC + ); + static final FunctionDescriptor vfscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle vfscanf$MH = RuntimeHelper.downcallHandle( + "vfscanf", + constants$7.vfscanf$FUNC + ); + static final FunctionDescriptor vsscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle vsscanf$MH = RuntimeHelper.downcallHandle( + "vsscanf", + constants$7.vsscanf$FUNC + ); + static final FunctionDescriptor getdelim$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle getdelim$MH = RuntimeHelper.downcallHandle( + "getdelim", + constants$7.getdelim$FUNC + ); + static final FunctionDescriptor getline$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle getline$MH = RuntimeHelper.downcallHandle( + "getline", + constants$7.getline$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$8.java b/java-panama/src/main/java/foreign/c/constants$8.java new file mode 100644 index 0000000000..5fb37ec59e --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$8.java @@ -0,0 +1,61 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$8 { + + static final FunctionDescriptor fscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fscanf$MH = RuntimeHelper.downcallHandleVariadic( + "fscanf", + constants$8.fscanf$FUNC + ); + static final FunctionDescriptor scanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle scanf$MH = RuntimeHelper.downcallHandleVariadic( + "scanf", + constants$8.scanf$FUNC + ); + static final FunctionDescriptor sscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle sscanf$MH = RuntimeHelper.downcallHandleVariadic( + "sscanf", + constants$8.sscanf$FUNC + ); + static final FunctionDescriptor fgetc$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fgetc$MH = RuntimeHelper.downcallHandle( + "fgetc", + constants$8.fgetc$FUNC + ); + static final FunctionDescriptor fgets$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fgets$MH = RuntimeHelper.downcallHandle( + "fgets", + constants$8.fgets$FUNC + ); + static final FunctionDescriptor fputc$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fputc$MH = RuntimeHelper.downcallHandle( + "fputc", + constants$8.fputc$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/constants$9.java b/java-panama/src/main/java/foreign/c/constants$9.java new file mode 100644 index 0000000000..1badf27ac5 --- /dev/null +++ b/java-panama/src/main/java/foreign/c/constants$9.java @@ -0,0 +1,59 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +class constants$9 { + + static final FunctionDescriptor fputs$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle fputs$MH = RuntimeHelper.downcallHandle( + "fputs", + constants$9.fputs$FUNC + ); + static final FunctionDescriptor gets$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle gets$MH = RuntimeHelper.downcallHandle( + "gets", + constants$9.gets$FUNC + ); + static final FunctionDescriptor puts$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle puts$MH = RuntimeHelper.downcallHandle( + "puts", + constants$9.puts$FUNC + ); + static final FunctionDescriptor ungetc$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle ungetc$MH = RuntimeHelper.downcallHandle( + "ungetc", + constants$9.ungetc$FUNC + ); + static final FunctionDescriptor _filbuf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle _filbuf$MH = RuntimeHelper.downcallHandle( + "_filbuf", + constants$9._filbuf$FUNC + ); + static final FunctionDescriptor _flsbuf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, + Constants$root.C_LONG$LAYOUT, + Constants$root.C_POINTER$LAYOUT + ); + static final MethodHandle _flsbuf$MH = RuntimeHelper.downcallHandle( + "_flsbuf", + constants$9._flsbuf$FUNC + ); +} + + diff --git a/java-panama/src/main/java/foreign/c/stdio_h.java b/java-panama/src/main/java/foreign/c/stdio_h.java new file mode 100644 index 0000000000..7aba552771 --- /dev/null +++ b/java-panama/src/main/java/foreign/c/stdio_h.java @@ -0,0 +1,1881 @@ +// Generated by jextract + +package foreign.c; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.VarHandle; +import java.nio.ByteOrder; +import java.lang.foreign.*; +import static java.lang.foreign.ValueLayout.*; +public class stdio_h { + + /* package-private */ stdio_h() {} + public static OfByte C_CHAR = Constants$root.C_CHAR$LAYOUT; + public static OfShort C_SHORT = Constants$root.C_SHORT$LAYOUT; + public static OfInt C_INT = Constants$root.C_LONG$LAYOUT; + public static OfInt C_LONG = Constants$root.C_LONG$LAYOUT; + public static OfLong C_LONG_LONG = Constants$root.C_LONG_LONG$LAYOUT; + public static OfFloat C_FLOAT = Constants$root.C_FLOAT$LAYOUT; + public static OfDouble C_DOUBLE = Constants$root.C_DOUBLE$LAYOUT; + public static OfAddress C_POINTER = Constants$root.C_POINTER$LAYOUT; + public static int __MINGW32_MAJOR_VERSION() { + return (int)5L; + } + public static int __MINGW32_MINOR_VERSION() { + return (int)0L; + } + public static int __MINGW32_PATCHLEVEL() { + return (int)2L; + } + public static int __MSVCR60_DLL() { + return (int)1536L; + } + public static int __MSVCR61_DLL() { + return (int)1537L; + } + public static int __MSVCR70_DLL() { + return (int)1792L; + } + public static int __MSVCR71_DLL() { + return (int)1793L; + } + public static int __MSVCR80_DLL() { + return (int)2048L; + } + public static int __MSVCR90_DLL() { + return (int)2304L; + } + public static int __MSVCR100_DLL() { + return (int)4096L; + } + public static int __MSVCR110_DLL() { + return (int)4352L; + } + public static int __MSVCR120_DLL() { + return (int)4608L; + } + public static int __W32API_MAJOR_VERSION() { + return (int)5L; + } + public static int __W32API_MINOR_VERSION() { + return (int)0L; + } + public static int __W32API_PATCHLEVEL() { + return (int)2L; + } + public static int SPVERSION_MASK() { + return (int)65280L; + } + public static int SUBVERSION_MASK() { + return (int)255L; + } + public static int _WIN32_WINNT_NT4() { + return (int)1024L; + } + public static int _WIN32_WINNT_NT4E() { + return (int)1025L; + } + public static int _WIN32_WINNT_NT4SP3() { + return (int)1027L; + } + public static int _WIN32_WINDOWS_95() { + return (int)1024L; + } + public static int _WIN32_WINDOWS_98() { + return (int)1040L; + } + public static int _WIN32_WINDOWS_ME() { + return (int)1168L; + } + public static int _WIN32_WINNT_WIN2K() { + return (int)1280L; + } + public static int _WIN32_WINNT_WINXP() { + return (int)1281L; + } + public static int _WIN32_WINNT_WS03() { + return (int)1282L; + } + public static int _WIN32_WINNT_WIN6() { + return (int)1536L; + } + public static int _WIN32_WINNT_VISTA() { + return (int)1536L; + } + public static int _WIN32_WINNT_WS08() { + return (int)1536L; + } + public static int _WIN32_WINNT_LONGHORN() { + return (int)1536L; + } + public static int _WIN32_WINNT_WIN7() { + return (int)1537L; + } + public static int _WIN32_WINNT_WIN8() { + return (int)1538L; + } + public static int _WIN32_WINNT_WINBLUE() { + return (int)1539L; + } + public static int _WIN32_IE_IE50() { + return (int)1280L; + } + public static int _WIN32_IE_IE501() { + return (int)1281L; + } + public static int _WIN32_IE_IE55() { + return (int)1360L; + } + public static int _WIN32_IE_IE56() { + return (int)1376L; + } + public static int _WIN32_IE_IE60() { + return (int)1536L; + } + public static int _WIN32_IE_IE60SP1() { + return (int)1537L; + } + public static int _WIN32_IE_IE60SP2() { + return (int)1539L; + } + public static int _WIN32_IE_IE70() { + return (int)1792L; + } + public static int _WIN32_IE_IE80() { + return (int)2048L; + } + public static int _WIN32_IE_IE30() { + return (int)768L; + } + public static int _WIN32_IE_IE301() { + return (int)769L; + } + public static int _WIN32_IE_IE302() { + return (int)770L; + } + public static int _WIN32_IE_IE40() { + return (int)1024L; + } + public static int _WIN32_IE_IE401() { + return (int)1025L; + } + public static int __NTDDI_WIN5() { + return (int)83886080L; + } + public static int __NTDDI_WIN51() { + return (int)83951616L; + } + public static int __NTDDI_WIN52() { + return (int)84017152L; + } + public static int __NTDDI_WIN6() { + return (int)100663296L; + } + public static int __NTDDI_WIN61() { + return (int)100728832L; + } + public static int __NTDDI_WIN62() { + return (int)100794368L; + } + public static int __NTDDI_WIN63() { + return (int)100859904L; + } + public static int __NTDDI_SP0() { + return (int)0L; + } + public static int __NTDDI_SP1() { + return (int)256L; + } + public static int __NTDDI_SP2() { + return (int)512L; + } + public static int __NTDDI_SP3() { + return (int)768L; + } + public static int __NTDDI_SP4() { + return (int)1024L; + } + public static int __CRT_GLOB_USE_MSVCRT__() { + return (int)1L; + } + public static int __CRT_GLOB_USE_MINGW__() { + return (int)2L; + } + public static int __CRT_GLOB_USE_SINGLE_QUOTE__() { + return (int)16L; + } + public static int __CRT_GLOB_BRACKET_GROUPS__() { + return (int)32L; + } + public static int _EMULATE_GLIBC() { + return (int)1L; + } + public static int _ISOC99_SOURCE() { + return (int)7L; + } + public static int _MINGW32_SOURCE_EXTENDED() { + return (int)1L; + } + public static int _IOREAD() { + return (int)1L; + } + public static int _IOWRT() { + return (int)2L; + } + public static int _IORW() { + return (int)128L; + } + public static int STDIN_FILENO() { + return (int)0L; + } + public static int STDOUT_FILENO() { + return (int)1L; + } + public static int STDERR_FILENO() { + return (int)2L; + } + public static int TMP_MAX() { + return (int)32767L; + } + public static int _IOFBF() { + return (int)0L; + } + public static int _IOLBF() { + return (int)64L; + } + public static int _IONBF() { + return (int)4L; + } + public static int _IOMYBUF() { + return (int)8L; + } + public static int _IOEOF() { + return (int)16L; + } + public static int _IOERR() { + return (int)32L; + } + public static int _IOSTRG() { + return (int)64L; + } + public static int BUFSIZ() { + return (int)512L; + } + public static int SEEK_SET() { + return (int)0L; + } + public static int SEEK_CUR() { + return (int)1L; + } + public static int SEEK_END() { + return (int)2L; + } + public static int _TWO_DIGIT_EXPONENT() { + return (int)1L; + } + public static int _THREE_DIGIT_EXPONENT() { + return (int)0L; + } + public static int __USE_MINGW_PRINTF() { + return (int)0L; + } + public static OfInt __off32_t = Constants$root.C_LONG$LAYOUT; + public static OfInt _off_t = Constants$root.C_LONG$LAYOUT; + public static OfInt off_t = Constants$root.C_LONG$LAYOUT; + public static OfInt _ssize_t = Constants$root.C_LONG$LAYOUT; + public static OfInt ssize_t = Constants$root.C_LONG$LAYOUT; + public static MethodHandle fopen$MH() { + return RuntimeHelper.requireNonNull(constants$0.fopen$MH,"fopen"); + } + public static MemoryAddress fopen ( Addressable x0, Addressable x1) { + var mh$ = fopen$MH(); + try { + return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle freopen$MH() { + return RuntimeHelper.requireNonNull(constants$0.freopen$MH,"freopen"); + } + public static MemoryAddress freopen ( Addressable x0, Addressable x1, Addressable x2) { + var mh$ = freopen$MH(); + try { + return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fflush$MH() { + return RuntimeHelper.requireNonNull(constants$0.fflush$MH,"fflush"); + } + public static int fflush ( Addressable x0) { + var mh$ = fflush$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fclose$MH() { + return RuntimeHelper.requireNonNull(constants$0.fclose$MH,"fclose"); + } + public static int fclose ( Addressable x0) { + var mh$ = fclose$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle remove$MH() { + return RuntimeHelper.requireNonNull(constants$0.remove$MH,"remove"); + } + public static int remove ( Addressable x0) { + var mh$ = remove$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle rename$MH() { + return RuntimeHelper.requireNonNull(constants$1.rename$MH,"rename"); + } + public static int rename ( Addressable x0, Addressable x1) { + var mh$ = rename$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle tmpfile$MH() { + return RuntimeHelper.requireNonNull(constants$1.tmpfile$MH,"tmpfile"); + } + public static MemoryAddress tmpfile () { + var mh$ = tmpfile$MH(); + try { + return (java.lang.foreign.MemoryAddress)mh$.invokeExact(); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle tmpnam$MH() { + return RuntimeHelper.requireNonNull(constants$1.tmpnam$MH,"tmpnam"); + } + public static MemoryAddress tmpnam ( Addressable x0) { + var mh$ = tmpnam$MH(); + try { + return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _tempnam$MH() { + return RuntimeHelper.requireNonNull(constants$1._tempnam$MH,"_tempnam"); + } + public static MemoryAddress _tempnam ( Addressable x0, Addressable x1) { + var mh$ = _tempnam$MH(); + try { + return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _rmtmp$MH() { + return RuntimeHelper.requireNonNull(constants$1._rmtmp$MH,"_rmtmp"); + } + public static int _rmtmp () { + var mh$ = _rmtmp$MH(); + try { + return (int)mh$.invokeExact(); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _unlink$MH() { + return RuntimeHelper.requireNonNull(constants$1._unlink$MH,"_unlink"); + } + public static int _unlink ( Addressable x0) { + var mh$ = _unlink$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle tempnam$MH() { + return RuntimeHelper.requireNonNull(constants$2.tempnam$MH,"tempnam"); + } + public static MemoryAddress tempnam ( Addressable x0, Addressable x1) { + var mh$ = tempnam$MH(); + try { + return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle rmtmp$MH() { + return RuntimeHelper.requireNonNull(constants$2.rmtmp$MH,"rmtmp"); + } + public static int rmtmp () { + var mh$ = rmtmp$MH(); + try { + return (int)mh$.invokeExact(); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle unlink$MH() { + return RuntimeHelper.requireNonNull(constants$2.unlink$MH,"unlink"); + } + public static int unlink ( Addressable x0) { + var mh$ = unlink$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle setvbuf$MH() { + return RuntimeHelper.requireNonNull(constants$2.setvbuf$MH,"setvbuf"); + } + public static int setvbuf ( Addressable x0, Addressable x1, int x2, long x3) { + var mh$ = setvbuf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2, x3); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle setbuf$MH() { + return RuntimeHelper.requireNonNull(constants$2.setbuf$MH,"setbuf"); + } + public static void setbuf ( Addressable x0, Addressable x1) { + var mh$ = setbuf$MH(); + try { + mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __mingw_fprintf$MH() { + return RuntimeHelper.requireNonNull(constants$2.__mingw_fprintf$MH,"__mingw_fprintf"); + } + public static int __mingw_fprintf ( Addressable x0, Addressable x1, Object... x2) { + var mh$ = __mingw_fprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __mingw_printf$MH() { + return RuntimeHelper.requireNonNull(constants$3.__mingw_printf$MH,"__mingw_printf"); + } + public static int __mingw_printf ( Addressable x0, Object... x1) { + var mh$ = __mingw_printf$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __mingw_sprintf$MH() { + return RuntimeHelper.requireNonNull(constants$3.__mingw_sprintf$MH,"__mingw_sprintf"); + } + public static int __mingw_sprintf ( Addressable x0, Addressable x1, Object... x2) { + var mh$ = __mingw_sprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __mingw_snprintf$MH() { + return RuntimeHelper.requireNonNull(constants$3.__mingw_snprintf$MH,"__mingw_snprintf"); + } + public static int __mingw_snprintf ( Addressable x0, long x1, Addressable x2, Object... x3) { + var mh$ = __mingw_snprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2, x3); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __mingw_vfprintf$MH() { + return RuntimeHelper.requireNonNull(constants$3.__mingw_vfprintf$MH,"__mingw_vfprintf"); + } + public static int __mingw_vfprintf ( Addressable x0, Addressable x1, Addressable x2) { + var mh$ = __mingw_vfprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __mingw_vprintf$MH() { + return RuntimeHelper.requireNonNull(constants$3.__mingw_vprintf$MH,"__mingw_vprintf"); + } + public static int __mingw_vprintf ( Addressable x0, Addressable x1) { + var mh$ = __mingw_vprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __mingw_vsprintf$MH() { + return RuntimeHelper.requireNonNull(constants$3.__mingw_vsprintf$MH,"__mingw_vsprintf"); + } + public static int __mingw_vsprintf ( Addressable x0, Addressable x1, Addressable x2) { + var mh$ = __mingw_vsprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __mingw_vsnprintf$MH() { + return RuntimeHelper.requireNonNull(constants$4.__mingw_vsnprintf$MH,"__mingw_vsnprintf"); + } + public static int __mingw_vsnprintf ( Addressable x0, long x1, Addressable x2, Addressable x3) { + var mh$ = __mingw_vsnprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2, x3); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _mingw_output_format_control$MH() { + return RuntimeHelper.requireNonNull(constants$4._mingw_output_format_control$MH,"_mingw_output_format_control"); + } + public static int _mingw_output_format_control ( int x0, int x1) { + var mh$ = _mingw_output_format_control$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fprintf$MH() { + return RuntimeHelper.requireNonNull(constants$4.fprintf$MH,"fprintf"); + } + public static int fprintf ( Addressable x0, Addressable x1, Object... x2) { + var mh$ = fprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle printf$MH() { + return RuntimeHelper.requireNonNull(constants$4.printf$MH,"printf"); + } + public static int printf ( Addressable x0, Object... x1) { + var mh$ = printf$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle sprintf$MH() { + return RuntimeHelper.requireNonNull(constants$4.sprintf$MH,"sprintf"); + } + public static int sprintf ( Addressable x0, Addressable x1, Object... x2) { + var mh$ = sprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle vfprintf$MH() { + return RuntimeHelper.requireNonNull(constants$4.vfprintf$MH,"vfprintf"); + } + public static int vfprintf ( Addressable x0, Addressable x1, Addressable x2) { + var mh$ = vfprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle vprintf$MH() { + return RuntimeHelper.requireNonNull(constants$5.vprintf$MH,"vprintf"); + } + public static int vprintf ( Addressable x0, Addressable x1) { + var mh$ = vprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle vsprintf$MH() { + return RuntimeHelper.requireNonNull(constants$5.vsprintf$MH,"vsprintf"); + } + public static int vsprintf ( Addressable x0, Addressable x1, Addressable x2) { + var mh$ = vsprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __msvcrt_fprintf$MH() { + return RuntimeHelper.requireNonNull(constants$5.__msvcrt_fprintf$MH,"__msvcrt_fprintf"); + } + public static int __msvcrt_fprintf ( Addressable x0, Addressable x1, Object... x2) { + var mh$ = __msvcrt_fprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __msvcrt_printf$MH() { + return RuntimeHelper.requireNonNull(constants$5.__msvcrt_printf$MH,"__msvcrt_printf"); + } + public static int __msvcrt_printf ( Addressable x0, Object... x1) { + var mh$ = __msvcrt_printf$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __msvcrt_sprintf$MH() { + return RuntimeHelper.requireNonNull(constants$5.__msvcrt_sprintf$MH,"__msvcrt_sprintf"); + } + public static int __msvcrt_sprintf ( Addressable x0, Addressable x1, Object... x2) { + var mh$ = __msvcrt_sprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __msvcrt_vfprintf$MH() { + return RuntimeHelper.requireNonNull(constants$5.__msvcrt_vfprintf$MH,"__msvcrt_vfprintf"); + } + public static int __msvcrt_vfprintf ( Addressable x0, Addressable x1, Addressable x2) { + var mh$ = __msvcrt_vfprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __msvcrt_vprintf$MH() { + return RuntimeHelper.requireNonNull(constants$6.__msvcrt_vprintf$MH,"__msvcrt_vprintf"); + } + public static int __msvcrt_vprintf ( Addressable x0, Addressable x1) { + var mh$ = __msvcrt_vprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __msvcrt_vsprintf$MH() { + return RuntimeHelper.requireNonNull(constants$6.__msvcrt_vsprintf$MH,"__msvcrt_vsprintf"); + } + public static int __msvcrt_vsprintf ( Addressable x0, Addressable x1, Addressable x2) { + var mh$ = __msvcrt_vsprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _snprintf$MH() { + return RuntimeHelper.requireNonNull(constants$6._snprintf$MH,"_snprintf"); + } + public static int _snprintf ( Addressable x0, long x1, Addressable x2, Object... x3) { + var mh$ = _snprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2, x3); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _vsnprintf$MH() { + return RuntimeHelper.requireNonNull(constants$6._vsnprintf$MH,"_vsnprintf"); + } + public static int _vsnprintf ( Addressable x0, long x1, Addressable x2, Addressable x3) { + var mh$ = _vsnprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2, x3); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _vscprintf$MH() { + return RuntimeHelper.requireNonNull(constants$6._vscprintf$MH,"_vscprintf"); + } + public static int _vscprintf ( Addressable x0, Addressable x1) { + var mh$ = _vscprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle snprintf$MH() { + return RuntimeHelper.requireNonNull(constants$6.snprintf$MH,"snprintf"); + } + public static int snprintf ( Addressable x0, long x1, Addressable x2, Object... x3) { + var mh$ = snprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2, x3); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle vsnprintf$MH() { + return RuntimeHelper.requireNonNull(constants$7.vsnprintf$MH,"vsnprintf"); + } + public static int vsnprintf ( Addressable x0, long x1, Addressable x2, Addressable x3) { + var mh$ = vsnprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2, x3); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle vscanf$MH() { + return RuntimeHelper.requireNonNull(constants$7.vscanf$MH,"vscanf"); + } + public static int vscanf ( Addressable x0, Addressable x1) { + var mh$ = vscanf$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle vfscanf$MH() { + return RuntimeHelper.requireNonNull(constants$7.vfscanf$MH,"vfscanf"); + } + public static int vfscanf ( Addressable x0, Addressable x1, Addressable x2) { + var mh$ = vfscanf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle vsscanf$MH() { + return RuntimeHelper.requireNonNull(constants$7.vsscanf$MH,"vsscanf"); + } + public static int vsscanf ( Addressable x0, Addressable x1, Addressable x2) { + var mh$ = vsscanf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle getdelim$MH() { + return RuntimeHelper.requireNonNull(constants$7.getdelim$MH,"getdelim"); + } + public static int getdelim ( Addressable x0, Addressable x1, int x2, Addressable x3) { + var mh$ = getdelim$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2, x3); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle getline$MH() { + return RuntimeHelper.requireNonNull(constants$7.getline$MH,"getline"); + } + public static int getline ( Addressable x0, Addressable x1, Addressable x2) { + var mh$ = getline$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fscanf$MH() { + return RuntimeHelper.requireNonNull(constants$8.fscanf$MH,"fscanf"); + } + public static int fscanf ( Addressable x0, Addressable x1, Object... x2) { + var mh$ = fscanf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle scanf$MH() { + return RuntimeHelper.requireNonNull(constants$8.scanf$MH,"scanf"); + } + public static int scanf ( Addressable x0, Object... x1) { + var mh$ = scanf$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle sscanf$MH() { + return RuntimeHelper.requireNonNull(constants$8.sscanf$MH,"sscanf"); + } + public static int sscanf ( Addressable x0, Addressable x1, Object... x2) { + var mh$ = sscanf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fgetc$MH() { + return RuntimeHelper.requireNonNull(constants$8.fgetc$MH,"fgetc"); + } + public static int fgetc ( Addressable x0) { + var mh$ = fgetc$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fgets$MH() { + return RuntimeHelper.requireNonNull(constants$8.fgets$MH,"fgets"); + } + public static MemoryAddress fgets ( Addressable x0, int x1, Addressable x2) { + var mh$ = fgets$MH(); + try { + return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fputc$MH() { + return RuntimeHelper.requireNonNull(constants$8.fputc$MH,"fputc"); + } + public static int fputc ( int x0, Addressable x1) { + var mh$ = fputc$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fputs$MH() { + return RuntimeHelper.requireNonNull(constants$9.fputs$MH,"fputs"); + } + public static int fputs ( Addressable x0, Addressable x1) { + var mh$ = fputs$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle gets$MH() { + return RuntimeHelper.requireNonNull(constants$9.gets$MH,"gets"); + } + public static MemoryAddress gets ( Addressable x0) { + var mh$ = gets$MH(); + try { + return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle puts$MH() { + return RuntimeHelper.requireNonNull(constants$9.puts$MH,"puts"); + } + public static int puts ( Addressable x0) { + var mh$ = puts$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle ungetc$MH() { + return RuntimeHelper.requireNonNull(constants$9.ungetc$MH,"ungetc"); + } + public static int ungetc ( int x0, Addressable x1) { + var mh$ = ungetc$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _filbuf$MH() { + return RuntimeHelper.requireNonNull(constants$9._filbuf$MH,"_filbuf"); + } + public static int _filbuf ( Addressable x0) { + var mh$ = _filbuf$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _flsbuf$MH() { + return RuntimeHelper.requireNonNull(constants$9._flsbuf$MH,"_flsbuf"); + } + public static int _flsbuf ( int x0, Addressable x1) { + var mh$ = _flsbuf$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle getc$MH() { + return RuntimeHelper.requireNonNull(constants$10.getc$MH,"getc"); + } + public static int getc ( Addressable x0) { + var mh$ = getc$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle putc$MH() { + return RuntimeHelper.requireNonNull(constants$10.putc$MH,"putc"); + } + public static int putc ( int x0, Addressable x1) { + var mh$ = putc$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle getchar$MH() { + return RuntimeHelper.requireNonNull(constants$10.getchar$MH,"getchar"); + } + public static int getchar () { + var mh$ = getchar$MH(); + try { + return (int)mh$.invokeExact(); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle putchar$MH() { + return RuntimeHelper.requireNonNull(constants$10.putchar$MH,"putchar"); + } + public static int putchar ( int x0) { + var mh$ = putchar$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fread$MH() { + return RuntimeHelper.requireNonNull(constants$10.fread$MH,"fread"); + } + public static long fread ( Addressable x0, long x1, long x2, Addressable x3) { + var mh$ = fread$MH(); + try { + return (long)mh$.invokeExact(x0, x1, x2, x3); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fwrite$MH() { + return RuntimeHelper.requireNonNull(constants$10.fwrite$MH,"fwrite"); + } + public static long fwrite ( Addressable x0, long x1, long x2, Addressable x3) { + var mh$ = fwrite$MH(); + try { + return (long)mh$.invokeExact(x0, x1, x2, x3); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fseek$MH() { + return RuntimeHelper.requireNonNull(constants$11.fseek$MH,"fseek"); + } + public static int fseek ( Addressable x0, int x1, int x2) { + var mh$ = fseek$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle ftell$MH() { + return RuntimeHelper.requireNonNull(constants$11.ftell$MH,"ftell"); + } + public static int ftell ( Addressable x0) { + var mh$ = ftell$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle rewind$MH() { + return RuntimeHelper.requireNonNull(constants$11.rewind$MH,"rewind"); + } + public static void rewind ( Addressable x0) { + var mh$ = rewind$MH(); + try { + mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static OfInt fpos_t = Constants$root.C_LONG$LAYOUT; + public static MethodHandle fgetpos$MH() { + return RuntimeHelper.requireNonNull(constants$11.fgetpos$MH,"fgetpos"); + } + public static int fgetpos ( Addressable x0, Addressable x1) { + var mh$ = fgetpos$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fsetpos$MH() { + return RuntimeHelper.requireNonNull(constants$11.fsetpos$MH,"fsetpos"); + } + public static int fsetpos ( Addressable x0, Addressable x1) { + var mh$ = fsetpos$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle feof$MH() { + return RuntimeHelper.requireNonNull(constants$11.feof$MH,"feof"); + } + public static int feof ( Addressable x0) { + var mh$ = feof$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle ferror$MH() { + return RuntimeHelper.requireNonNull(constants$12.ferror$MH,"ferror"); + } + public static int ferror ( Addressable x0) { + var mh$ = ferror$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle clearerr$MH() { + return RuntimeHelper.requireNonNull(constants$12.clearerr$MH,"clearerr"); + } + public static void clearerr ( Addressable x0) { + var mh$ = clearerr$MH(); + try { + mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle perror$MH() { + return RuntimeHelper.requireNonNull(constants$12.perror$MH,"perror"); + } + public static void perror ( Addressable x0) { + var mh$ = perror$MH(); + try { + mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _popen$MH() { + return RuntimeHelper.requireNonNull(constants$12._popen$MH,"_popen"); + } + public static MemoryAddress _popen ( Addressable x0, Addressable x1) { + var mh$ = _popen$MH(); + try { + return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _pclose$MH() { + return RuntimeHelper.requireNonNull(constants$12._pclose$MH,"_pclose"); + } + public static int _pclose ( Addressable x0) { + var mh$ = _pclose$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle popen$MH() { + return RuntimeHelper.requireNonNull(constants$12.popen$MH,"popen"); + } + public static MemoryAddress popen ( Addressable x0, Addressable x1) { + var mh$ = popen$MH(); + try { + return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle pclose$MH() { + return RuntimeHelper.requireNonNull(constants$13.pclose$MH,"pclose"); + } + public static int pclose ( Addressable x0) { + var mh$ = pclose$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _flushall$MH() { + return RuntimeHelper.requireNonNull(constants$13._flushall$MH,"_flushall"); + } + public static int _flushall () { + var mh$ = _flushall$MH(); + try { + return (int)mh$.invokeExact(); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _fgetchar$MH() { + return RuntimeHelper.requireNonNull(constants$13._fgetchar$MH,"_fgetchar"); + } + public static int _fgetchar () { + var mh$ = _fgetchar$MH(); + try { + return (int)mh$.invokeExact(); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _fputchar$MH() { + return RuntimeHelper.requireNonNull(constants$13._fputchar$MH,"_fputchar"); + } + public static int _fputchar ( int x0) { + var mh$ = _fputchar$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _fdopen$MH() { + return RuntimeHelper.requireNonNull(constants$13._fdopen$MH,"_fdopen"); + } + public static MemoryAddress _fdopen ( int x0, Addressable x1) { + var mh$ = _fdopen$MH(); + try { + return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _fileno$MH() { + return RuntimeHelper.requireNonNull(constants$13._fileno$MH,"_fileno"); + } + public static int _fileno ( Addressable x0) { + var mh$ = _fileno$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _fcloseall$MH() { + return RuntimeHelper.requireNonNull(constants$14._fcloseall$MH,"_fcloseall"); + } + public static int _fcloseall () { + var mh$ = _fcloseall$MH(); + try { + return (int)mh$.invokeExact(); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _fsopen$MH() { + return RuntimeHelper.requireNonNull(constants$14._fsopen$MH,"_fsopen"); + } + public static MemoryAddress _fsopen ( Addressable x0, Addressable x1, int x2) { + var mh$ = _fsopen$MH(); + try { + return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __mingw_get_output_format$MH() { + return RuntimeHelper.requireNonNull(constants$14.__mingw_get_output_format$MH,"__mingw_get_output_format"); + } + public static int __mingw_get_output_format () { + var mh$ = __mingw_get_output_format$MH(); + try { + return (int)mh$.invokeExact(); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __mingw_set_output_format$MH() { + return RuntimeHelper.requireNonNull(constants$14.__mingw_set_output_format$MH,"__mingw_set_output_format"); + } + public static int __mingw_set_output_format ( int x0) { + var mh$ = __mingw_set_output_format$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __mingw_get_printf_count_output$MH() { + return RuntimeHelper.requireNonNull(constants$14.__mingw_get_printf_count_output$MH,"__mingw_get_printf_count_output"); + } + public static int __mingw_get_printf_count_output () { + var mh$ = __mingw_get_printf_count_output$MH(); + try { + return (int)mh$.invokeExact(); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle __mingw_set_printf_count_output$MH() { + return RuntimeHelper.requireNonNull(constants$14.__mingw_set_printf_count_output$MH,"__mingw_set_printf_count_output"); + } + public static int __mingw_set_printf_count_output ( int x0) { + var mh$ = __mingw_set_printf_count_output$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _get_output_format$MH() { + return RuntimeHelper.requireNonNull(constants$15._get_output_format$MH,"_get_output_format"); + } + public static int _get_output_format () { + var mh$ = _get_output_format$MH(); + try { + return (int)mh$.invokeExact(); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _set_output_format$MH() { + return RuntimeHelper.requireNonNull(constants$15._set_output_format$MH,"_set_output_format"); + } + public static int _set_output_format ( int __style) { + var mh$ = _set_output_format$MH(); + try { + return (int)mh$.invokeExact(__style); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _get_printf_count_output$MH() { + return RuntimeHelper.requireNonNull(constants$15._get_printf_count_output$MH,"_get_printf_count_output"); + } + public static int _get_printf_count_output () { + var mh$ = _get_printf_count_output$MH(); + try { + return (int)mh$.invokeExact(); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _set_printf_count_output$MH() { + return RuntimeHelper.requireNonNull(constants$15._set_printf_count_output$MH,"_set_printf_count_output"); + } + public static int _set_printf_count_output ( int __mode) { + var mh$ = _set_printf_count_output$MH(); + try { + return (int)mh$.invokeExact(__mode); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fgetchar$MH() { + return RuntimeHelper.requireNonNull(constants$15.fgetchar$MH,"fgetchar"); + } + public static int fgetchar () { + var mh$ = fgetchar$MH(); + try { + return (int)mh$.invokeExact(); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fputchar$MH() { + return RuntimeHelper.requireNonNull(constants$15.fputchar$MH,"fputchar"); + } + public static int fputchar ( int x0) { + var mh$ = fputchar$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fdopen$MH() { + return RuntimeHelper.requireNonNull(constants$16.fdopen$MH,"fdopen"); + } + public static MemoryAddress fdopen ( int x0, Addressable x1) { + var mh$ = fdopen$MH(); + try { + return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fileno$MH() { + return RuntimeHelper.requireNonNull(constants$16.fileno$MH,"fileno"); + } + public static int fileno ( Addressable x0) { + var mh$ = fileno$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fwprintf$MH() { + return RuntimeHelper.requireNonNull(constants$16.fwprintf$MH,"fwprintf"); + } + public static int fwprintf ( Addressable x0, Addressable x1, Object... x2) { + var mh$ = fwprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle wprintf$MH() { + return RuntimeHelper.requireNonNull(constants$16.wprintf$MH,"wprintf"); + } + public static int wprintf ( Addressable x0, Object... x1) { + var mh$ = wprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle vfwprintf$MH() { + return RuntimeHelper.requireNonNull(constants$16.vfwprintf$MH,"vfwprintf"); + } + public static int vfwprintf ( Addressable x0, Addressable x1, Addressable x2) { + var mh$ = vfwprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle vwprintf$MH() { + return RuntimeHelper.requireNonNull(constants$16.vwprintf$MH,"vwprintf"); + } + public static int vwprintf ( Addressable x0, Addressable x1) { + var mh$ = vwprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _snwprintf$MH() { + return RuntimeHelper.requireNonNull(constants$17._snwprintf$MH,"_snwprintf"); + } + public static int _snwprintf ( Addressable x0, long x1, Addressable x2, Object... x3) { + var mh$ = _snwprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2, x3); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _vscwprintf$MH() { + return RuntimeHelper.requireNonNull(constants$17._vscwprintf$MH,"_vscwprintf"); + } + public static int _vscwprintf ( Addressable x0, Addressable x1) { + var mh$ = _vscwprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _vsnwprintf$MH() { + return RuntimeHelper.requireNonNull(constants$17._vsnwprintf$MH,"_vsnwprintf"); + } + public static int _vsnwprintf ( Addressable x0, long x1, Addressable x2, Addressable x3) { + var mh$ = _vsnwprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2, x3); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fwscanf$MH() { + return RuntimeHelper.requireNonNull(constants$17.fwscanf$MH,"fwscanf"); + } + public static int fwscanf ( Addressable x0, Addressable x1, Object... x2) { + var mh$ = fwscanf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle wscanf$MH() { + return RuntimeHelper.requireNonNull(constants$17.wscanf$MH,"wscanf"); + } + public static int wscanf ( Addressable x0, Object... x1) { + var mh$ = wscanf$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle swscanf$MH() { + return RuntimeHelper.requireNonNull(constants$17.swscanf$MH,"swscanf"); + } + public static int swscanf ( Addressable x0, Addressable x1, Object... x2) { + var mh$ = swscanf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fgetwc$MH() { + return RuntimeHelper.requireNonNull(constants$18.fgetwc$MH,"fgetwc"); + } + public static short fgetwc ( Addressable x0) { + var mh$ = fgetwc$MH(); + try { + return (short)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fputwc$MH() { + return RuntimeHelper.requireNonNull(constants$18.fputwc$MH,"fputwc"); + } + public static short fputwc ( short x0, Addressable x1) { + var mh$ = fputwc$MH(); + try { + return (short)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle ungetwc$MH() { + return RuntimeHelper.requireNonNull(constants$18.ungetwc$MH,"ungetwc"); + } + public static short ungetwc ( short x0, Addressable x1) { + var mh$ = ungetwc$MH(); + try { + return (short)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle swprintf$MH() { + return RuntimeHelper.requireNonNull(constants$18.swprintf$MH,"swprintf"); + } + public static int swprintf ( Addressable x0, Addressable x1, Object... x2) { + var mh$ = swprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle vswprintf$MH() { + return RuntimeHelper.requireNonNull(constants$18.vswprintf$MH,"vswprintf"); + } + public static int vswprintf ( Addressable x0, Addressable x1, Addressable x2) { + var mh$ = vswprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle snwprintf$MH() { + return RuntimeHelper.requireNonNull(constants$18.snwprintf$MH,"snwprintf"); + } + public static int snwprintf ( Addressable x0, long x1, Addressable x2, Object... x3) { + var mh$ = snwprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2, x3); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle vsnwprintf$MH() { + return RuntimeHelper.requireNonNull(constants$19.vsnwprintf$MH,"vsnwprintf"); + } + public static int vsnwprintf ( Addressable x0, long x1, Addressable x2, Addressable x3) { + var mh$ = vsnwprintf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2, x3); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle vwscanf$MH() { + return RuntimeHelper.requireNonNull(constants$19.vwscanf$MH,"vwscanf"); + } + public static int vwscanf ( Addressable x0, Addressable x1) { + var mh$ = vwscanf$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle vfwscanf$MH() { + return RuntimeHelper.requireNonNull(constants$19.vfwscanf$MH,"vfwscanf"); + } + public static int vfwscanf ( Addressable x0, Addressable x1, Addressable x2) { + var mh$ = vfwscanf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle vswscanf$MH() { + return RuntimeHelper.requireNonNull(constants$19.vswscanf$MH,"vswscanf"); + } + public static int vswscanf ( Addressable x0, Addressable x1, Addressable x2) { + var mh$ = vswscanf$MH(); + try { + return (int)mh$.invokeExact(x0, x1, x2); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _fgetwchar$MH() { + return RuntimeHelper.requireNonNull(constants$19._fgetwchar$MH,"_fgetwchar"); + } + public static short _fgetwchar () { + var mh$ = _fgetwchar$MH(); + try { + return (short)mh$.invokeExact(); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _fputwchar$MH() { + return RuntimeHelper.requireNonNull(constants$19._fputwchar$MH,"_fputwchar"); + } + public static short _fputwchar ( short x0) { + var mh$ = _fputwchar$MH(); + try { + return (short)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _getw$MH() { + return RuntimeHelper.requireNonNull(constants$20._getw$MH,"_getw"); + } + public static int _getw ( Addressable x0) { + var mh$ = _getw$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle _putw$MH() { + return RuntimeHelper.requireNonNull(constants$20._putw$MH,"_putw"); + } + public static int _putw ( int x0, Addressable x1) { + var mh$ = _putw$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fgetwchar$MH() { + return RuntimeHelper.requireNonNull(constants$20.fgetwchar$MH,"fgetwchar"); + } + public static short fgetwchar () { + var mh$ = fgetwchar$MH(); + try { + return (short)mh$.invokeExact(); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle fputwchar$MH() { + return RuntimeHelper.requireNonNull(constants$20.fputwchar$MH,"fputwchar"); + } + public static short fputwchar ( short x0) { + var mh$ = fputwchar$MH(); + try { + return (short)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle getw$MH() { + return RuntimeHelper.requireNonNull(constants$20.getw$MH,"getw"); + } + public static int getw ( Addressable x0) { + var mh$ = getw$MH(); + try { + return (int)mh$.invokeExact(x0); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static MethodHandle putw$MH() { + return RuntimeHelper.requireNonNull(constants$20.putw$MH,"putw"); + } + public static int putw ( int x0, Addressable x1) { + var mh$ = putw$MH(); + try { + return (int)mh$.invokeExact(x0, x1); + } catch (Throwable ex$) { + throw new AssertionError("should not reach here", ex$); + } + } + public static int __MINGW32_VERSION() { + return (int)5000002L; + } + public static int __MSVCRT_VERSION__() { + return (int)1536L; + } + public static int __W32API_VERSION() { + return (int)5000002L; + } + public static int OSVERSION_MASK() { + return (int)4294901760L; + } + public static int NTDDI_WIN2K() { + return (int)83886080L; + } + public static int NTDDI_WIN2KSP1() { + return (int)83886336L; + } + public static int NTDDI_WIN2KSP2() { + return (int)83886592L; + } + public static int NTDDI_WIN2KSP3() { + return (int)83886848L; + } + public static int NTDDI_WIN2KSP4() { + return (int)83887104L; + } + public static int NTDDI_WINXP() { + return (int)83951616L; + } + public static int NTDDI_WINXPSP1() { + return (int)83951872L; + } + public static int NTDDI_WINXPSP2() { + return (int)83952128L; + } + public static int NTDDI_WINXPSP3() { + return (int)83952384L; + } + public static int NTDDI_WS03() { + return (int)84017152L; + } + public static int NTDDI_WS03SP1() { + return (int)84017408L; + } + public static int NTDDI_WS03SP2() { + return (int)84017664L; + } + public static int NTDDI_VISTA() { + return (int)100663296L; + } + public static int NTDDI_VISTASP1() { + return (int)100663552L; + } + public static int NTDDI_VISTASP2() { + return (int)100663808L; + } + public static int NTDDI_LONGHORN() { + return (int)100663296L; + } + public static int NTDDI_WIN6() { + return (int)100663296L; + } + public static int NTDDI_WIN6SP1() { + return (int)100663552L; + } + public static int NTDDI_WIN6SP2() { + return (int)100663808L; + } + public static int NTDDI_WS08() { + return (int)100663552L; + } + public static int NTDDI_WIN7() { + return (int)100728832L; + } + public static int NTDDI_WIN8() { + return (int)100794368L; + } + public static int NTDDI_WINBLUE() { + return (int)100859904L; + } + public static int _WIN32_WINNT() { + return (int)1280L; + } + public static int WINVER() { + return (int)1280L; + } + public static int NTDDI_VERSION() { + return (int)83886080L; + } + public static int Windows95() { + return (int)1024L; + } + public static int Windows98() { + return (int)1040L; + } + public static int WindowsME() { + return (int)1168L; + } + public static int WindowsNT4() { + return (int)1024L; + } + public static int Windows2000() { + return (int)1280L; + } + public static int WindowsXP() { + return (int)1281L; + } + public static int Windows2003() { + return (int)1282L; + } + public static int WindowsVista() { + return (int)1536L; + } + public static int IE3() { + return (int)768L; + } + public static int IE301() { + return (int)769L; + } + public static int IE302() { + return (int)770L; + } + public static int IE4() { + return (int)1024L; + } + public static int IE401() { + return (int)1025L; + } + public static int IE5() { + return (int)1280L; + } + public static int IE5a() { + return (int)1280L; + } + public static int IE5b() { + return (int)1280L; + } + public static int IE501() { + return (int)1281L; + } + public static int IE55() { + return (int)1360L; + } + public static int IE56() { + return (int)1376L; + } + public static int IE6() { + return (int)1536L; + } + public static int IE601() { + return (int)1537L; + } + public static int IE602() { + return (int)1539L; + } + public static int IE7() { + return (int)1792L; + } + public static byte __CRT_GLOB_ESCAPE_CHAR__() { + return (byte)127L; + } + public static long __MINGW_ANSI_STDIO__() { + return 1L; + } + public static long __MINGW_LC_EXTENSIONS__() { + return 80L; + } + public static long __MINGW_LC_MESSAGES__() { + return 16L; + } + public static long __MINGW_LC_ENVVARS__() { + return 64L; + } + public static int _POSIX_C_SOURCE() { + return (int)200809L; + } + public static MemoryAddress NULL() { + return constants$21.NULL$ADDR; + } + public static int EOF() { + return (int)-1L; + } + public static int FILENAME_MAX() { + return (int)260L; + } + public static int FOPEN_MAX() { + return (int)20L; + } + public static MemorySegment _P_tmpdir() { + return constants$21._P_tmpdir$SEGMENT; + } + public static MemorySegment P_tmpdir() { + return constants$21.P_tmpdir$SEGMENT; + } + public static MemorySegment _wP_tmpdir() { + return constants$21._wP_tmpdir$SEGMENT; + } + public static int L_tmpnam() { + return (int)16L; + } + public static int _MSVC_PRINTF_QUIRKS() { + return (int)256L; + } + public static int _QUERY_MSVC_PRINTF_QUIRKS() { + return (int)4294967295L; + } + public static int _DISABLE_MSVC_PRINTF_QUIRKS() { + return (int)4294967039L; + } + public static int _ENABLE_MSVC_PRINTF_QUIRKS() { + return (int)4294967295L; + } + public static int _EXPONENT_DIGIT_MASK() { + return (int)1L; + } +} + + diff --git a/java-panama/src/main/resources/hello.c b/java-panama/src/main/resources/hello.c new file mode 100644 index 0000000000..3f2d3fce6a --- /dev/null +++ b/java-panama/src/main/resources/hello.c @@ -0,0 +1,5 @@ +#include +int main() { + printf("Hello World from Project Panama Baeldung Article"); + return 0; +} \ No newline at end of file From 9b94733b9a648f23c57b34276db619aad899466d Mon Sep 17 00:00:00 2001 From: apeterlic Date: Wed, 8 Feb 2023 14:18:42 +0100 Subject: [PATCH 420/592] BAEL-5864 - Getting the Current ApplicationContext in Spring (#13433) --- .../ApplicationContextProvider.java | 20 ++++++++++++ .../applicationcontext/ItemService.java | 11 +++++++ .../baeldung/applicationcontext/MyBean.java | 17 ++++++++++ .../ApplicationContextProviderUnitTest.java | 32 +++++++++++++++++++ .../applicationcontext/MyBeanUnitTest.java | 28 ++++++++++++++++ .../applicationcontext/TestContextConfig.java | 11 +++++++ 6 files changed, 119 insertions(+) create mode 100644 spring-core-6/src/main/java/com/baeldung/applicationcontext/ApplicationContextProvider.java create mode 100644 spring-core-6/src/main/java/com/baeldung/applicationcontext/ItemService.java create mode 100644 spring-core-6/src/main/java/com/baeldung/applicationcontext/MyBean.java create mode 100644 spring-core-6/src/test/java/com/baeldung/applicationcontext/ApplicationContextProviderUnitTest.java create mode 100644 spring-core-6/src/test/java/com/baeldung/applicationcontext/MyBeanUnitTest.java create mode 100644 spring-core-6/src/test/java/com/baeldung/applicationcontext/TestContextConfig.java diff --git a/spring-core-6/src/main/java/com/baeldung/applicationcontext/ApplicationContextProvider.java b/spring-core-6/src/main/java/com/baeldung/applicationcontext/ApplicationContextProvider.java new file mode 100644 index 0000000000..260620ff48 --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/applicationcontext/ApplicationContextProvider.java @@ -0,0 +1,20 @@ +package com.baeldung.applicationcontext; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +@Component +public class ApplicationContextProvider implements ApplicationContextAware { + private static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + ApplicationContextProvider.applicationContext = applicationContext; + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } +} \ No newline at end of file diff --git a/spring-core-6/src/main/java/com/baeldung/applicationcontext/ItemService.java b/spring-core-6/src/main/java/com/baeldung/applicationcontext/ItemService.java new file mode 100644 index 0000000000..344ea3af0f --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/applicationcontext/ItemService.java @@ -0,0 +1,11 @@ +package com.baeldung.applicationcontext; + +import org.springframework.stereotype.Service; + +@Service +public class ItemService { + + public String getItem(){ + return "New Item"; + } +} diff --git a/spring-core-6/src/main/java/com/baeldung/applicationcontext/MyBean.java b/spring-core-6/src/main/java/com/baeldung/applicationcontext/MyBean.java new file mode 100644 index 0000000000..95be3375c7 --- /dev/null +++ b/spring-core-6/src/main/java/com/baeldung/applicationcontext/MyBean.java @@ -0,0 +1,17 @@ +package com.baeldung.applicationcontext; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +@Component +public class MyBean { + + @Autowired + private ApplicationContext applicationContext; + + public ApplicationContext getApplicationContext() { + return applicationContext; + } + +} diff --git a/spring-core-6/src/test/java/com/baeldung/applicationcontext/ApplicationContextProviderUnitTest.java b/spring-core-6/src/test/java/com/baeldung/applicationcontext/ApplicationContextProviderUnitTest.java new file mode 100644 index 0000000000..3c3053e61c --- /dev/null +++ b/spring-core-6/src/test/java/com/baeldung/applicationcontext/ApplicationContextProviderUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.applicationcontext; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@ContextConfiguration(classes = TestContextConfig.class) +@ExtendWith(SpringExtension.class) +class ApplicationContextProviderUnitTest { + + @Test + void whenGetApplicationContext_thenReturnApplicationContext() { + ApplicationContext context = ApplicationContextProvider.getApplicationContext(); + assertNotNull(context); + System.out.printf("ApplicationContext has %d beans %n", context.getBeanDefinitionCount()); + } + + @Test + void whenGetBean_thenReturnItemServiceReference() { + ApplicationContext context = ApplicationContextProvider.getApplicationContext(); + assertNotNull(context); + + ItemService itemService = context.getBean(ItemService.class); + assertNotNull(context); + + System.out.println(itemService.getItem()); + } +} \ No newline at end of file diff --git a/spring-core-6/src/test/java/com/baeldung/applicationcontext/MyBeanUnitTest.java b/spring-core-6/src/test/java/com/baeldung/applicationcontext/MyBeanUnitTest.java new file mode 100644 index 0000000000..bff04c2d20 --- /dev/null +++ b/spring-core-6/src/test/java/com/baeldung/applicationcontext/MyBeanUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.applicationcontext; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@ContextConfiguration(classes = TestContextConfig.class) +@ExtendWith(SpringExtension.class) +class MyBeanUnitTest { + + @Autowired + MyBean myBean; + + @Test + void whenGetApplicationContext_thenReturnApplicationContext() { + assertNotNull(myBean); + ApplicationContext context = myBean.getApplicationContext(); + assertNotNull(context); + + System.out.printf("ApplicationContext has %d beans %n", context.getBeanDefinitionCount()); + } + +} \ No newline at end of file diff --git a/spring-core-6/src/test/java/com/baeldung/applicationcontext/TestContextConfig.java b/spring-core-6/src/test/java/com/baeldung/applicationcontext/TestContextConfig.java new file mode 100644 index 0000000000..257500a00f --- /dev/null +++ b/spring-core-6/src/test/java/com/baeldung/applicationcontext/TestContextConfig.java @@ -0,0 +1,11 @@ +package com.baeldung.applicationcontext; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan("com.baeldung.applicationcontext") +public class TestContextConfig { + + +} From 940cc28ef5085691f36aa96ad312a97a1b54a175 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Wed, 8 Feb 2023 18:17:09 +0200 Subject: [PATCH 421/592] JAVA-17333 Update Java Timer Article (#13423) * JAVA-17333 Update Java Timer Article * JAVA-17333 Rename the test class --------- Co-authored-by: timis1 --- .../main/java/com/baeldung/timer/NewsletterTask.java | 12 ++++++++++++ ...itTest.java => NewsletterTaskUnitManualTest.java} | 10 +++------- 2 files changed, 15 insertions(+), 7 deletions(-) rename core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/timer/{NewsletterTaskUnitTest.java => NewsletterTaskUnitManualTest.java} (76%) diff --git a/core-java-modules/core-java-time-measurements/src/main/java/com/baeldung/timer/NewsletterTask.java b/core-java-modules/core-java-time-measurements/src/main/java/com/baeldung/timer/NewsletterTask.java index 16dd6c12ff..d99f7acea7 100644 --- a/core-java-modules/core-java-time-measurements/src/main/java/com/baeldung/timer/NewsletterTask.java +++ b/core-java-modules/core-java-time-measurements/src/main/java/com/baeldung/timer/NewsletterTask.java @@ -3,12 +3,24 @@ package com.baeldung.timer; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; +import java.util.Random; import java.util.TimerTask; +import java.util.concurrent.TimeUnit; public class NewsletterTask extends TimerTask { @Override public void run() { System.out.println("Email sent at: " + LocalDateTime.ofInstant(Instant.ofEpochMilli(scheduledExecutionTime()), ZoneId.systemDefault())); + Random random = new Random(); + int value = random.ints(1, 7) + .findFirst() + .getAsInt(); + System.out.println("The duration of sending the mail will took: " + value); + try { + TimeUnit.SECONDS.sleep(value); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } } } diff --git a/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/timer/NewsletterTaskUnitTest.java b/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/timer/NewsletterTaskUnitManualTest.java similarity index 76% rename from core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/timer/NewsletterTaskUnitTest.java rename to core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/timer/NewsletterTaskUnitManualTest.java index ffbe39c2bc..049fc3bf6d 100644 --- a/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/timer/NewsletterTaskUnitTest.java +++ b/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/timer/NewsletterTaskUnitManualTest.java @@ -5,7 +5,7 @@ import org.junit.jupiter.api.Test; import java.util.Timer; -class NewsletterTaskUnitTest { +class NewsletterTaskUnitManualTest { private final Timer timer = new Timer(); @AfterEach @@ -17,17 +17,13 @@ class NewsletterTaskUnitTest { void givenNewsletterTask_whenTimerScheduledEachSecondFixedDelay_thenNewsletterSentEachSecond() throws Exception { timer.schedule(new NewsletterTask(), 0, 1000); - for (int i = 0; i < 3; i++) { - Thread.sleep(1000); - } + Thread.sleep(20000); } @Test void givenNewsletterTask_whenTimerScheduledEachSecondFixedRate_thenNewsletterSentEachSecond() throws Exception { timer.scheduleAtFixedRate(new NewsletterTask(), 0, 1000); - for (int i = 0; i < 3; i++) { - Thread.sleep(1000); - } + Thread.sleep(20000); } } \ No newline at end of file From 221790a93f460fba74c65745176c24c5a161ad60 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 8 Feb 2023 18:05:24 +0000 Subject: [PATCH 422/592] [JAVA-15024] Changed HttpMultipartMode from STRICT to LEGACY (#13446) Co-authored-by: panagiotiskakos --- .../com/baeldung/httpclient/HttpClientMultipartLiveTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java index b5ede3ed60..720049378b 100644 --- a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java +++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpClientMultipartLiveTest.java @@ -124,7 +124,7 @@ class HttpClientMultipartLiveTest { final File file = new File(url2.getPath()); final String message = "This is a multipart post"; final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); - builder.setMode(HttpMultipartMode.STRICT); + builder.setMode(HttpMultipartMode.LEGACY); builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, IMAGEFILENAME); builder.addBinaryBody("upstream", inputStream, ContentType.create("application/zip"), ZIPFILENAME); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); @@ -153,7 +153,7 @@ class HttpClientMultipartLiveTest { final String message = "This is a multipart post"; final byte[] bytes = "binary code".getBytes(); final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); - builder.setMode(HttpMultipartMode.STRICT); + builder.setMode(HttpMultipartMode.LEGACY); builder.addBinaryBody("file", bytes, ContentType.DEFAULT_BINARY, TEXTFILENAME); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); final HttpEntity entity = builder.build(); From 6a7adf631d6baf22fb38e3694a344a5c8205fac2 Mon Sep 17 00:00:00 2001 From: Dmitriy Budim <46810751+dbudim@users.noreply.github.com> Date: Wed, 8 Feb 2023 22:48:26 +0100 Subject: [PATCH 423/592] [Difference Between Class.forName() and Class.forName().newInstance()] sample code (#13451) --- .../baeldung/loadclass/MyClassForLoad.java | 8 +++++ .../baeldung/loadclass/LoadClassUnitTest.java | 30 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 core-java-modules/core-java/src/main/java/com/baeldung/loadclass/MyClassForLoad.java create mode 100644 core-java-modules/core-java/src/test/java/com/baeldung/loadclass/LoadClassUnitTest.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/loadclass/MyClassForLoad.java b/core-java-modules/core-java/src/main/java/com/baeldung/loadclass/MyClassForLoad.java new file mode 100644 index 0000000000..e97848fb1f --- /dev/null +++ b/core-java-modules/core-java/src/main/java/com/baeldung/loadclass/MyClassForLoad.java @@ -0,0 +1,8 @@ +package com.baeldung.loadclass; + + +public class MyClassForLoad { + + private String data = "some data"; + +} diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/loadclass/LoadClassUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/loadclass/LoadClassUnitTest.java new file mode 100644 index 0000000000..1f7eb139a2 --- /dev/null +++ b/core-java-modules/core-java/src/test/java/com/baeldung/loadclass/LoadClassUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.loadclass; + +import org.junit.jupiter.api.Test; + +import java.lang.reflect.InvocationTargetException; + +import static org.junit.jupiter.api.Assertions.assertInstanceOf; + + +public class LoadClassUnitTest { + + @Test + public void whenUseClassForName_createdInstanceOfClassClass() throws ClassNotFoundException { + Class instance = Class.forName("com.baeldung.loadclass.MyClassForLoad"); + assertInstanceOf(Class.class, instance, "instance should be of Class.class"); + } + + @Test + public void whenUseClassForNameWithNewInstance_createdInstanceOfTargetClas() throws ClassNotFoundException, InstantiationException, IllegalAccessException { + Object instance = Class.forName("com.baeldung.loadclass.MyClassForLoad").newInstance(); + assertInstanceOf(MyClassForLoad.class, instance, "instance should be of MyClassForLoad class"); + } + + @Test + public void whenUseClassForNameWithDeclaredConstructor_newInstanceCreatedInstanceOfTargetClas() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { + Object instance = Class.forName("com.baeldung.loadclass.MyClassForLoad").getDeclaredConstructor().newInstance(); + assertInstanceOf(MyClassForLoad.class, instance, "instance should be of MyClassForLoad class"); + } + +} From 66ebab819ee2a702c9658c9e584b9e2a1bd5bffd Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 9 Feb 2023 07:13:07 +0800 Subject: [PATCH 424/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-array-list/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-array-list/README.md b/core-java-modules/core-java-collections-array-list/README.md index 53568ca98a..e3d41d8f88 100644 --- a/core-java-modules/core-java-collections-array-list/README.md +++ b/core-java-modules/core-java-collections-array-list/README.md @@ -12,3 +12,4 @@ This module contains articles about the Java ArrayList collection - [Case-Insensitive Searching in ArrayList](https://www.baeldung.com/java-arraylist-case-insensitive-search) - [Storing Data Triple in a List in Java](https://www.baeldung.com/java-list-storing-triple) - [Convert an ArrayList of Object to an ArrayList of String Elements](https://www.baeldung.com/java-object-list-to-strings) +- [Initialize an ArrayList with Zeroes or Null in Java](https://www.baeldung.com/java-arraylist-with-zeroes-or-null) From ada858078f587c6dff77f8722bac8a86bed4fa24 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 9 Feb 2023 07:18:14 +0800 Subject: [PATCH 425/592] Update README.md [skip ci] --- core-java-modules/core-java-numbers-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-numbers-5/README.md b/core-java-modules/core-java-numbers-5/README.md index 34651c8e6c..fcc3d55dd9 100644 --- a/core-java-modules/core-java-numbers-5/README.md +++ b/core-java-modules/core-java-numbers-5/README.md @@ -8,3 +8,4 @@ - [Creating Random Numbers With No Duplicates in Java](https://www.baeldung.com/java-unique-random-numbers) - [Multiply a BigDecimal by an Integer in Java](https://www.baeldung.com/java-bigdecimal-multiply-integer) - [Check if an Integer Value is null or Zero in Java](https://www.baeldung.com/java-check-integer-null-or-zero) +- [Return Absolute Difference of Two Integers in Java](https://www.baeldung.com/java-absolute-difference-of-two-integers) From 091c6e3d5c9b18b9a1368982a26cad48f817ac3f Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 9 Feb 2023 07:21:16 +0800 Subject: [PATCH 426/592] Update README.md [skip ci] --- pdf/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/pdf/README.md b/pdf/README.md index dd6931ba78..2a9a23a804 100644 --- a/pdf/README.md +++ b/pdf/README.md @@ -8,3 +8,4 @@ This module contains articles about PDF files. - [Generating PDF Files Using Thymeleaf](https://www.baeldung.com/thymeleaf-generate-pdf) - [Java Convert PDF to Base64](https://www.baeldung.com/java-convert-pdf-to-base64) - [HTML to PDF Using OpenPDF](https://www.baeldung.com/java-html-to-pdf) +- [Reading PDF File Using Java](https://www.baeldung.com/java-pdf-file-read) From bc0ecd511816c0e098d1f1bdbb7b7fc338304ce6 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 9 Feb 2023 07:26:39 +0800 Subject: [PATCH 427/592] Update README.md [skip ci] --- testing-modules/junit-5-advanced/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/junit-5-advanced/README.md b/testing-modules/junit-5-advanced/README.md index 16509b75bf..9b3a5fa299 100644 --- a/testing-modules/junit-5-advanced/README.md +++ b/testing-modules/junit-5-advanced/README.md @@ -7,3 +7,4 @@ - [Run JUnit Test Cases From the Command Line](https://www.baeldung.com/junit-run-from-command-line) - [Parallel Test Execution for JUnit 5](https://www.baeldung.com/junit-5-parallel-tests) - [JUnit – Testing Methods That Call System.exit()](https://www.baeldung.com/junit-system-exit) +- [Single Assert Call for Multiple Properties in Java Unit Testing](https://www.baeldung.com/java-testing-single-assert-multiple-properties) From 3a82caa5b6a15203c3d2eb3e9971e3c93068aa4d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 9 Feb 2023 07:31:37 +0800 Subject: [PATCH 428/592] Update README.md [skip ci] --- jmeter/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jmeter/README.md b/jmeter/README.md index 76d329342d..f01fa4eca5 100644 --- a/jmeter/README.md +++ b/jmeter/README.md @@ -55,3 +55,4 @@ Enjoy it :) - [Write Extracted Data to a File Using JMeter](https://www.baeldung.com/jmeter-write-to-file) - [Basic Authentication in JMeter](https://www.baeldung.com/jmeter-basic-auth) - [JMeter: Latency vs. Load Time](https://www.baeldung.com/java-jmeter-latency-vs-load-time) +- [How Do I Generate a Dashboard Report in JMeter?](https://www.baeldung.com/jmeter-dashboard-report) From 220a73e43b9c02fe86db24aa4e4ccc0b75204fb9 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 9 Feb 2023 07:51:27 +0800 Subject: [PATCH 429/592] Update README.md [skip ci] --- core-java-modules/core-java-networking-4/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-networking-4/README.md b/core-java-modules/core-java-networking-4/README.md index 5f0958fae0..daec647ebe 100644 --- a/core-java-modules/core-java-networking-4/README.md +++ b/core-java-modules/core-java-networking-4/README.md @@ -1,3 +1,4 @@ ## Relevant Articles: - [Difference Between URI.create() and new URI()](https://www.baeldung.com/java-uri-create-and-new-uri) -- [Validating URL in Java](https://www.baeldung.com/java-validate-url) \ No newline at end of file +- [Validating URL in Java](https://www.baeldung.com/java-validate-url) +- [Validating IPv4 Address in Java](https://www.baeldung.com/java-validate-ipv4-address) From a9a80b292a1d4fec5860ef1044425ee523ac5482 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 9 Feb 2023 07:54:56 +0800 Subject: [PATCH 430/592] Create README.md [skip ci] --- spring-cloud-modules/spring-cloud-open-telemetry/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 spring-cloud-modules/spring-cloud-open-telemetry/README.md diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/README.md b/spring-cloud-modules/spring-cloud-open-telemetry/README.md new file mode 100644 index 0000000000..4a24159982 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-open-telemetry/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [OpenTelemetry Setup in Spring Boot Application](https://www.baeldung.com/spring-boot-opentelemetry-setup) From a621e30de608444ddf469568832d43cc311ac355 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 9 Feb 2023 08:01:56 +0800 Subject: [PATCH 431/592] Update README.md [skip ci] --- core-java-modules/core-java-streams-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-streams-4/README.md b/core-java-modules/core-java-streams-4/README.md index 8e5e0652ef..b0b42324d6 100644 --- a/core-java-modules/core-java-streams-4/README.md +++ b/core-java-modules/core-java-streams-4/README.md @@ -7,3 +7,4 @@ - [Finding Max Date in List Using Streams](https://www.baeldung.com/java-max-date-list-streams) - [Batch Processing of Stream Data in Java](https://www.baeldung.com/java-stream-batch-processing) - [Stream to Iterable in Java](https://www.baeldung.com/java-stream-to-iterable) +- [Understanding the Difference Between Stream.of() and IntStream.range()](https://www.baeldung.com/java-stream-of-and-intstream-range) From bfb2b1b9f42f5737b795f403eb6b073a9775511a Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Thu, 9 Feb 2023 01:58:28 -0300 Subject: [PATCH 432/592] BAEL-6119: Difference Between findBy and findAllBy in Spring Data JPA (#13344) * player entity and repository. test structure * moving modules * test findFirst. cleanups. * adding @Repository * player entity and repository. test structure * moving modules * test findFirst. cleanups. * adding @Repository * changing module * adding show-sql config * removing unrelated change * properties SB annotation --- .../FindByVsFindAllByApplication.java | 11 +++++ .../findbyvsfindallby/model/Player.java | 43 +++++++++++++++++ .../repository/PlayerRepository.java | 17 +++++++ .../FindByVsFindAllByIntegrationTest.java | 46 +++++++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/findbyvsfindallby/FindByVsFindAllByApplication.java create mode 100644 persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/findbyvsfindallby/model/Player.java create mode 100644 persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/findbyvsfindallby/repository/PlayerRepository.java create mode 100644 persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/findbyvsfindallby/FindByVsFindAllByIntegrationTest.java diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/findbyvsfindallby/FindByVsFindAllByApplication.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/findbyvsfindallby/FindByVsFindAllByApplication.java new file mode 100644 index 0000000000..c9757e2f04 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/findbyvsfindallby/FindByVsFindAllByApplication.java @@ -0,0 +1,11 @@ +package com.baeldung.spring.data.persistence.findbyvsfindallby; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class FindByVsFindAllByApplication { + public static void main(String[] args) { + SpringApplication.run(FindByVsFindAllByApplication.class, args); + } +} diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/findbyvsfindallby/model/Player.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/findbyvsfindallby/model/Player.java new file mode 100644 index 0000000000..0d8f833b4c --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/findbyvsfindallby/model/Player.java @@ -0,0 +1,43 @@ +package com.baeldung.spring.data.persistence.findbyvsfindallby.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import java.util.Objects; + +@Entity +public class Player { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + private Integer score; + + public Player(Integer score) { + this.score = score; + } + + public Player() { + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Integer getScore() { + return score; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Player player = (Player) o; + return id == player.id && Objects.equals(score, player.score); + } +} diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/findbyvsfindallby/repository/PlayerRepository.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/findbyvsfindallby/repository/PlayerRepository.java new file mode 100644 index 0000000000..6b0d1c6e5d --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/findbyvsfindallby/repository/PlayerRepository.java @@ -0,0 +1,17 @@ +package com.baeldung.spring.data.persistence.findbyvsfindallby.repository; + +import com.baeldung.spring.data.persistence.findbyvsfindallby.model.Player; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface PlayerRepository extends JpaRepository { + List findByScoreGreaterThan(Integer target); + + List findAllByScoreGreaterThan(Integer target); + + Optional findFirstByScoreGreaterThan(Integer target); +} diff --git a/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/findbyvsfindallby/FindByVsFindAllByIntegrationTest.java b/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/findbyvsfindallby/FindByVsFindAllByIntegrationTest.java new file mode 100644 index 0000000000..add340b4dd --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/findbyvsfindallby/FindByVsFindAllByIntegrationTest.java @@ -0,0 +1,46 @@ +package com.baeldung.spring.data.persistence.findbyvsfindallby; + +import com.baeldung.spring.data.persistence.findbyvsfindallby.model.Player; +import com.baeldung.spring.data.persistence.findbyvsfindallby.repository.PlayerRepository; +import org.junit.Before; +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 java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = FindByVsFindAllByApplication.class, properties = "spring.jpa.show-sql=true") +public class FindByVsFindAllByIntegrationTest { + @Autowired + private PlayerRepository playerRepository; + + @Before + public void setup() { + Player player1 = new Player(600); + Player player2 = new Player(500); + Player player3 = new Player(300); + playerRepository.saveAll(Arrays.asList(player1, player2, player3)); + } + + @Test + public void givenSavedPlayer_whenUseFindByOrFindAllBy_thenReturnSameResult() { + List findByPlayers = playerRepository.findByScoreGreaterThan(400); + List findAllByPlayers = playerRepository.findAllByScoreGreaterThan(400); + assertEquals(findByPlayers, findAllByPlayers); + } + + @Test + public void givenSavedPlayer_whenUseFindFirst_thenReturnSingleResult() { + Optional player = playerRepository.findFirstByScoreGreaterThan(400); + assertTrue(player.isPresent()); + assertEquals(600, player.get().getScore()); + } +} From e48229dc255b7615ac9da048dc54e1283643f8ea Mon Sep 17 00:00:00 2001 From: Arya <108480101+drafii@users.noreply.github.com> Date: Thu, 9 Feb 2023 20:58:24 +0300 Subject: [PATCH 433/592] Record vs Final class in Java (#13455) * Added code for record vs final. * Fixed a small mistake. --- .../java14/recordvsfinal/USCitizen.java | 18 +++++++++++++ .../recordvsfinal/USCitizenUnitTest.java | 26 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvsfinal/USCitizen.java create mode 100644 core-java-modules/core-java-14/src/test/java/com/baeldung/java14/recordvsfinal/USCitizenUnitTest.java diff --git a/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvsfinal/USCitizen.java b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvsfinal/USCitizen.java new file mode 100644 index 0000000000..9ff3676ae7 --- /dev/null +++ b/core-java-modules/core-java-14/src/main/java/com/baeldung/java14/recordvsfinal/USCitizen.java @@ -0,0 +1,18 @@ +package com.baeldung.java14.recordvsfinal; + +public record USCitizen(String firstName, String lastName, String address) { + static int countryCode; + + // static initializer + static { + countryCode = 1; + } + + public static int getCountryCode() { + return countryCode; + } + + public String getFullName() { + return firstName + " " + lastName; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/recordvsfinal/USCitizenUnitTest.java b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/recordvsfinal/USCitizenUnitTest.java new file mode 100644 index 0000000000..bb4c16b500 --- /dev/null +++ b/core-java-modules/core-java-14/src/test/java/com/baeldung/java14/recordvsfinal/USCitizenUnitTest.java @@ -0,0 +1,26 @@ +package com.baeldung.java14.recordvsfinal; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class USCitizenUnitTest { + + @Test + public void givenName_whenGetNameAndCode_thenExpectedValuesReturned() { + + String firstName = "Joan"; + String lastName = "Winn"; + String address = "1892 Black Stallion Road"; + int countryCode = 1; + + USCitizen citizen = new USCitizen(firstName, lastName, address); + + assertEquals(firstName + " " + lastName, citizen.getFullName()); + assertEquals(countryCode, USCitizen.getCountryCode()); + } + +} \ No newline at end of file From a43afaccc951bf1ad1093d3b179cf26a77b461ce Mon Sep 17 00:00:00 2001 From: Avin Buricha Date: Thu, 9 Feb 2023 23:40:24 +0530 Subject: [PATCH 434/592] BAEL-6072 | Create Dynamic Queues in RabbitMQ (#13301) * BAEL-6072 | Article code * Code changes as per editor review * Test cases updated * Removed unused imports * Updated test case --- .../queue/dynamic/DynamicQueueCreation.java | 34 +++++++++ .../dynamic/DynamicQueueCreationLiveTest.java | 71 +++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 messaging-modules/rabbitmq/src/main/java/com/baeldung/queue/dynamic/DynamicQueueCreation.java create mode 100644 messaging-modules/rabbitmq/src/test/java/com/baeldung/benchmark/queue/dynamic/DynamicQueueCreationLiveTest.java diff --git a/messaging-modules/rabbitmq/src/main/java/com/baeldung/queue/dynamic/DynamicQueueCreation.java b/messaging-modules/rabbitmq/src/main/java/com/baeldung/queue/dynamic/DynamicQueueCreation.java new file mode 100644 index 0000000000..f62660bf81 --- /dev/null +++ b/messaging-modules/rabbitmq/src/main/java/com/baeldung/queue/dynamic/DynamicQueueCreation.java @@ -0,0 +1,34 @@ +package com.baeldung.queue.dynamic; + +import java.io.IOException; +import java.util.concurrent.TimeoutException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.rabbitmq.client.AMQP; +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; + +public class DynamicQueueCreation { + + private static final Logger log = LoggerFactory.getLogger(DynamicQueueCreation.class); + + private static final String QUEUE_NAME = "baeldung-queue"; + + public static void main(String[] args) throws IOException, TimeoutException { + + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost("localhost"); + + try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) { + AMQP.Queue.DeclareOk declareOk = channel.queueDeclare(QUEUE_NAME, true, false, false, null); + log.info(declareOk.getQueue()); + + AMQP.Queue.DeclareOk declareOkExists = channel.queueDeclarePassive(QUEUE_NAME); + log.info(declareOkExists.getQueue()); + } + } + +} diff --git a/messaging-modules/rabbitmq/src/test/java/com/baeldung/benchmark/queue/dynamic/DynamicQueueCreationLiveTest.java b/messaging-modules/rabbitmq/src/test/java/com/baeldung/benchmark/queue/dynamic/DynamicQueueCreationLiveTest.java new file mode 100644 index 0000000000..aa430035ef --- /dev/null +++ b/messaging-modules/rabbitmq/src/test/java/com/baeldung/benchmark/queue/dynamic/DynamicQueueCreationLiveTest.java @@ -0,0 +1,71 @@ +package com.baeldung.benchmark.queue.dynamic; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.io.IOException; +import java.util.concurrent.TimeoutException; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import com.rabbitmq.client.AMQP; +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; + +public class DynamicQueueCreationLiveTest { + + private static final String QUEUE_NAME = "baeldung-queue"; + private static final String QUEUE_NAME_NEW = "baeldung-queue-new"; + + private static Connection connection; + + @BeforeAll + public static void setUpConnection() throws IOException, TimeoutException { + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost("localhost"); + connection = factory.newConnection(); + } + + @Test + void givenQueueName_whenCreatingQueue_thenCheckingIfQueueCreated() throws IOException, TimeoutException { + + try (Channel channel = connection.createChannel()) { + AMQP.Queue.DeclareOk declareOk = channel.queueDeclare(QUEUE_NAME, true, false, false, null); + + assertNotNull(declareOk); + assertEquals(QUEUE_NAME, declareOk.getQueue()); + } + } + + @Test + void givenQueueName_whenCreatingQueue_thenCheckingIfQueueExists() throws IOException, TimeoutException { + + try (Channel channel = connection.createChannel()) { + channel.queueDeclare(QUEUE_NAME, true, false, false, null); + + AMQP.Queue.DeclareOk declareOk = channel.queueDeclarePassive(QUEUE_NAME); + + assertNotNull(declareOk); + assertEquals(QUEUE_NAME, declareOk.getQueue()); + } + } + + @Test + void givenQueueName_whenQueueDoesNotExist_thenCheckingIfQueueExists() throws IOException, TimeoutException { + + try (Channel channel = connection.createChannel()) { + assertThrows(IOException.class, () -> { + channel.queueDeclarePassive(QUEUE_NAME_NEW); + }); + } + } + + @AfterAll + public static void destroyConnection() throws IOException { + connection.close(); + } +} From db4f4732623300f4c961115f1ef052fd6b4e8106 Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Thu, 9 Feb 2023 19:10:51 +0100 Subject: [PATCH 435/592] BAEL-5742: Fix EmptyResultDataAccessException when using Jdbctemplate (#13338) --- .../jdbc/template/testing/EmployeeDAO.java | 25 ++++++++-- .../template/testing/EmployeeDAOUnitTest.java | 47 +++++++++++++++---- 2 files changed, 59 insertions(+), 13 deletions(-) diff --git a/persistence-modules/spring-jdbc/src/main/java/com/baeldung/spring/jdbc/template/testing/EmployeeDAO.java b/persistence-modules/spring-jdbc/src/main/java/com/baeldung/spring/jdbc/template/testing/EmployeeDAO.java index 15da78ce35..77b69daa01 100644 --- a/persistence-modules/spring-jdbc/src/main/java/com/baeldung/spring/jdbc/template/testing/EmployeeDAO.java +++ b/persistence-modules/spring-jdbc/src/main/java/com/baeldung/spring/jdbc/template/testing/EmployeeDAO.java @@ -1,10 +1,12 @@ package com.baeldung.spring.jdbc.template.testing; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Repository; - import javax.sql.DataSource; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + @Repository public class EmployeeDAO { private JdbcTemplate jdbcTemplate; @@ -20,4 +22,21 @@ public class EmployeeDAO { public int getCountOfEmployees() { return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM EMPLOYEE", Integer.class); } + + public Employee getEmployeeById(int id) { + RowMapper employeeRowMapper = (rs, rowNum) -> new Employee(rs.getInt("ID"), rs.getString("FIRST_NAME"), rs.getString("LAST_NAME")); + + return jdbcTemplate.queryForObject("SELECT * FROM EMPLOYEE WHERE id=?", employeeRowMapper, id); + } + + public Employee getEmployeeByIdV2(int id) { + RowMapper employeeRowMapper = (rs, rowNum) -> new Employee(rs.getInt("ID"), rs.getString("FIRST_NAME"), rs.getString("LAST_NAME")); + + try { + return jdbcTemplate.queryForObject("SELECT * FROM EMPLOYEE WHERE id=?", employeeRowMapper, id); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + } \ No newline at end of file diff --git a/persistence-modules/spring-jdbc/src/test/java/com/baeldung/spring/jdbc/template/testing/EmployeeDAOUnitTest.java b/persistence-modules/spring-jdbc/src/test/java/com/baeldung/spring/jdbc/template/testing/EmployeeDAOUnitTest.java index 3609300c2d..982a423996 100644 --- a/persistence-modules/spring-jdbc/src/test/java/com/baeldung/spring/jdbc/template/testing/EmployeeDAOUnitTest.java +++ b/persistence-modules/spring-jdbc/src/test/java/com/baeldung/spring/jdbc/template/testing/EmployeeDAOUnitTest.java @@ -1,20 +1,26 @@ package com.baeldung.spring.jdbc.template.testing; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; + +import javax.sql.DataSource; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import org.springframework.test.util.ReflectionTestUtils; -import javax.sql.DataSource; - -import static org.junit.jupiter.api.Assertions.assertEquals; - @RunWith(MockitoJUnitRunner.class) public class EmployeeDAOUnitTest { @Mock @@ -25,10 +31,10 @@ public class EmployeeDAOUnitTest { @Before public void setup() { dataSource = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2) - .generateUniqueName(true) - .addScript("classpath:com/baeldung/spring/jdbc/template/testing/schema.sql") - .addScript("classpath:com/baeldung/spring/jdbc/template/testing/test-data.sql") - .build(); + .generateUniqueName(true) + .addScript("classpath:com/baeldung/spring/jdbc/template/testing/schema.sql") + .addScript("classpath:com/baeldung/spring/jdbc/template/testing/test-data.sql") + .build(); } @Test @@ -36,12 +42,12 @@ public class EmployeeDAOUnitTest { EmployeeDAO employeeDAO = new EmployeeDAO(); ReflectionTestUtils.setField(employeeDAO, "jdbcTemplate", jdbcTemplate); Mockito.when(jdbcTemplate.queryForObject("SELECT COUNT(*) FROM EMPLOYEE", Integer.class)) - .thenReturn(4); + .thenReturn(4); assertEquals(4, employeeDAO.getCountOfEmployees()); Mockito.when(jdbcTemplate.queryForObject(Mockito.anyString(), Mockito.eq(Integer.class))) - .thenReturn(3); + .thenReturn(3); assertEquals(3, employeeDAO.getCountOfEmployees()); } @@ -53,4 +59,25 @@ public class EmployeeDAOUnitTest { assertEquals(4, employeeDAO.getCountOfEmployees()); } + + @Test(expected = EmptyResultDataAccessException.class) + public void whenIdNotExist_thenThrowEmptyResultDataAccessException() { + EmployeeDAO employeeDAO = new EmployeeDAO(); + ReflectionTestUtils.setField(employeeDAO, "jdbcTemplate", jdbcTemplate); + Mockito.when(jdbcTemplate.queryForObject(anyString(), ArgumentMatchers.> any(), anyInt())) + .thenThrow(EmptyResultDataAccessException.class); + + employeeDAO.getEmployeeById(1); + } + + @Test + public void whenIdNotExist_thenReturnNull() { + EmployeeDAO employeeDAO = new EmployeeDAO(); + ReflectionTestUtils.setField(employeeDAO, "jdbcTemplate", jdbcTemplate); + Mockito.when(jdbcTemplate.queryForObject(anyString(), ArgumentMatchers.> any(), anyInt())) + .thenReturn(null); + + assertNull(employeeDAO.getEmployeeByIdV2(1)); + } + } From 6e3c61380d47368dc79441c1fcb99c02bf1cfa96 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Thu, 9 Feb 2023 20:40:27 +0200 Subject: [PATCH 436/592] JAVA-17327 Fix and enable spring-roo module (#13459) Co-authored-by: timis1 --- spring-roo/pom.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spring-roo/pom.xml b/spring-roo/pom.xml index 94f9eb0c6f..fcfafcdaac 100644 --- a/spring-roo/pom.xml +++ b/spring-roo/pom.xml @@ -11,6 +11,9 @@ spring-roo jar + + + io.spring.platform platform-bom From 5c9dcf7733578d17da1536cd860623d89de19b7f Mon Sep 17 00:00:00 2001 From: Kumar Prabhash Anand Date: Fri, 10 Feb 2023 17:11:06 +0100 Subject: [PATCH 437/592] BAEL-6155 adding quarkus funqy code (#13436) * BAEL-6155 adding quarkus funqy code * BAEL-6155 removed extra files * BAEL-6155 removed unused files * BAEL-6155 updated test naming convention --- quarkus-modules/quarkus-funqy/pom.xml | 128 ++++++++++++++++++ .../src/main/docker/Dockerfile.jvm | 93 +++++++++++++ .../com/baeldung/quarkus/MyFunctions.java | 27 ++++ .../src/main/kubernetes/knative-trigger.yaml | 14 ++ .../src/main/kubernetes/knative.yaml | 11 ++ .../src/main/resources/application.properties | 0 .../baeldung/quarkus/MyFunctionsUnitTest.java | 48 +++++++ 7 files changed, 321 insertions(+) create mode 100644 quarkus-modules/quarkus-funqy/pom.xml create mode 100644 quarkus-modules/quarkus-funqy/src/main/docker/Dockerfile.jvm create mode 100644 quarkus-modules/quarkus-funqy/src/main/java/com/baeldung/quarkus/MyFunctions.java create mode 100644 quarkus-modules/quarkus-funqy/src/main/kubernetes/knative-trigger.yaml create mode 100644 quarkus-modules/quarkus-funqy/src/main/kubernetes/knative.yaml create mode 100644 quarkus-modules/quarkus-funqy/src/main/resources/application.properties create mode 100644 quarkus-modules/quarkus-funqy/src/test/java/com/baeldung/quarkus/MyFunctionsUnitTest.java diff --git a/quarkus-modules/quarkus-funqy/pom.xml b/quarkus-modules/quarkus-funqy/pom.xml new file mode 100644 index 0000000000..95d712b9fa --- /dev/null +++ b/quarkus-modules/quarkus-funqy/pom.xml @@ -0,0 +1,128 @@ + + + 4.0.0 + com.baeldung.quarkus + quarkus-funqy + 1.0.0-SNAPSHOT + + 3.10.1 + false + 17 + UTF-8 + UTF-8 + quarkus-bom + io.quarkus.platform + 2.16.0.Final + 3.0.0-M7 + + + + + ${quarkus.platform.group-id} + ${quarkus.platform.artifact-id} + ${quarkus.platform.version} + pom + import + + + + + + io.quarkus + quarkus-funqy-http + + + io.quarkus + quarkus-arc + + + io.quarkus + quarkus-funqy-knative-events + + + io.quarkus + quarkus-junit5 + test + + + io.rest-assured + rest-assured + test + + + + + + ${quarkus.platform.group-id} + quarkus-maven-plugin + ${quarkus.platform.version} + true + + + + build + generate-code + generate-code-tests + + + + + + maven-compiler-plugin + ${compiler-plugin.version} + + + -parameters + + + + + maven-surefire-plugin + ${surefire-plugin.version} + + + org.jboss.logmanager.LogManager + ${maven.home} + + + + + + + + native + + + native + + + + + + maven-failsafe-plugin + ${surefire-plugin.version} + + + + integration-test + verify + + + + ${project.build.directory}/${project.build.finalName}-runner + org.jboss.logmanager.LogManager + ${maven.home} + + + + + + + + + native + + + + diff --git a/quarkus-modules/quarkus-funqy/src/main/docker/Dockerfile.jvm b/quarkus-modules/quarkus-funqy/src/main/docker/Dockerfile.jvm new file mode 100644 index 0000000000..2119ae0891 --- /dev/null +++ b/quarkus-modules/quarkus-funqy/src/main/docker/Dockerfile.jvm @@ -0,0 +1,93 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./mvnw package +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/quarkus-funqy-project-jvm . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/quarkus-funqy-project-jvm +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005) like this : EXPOSE 8080 5005 +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/quarkus-funqy-project-jvm +# +# This image uses the `run-java.sh` script to run the application. +# This scripts computes the command line to execute your Java application, and +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi8/openjdk-17:1.11 + +ENV LANGUAGE='en_US:en' + + +# We make four distinct layers so if there are application changes the library layers can be re-used +COPY --chown=185 target/quarkus-app/lib/ /deployments/lib/ +COPY --chown=185 target/quarkus-app/*.jar /deployments/ +COPY --chown=185 target/quarkus-app/app/ /deployments/app/ +COPY --chown=185 target/quarkus-app/quarkus/ /deployments/quarkus/ + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" + diff --git a/quarkus-modules/quarkus-funqy/src/main/java/com/baeldung/quarkus/MyFunctions.java b/quarkus-modules/quarkus-funqy/src/main/java/com/baeldung/quarkus/MyFunctions.java new file mode 100644 index 0000000000..cf5f0ce4e4 --- /dev/null +++ b/quarkus-modules/quarkus-funqy/src/main/java/com/baeldung/quarkus/MyFunctions.java @@ -0,0 +1,27 @@ +package com.baeldung.quarkus; + +import org.jboss.logging.Logger; +import io.quarkus.funqy.Funq; + +public class MyFunctions { + private static final Logger log = Logger.getLogger(MyFunctions.class); + @Funq("GreetUser") + public String fun(FunInput input) { + log.info("Function Triggered"); + String name = input != null ? input.name : "Funqy"; + return String.format("Hello %s!", name); + } + public static class FunInput { + public String name; + public FunInput() { } + public FunInput(String name) { + this.name = name; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + } +} diff --git a/quarkus-modules/quarkus-funqy/src/main/kubernetes/knative-trigger.yaml b/quarkus-modules/quarkus-funqy/src/main/kubernetes/knative-trigger.yaml new file mode 100644 index 0000000000..8384fc42c1 --- /dev/null +++ b/quarkus-modules/quarkus-funqy/src/main/kubernetes/knative-trigger.yaml @@ -0,0 +1,14 @@ +apiVersion: eventing.knative.dev/v1 +kind: Trigger +metadata: + name: baeldung-event +spec: + broker: baeldung + filter: + attributes: + type: GreetUser + subscriber: + ref: + apiVersion: serving.knative.dev/v1 + kind: Service + name: quarkus-funqy-project \ No newline at end of file diff --git a/quarkus-modules/quarkus-funqy/src/main/kubernetes/knative.yaml b/quarkus-modules/quarkus-funqy/src/main/kubernetes/knative.yaml new file mode 100644 index 0000000000..4264053c02 --- /dev/null +++ b/quarkus-modules/quarkus-funqy/src/main/kubernetes/knative.yaml @@ -0,0 +1,11 @@ +apiVersion: serving.knative.dev/v1 +kind: Service +metadata: + name: quarkus-funqy-project +spec: + template: + metadata: + name: quarkus-funqy-project-v1 + spec: + containers: + - image: docker.io/<>/quarkus-funqy-project \ No newline at end of file diff --git a/quarkus-modules/quarkus-funqy/src/main/resources/application.properties b/quarkus-modules/quarkus-funqy/src/main/resources/application.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/quarkus-modules/quarkus-funqy/src/test/java/com/baeldung/quarkus/MyFunctionsUnitTest.java b/quarkus-modules/quarkus-funqy/src/test/java/com/baeldung/quarkus/MyFunctionsUnitTest.java new file mode 100644 index 0000000000..c9163c81b1 --- /dev/null +++ b/quarkus-modules/quarkus-funqy/src/test/java/com/baeldung/quarkus/MyFunctionsUnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.quarkus; + +import io.quarkus.test.junit.QuarkusTest; +import io.restassured.RestAssured; +import io.restassured.http.ContentType; +import org.junit.jupiter.api.Test; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.Matchers.containsString; + +import java.util.UUID; + +@QuarkusTest +public class MyFunctionsUnitTest { + + @Test + public void givenFunctionAPI_whenCallWithoutBody_thenShouldReturnDefault() { + given() + .post("/GreetUser") + .then() + .statusCode(200) + .body(containsString("Hello Funqy!")); + } + + @Test + public void givenFunctionAPI_whenCallWithName_thenShouldReturnName() { + given() + .contentType(ContentType.JSON) + .body("{\"name\": \"Friend\"}") + .post("/GreetUser") + .then() + .statusCode(200) + .body(containsString("Hello Friend!")); + } + + @Test + public void givenFunctionAPI_whenCallWithEvent_thenShouldReturn200() { + RestAssured.given().contentType("application/json") + .header("ce-specversion", "1.0") + .header("ce-id", UUID.randomUUID().toString()) + .header("ce-type", "GreetUser") + .header("ce-source", "test") + .body("{ \"name\": \"Baeldung\" }") + .post("/") + .then().statusCode(200); + } + +} \ No newline at end of file From 5fb9fe4642e778d0e0b1fe436ce108510ff6c2a1 Mon Sep 17 00:00:00 2001 From: Roger <587230+rojyates@users.noreply.github.com> Date: Sat, 11 Feb 2023 02:19:24 +1000 Subject: [PATCH 438/592] BAEL-5720 Java HttpClient Connection Management (#13452) * BAEL-5642 Using @NotNull as a method parameter * BAEL-5642 Add Spring Boot and bump spring and hibernate-validator versions * BAEL-5720 Java HttpClient Connection Management * BAEL-5720 Java HttpClient Connection Management * BAEL-5720 move JavaHttpClient test to core-java-httpclient module * BAEL-5720 move jetty-logging-properties to core-java-httpclient module * BAEL-5720 add wiremock to pom * Update pom.xml * Delete jetty-logging.properties --------- Co-authored-by: Loredana Crusoveanu --- apache-httpclient/pom.xml | 2 +- .../core-java-httpclient/pom.xml | 7 + ...ttpClientConnectionManagementUnitTest.java | 147 ++++++++++++++++++ .../test/resources/jetty-logging.properties | 3 + javaxval/pom.xml | 2 +- 5 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/HttpClientConnectionManagementUnitTest.java create mode 100644 core-java-modules/core-java-httpclient/src/test/resources/jetty-logging.properties diff --git a/apache-httpclient/pom.xml b/apache-httpclient/pom.xml index 47dd41dce7..c371d1fc06 100644 --- a/apache-httpclient/pom.xml +++ b/apache-httpclient/pom.xml @@ -120,4 +120,4 @@ 5.2 - \ No newline at end of file + diff --git a/core-java-modules/core-java-httpclient/pom.xml b/core-java-modules/core-java-httpclient/pom.xml index 57b23e96c1..3df0447ff0 100644 --- a/core-java-modules/core-java-httpclient/pom.xml +++ b/core-java-modules/core-java-httpclient/pom.xml @@ -32,6 +32,12 @@ ${assertj.version} test + + com.github.tomakehurst + wiremock + ${wiremock.version} + test + @@ -53,6 +59,7 @@ 11 3.22.0 5.11.2 + 2.27.2 \ No newline at end of file diff --git a/core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/HttpClientConnectionManagementUnitTest.java b/core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/HttpClientConnectionManagementUnitTest.java new file mode 100644 index 0000000000..3b7610276c --- /dev/null +++ b/core-java-modules/core-java-httpclient/src/test/java/com/baeldung/httpclient/HttpClientConnectionManagementUnitTest.java @@ -0,0 +1,147 @@ +package com.baeldung.httpclient.conn; + +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.client.WireMock; +import com.github.tomakehurst.wiremock.core.WireMockConfiguration; +import com.github.tomakehurst.wiremock.stubbing.ServeEvent; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.List; + +import static java.net.URI.create; + + +public class HttpClientConnectionManagementUnitTest { + + WireMockConfiguration firstConfiguration = WireMockConfiguration + .options() + .dynamicPort(); + WireMockConfiguration secondConfiguration = WireMockConfiguration + .options() + .dynamicPort(); + WireMockServer firstServer = new WireMockServer(firstConfiguration); + WireMockServer secondServer = new WireMockServer(secondConfiguration); + private String firstUrl; + private String secondUrl; + + private HttpClient client = HttpClient.newHttpClient(); + private HttpClient secondClient = HttpClient.newHttpClient(); + + private HttpRequest getRequest; + private HttpRequest secondGet; + + @Before + public void setup() { + firstServer.start(); + secondServer.start(); + + // add some request matchers + firstServer.stubFor(WireMock + .get(WireMock.anyUrl()) + .willReturn(WireMock + .aResponse() + .withStatus(200))); + secondServer.stubFor(WireMock + .get(WireMock.anyUrl()) + .willReturn(WireMock + .aResponse() + .withStatus(200))); + + firstUrl = "http://localhost:" + firstServer.port() + "/first"; + secondUrl = "http://localhost:" + secondServer.port() + "/second"; + + getRequest = HttpRequest + .newBuilder() + .uri(create(firstUrl)) + .version(HttpClient.Version.HTTP_1_1) + .build(); + + secondGet = HttpRequest + .newBuilder() + .uri(create(secondUrl)) + .version(HttpClient.Version.HTTP_1_1) + .build(); + } + + @After + public void tearDown() { + // display all the requests that the WireMock servers handled + List firstWiremockAllServeEvents = firstServer.getAllServeEvents(); + List secondWiremockAllServeEvents = secondServer.getAllServeEvents(); + firstWiremockAllServeEvents + .stream() + .map(event -> event + .getRequest() + .getAbsoluteUrl()) + .forEach(System.out::println); + secondWiremockAllServeEvents + .stream() + .map(event -> event + .getRequest() + .getAbsoluteUrl()) + .forEach(System.out::println); + + // stop the WireMock servers + firstServer.stop(); + secondServer.stop(); + } + + // Example 1. Use an HttpClient to connect to the same endpoint - reuses a connection from the internal pool + @Test + public final void givenAnHttpClient_whenTwoConnectionsToSameEndpointMadeSequentially_thenConnectionReused() throws InterruptedException, IOException { + + // given two requests to the same destination + final HttpResponse firstResponse = client.send(getRequest, HttpResponse.BodyHandlers.ofString()); + final HttpResponse secondResponse = client.send(getRequest, HttpResponse.BodyHandlers.ofString()); + + assert (firstResponse.statusCode() == 200) && (secondResponse.statusCode() == 200); + } + + // Example 2. Use separate HttpClients to connect to the same endpoint - creates a connection per client + @Test + public final void givenTwoHttpClients_whenEachClientMakesConnectionSequentially_thenConnectionCreatedForEach() throws InterruptedException, IOException { + + // given requests from two different client to same destination + final HttpResponse firstResponse = client.send(getRequest, HttpResponse.BodyHandlers.ofString()); + final HttpResponse secondResponse = secondClient.send(getRequest, HttpResponse.BodyHandlers.ofString()); + + assert (firstResponse.statusCode() == 200) && (secondResponse.statusCode() == 200); + } + + // Example 3. Use an HttpClient to Connect to first, second, then first endpoint again. + // New connections made each time when pool size is 1, or re-used when not restricted. + // Make sure to set the JVM arg when running the test: + // -Djdk.httpclient.connectionPoolSize=1 + @Test + public final void givenAnHttpClientAndAPoolSizeOfOne_whenTwoConnectionsMadeBackToOriginal_thenFirstConnectionPurged() throws InterruptedException, IOException { + + // given 3 requests, two to the first server and one to the second server + final HttpResponse firstResponse = client.send(getRequest, HttpResponse.BodyHandlers.ofString()); + final HttpResponse secondResponse = client.send(secondGet, HttpResponse.BodyHandlers.ofString()); + final HttpResponse thirdResponse = client.send(getRequest, HttpResponse.BodyHandlers.ofString()); + + assert ((firstResponse.statusCode() == 200) && (secondResponse.statusCode() == 200) && (thirdResponse.statusCode() == 200)); + } + + // Example 4. Use an HttpClient to connect, wait for connection keepalive to pass, then connect again. New connection made for both calls. + // Make sure to set the JVM arg when running the test: + // -Djdk.httpclient.keepalive.timeout=2 + @Test + public final void givenAnHttpClientAndConnectionKeepAliveOfTwoSeconds_whenCallMadeAfterKeepaliveExpires_thenNewConnection() throws InterruptedException, IOException { + + // given 2 requests to the same destination with the second call made after the keepalive timeout has passed + final HttpResponse firstResponse = client.send(getRequest, HttpResponse.BodyHandlers.ofString()); + Thread.sleep(3000); // exceeds 2 seconds configured by JVM arg + final HttpResponse secondResponse = client.send(getRequest, HttpResponse.BodyHandlers.ofString()); + + assert ((firstResponse.statusCode() == 200) && (secondResponse.statusCode() == 200)); + } + +} + diff --git a/core-java-modules/core-java-httpclient/src/test/resources/jetty-logging.properties b/core-java-modules/core-java-httpclient/src/test/resources/jetty-logging.properties new file mode 100644 index 0000000000..a21bdbcd09 --- /dev/null +++ b/core-java-modules/core-java-httpclient/src/test/resources/jetty-logging.properties @@ -0,0 +1,3 @@ +org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StrErrLog +org.eclipse.jetty.LEVEL=DEBUG +jetty.logs=logs \ No newline at end of file diff --git a/javaxval/pom.xml b/javaxval/pom.xml index 76472e29fb..1feed71abb 100644 --- a/javaxval/pom.xml +++ b/javaxval/pom.xml @@ -46,7 +46,7 @@ test - + From 749cace098bb73bf849b194f14705dbedec6badf Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Sat, 11 Feb 2023 05:19:29 +0100 Subject: [PATCH 439/592] BAEL-5729 Convert Hex to RGB Using Java (#13432) --- core-java-modules/core-java-hex/README.md | 0 core-java-modules/core-java-hex/pom.xml | 25 +++++++++++++++++++ .../baeldung/hextorgb/HexToRgbUnitTest.java | 25 +++++++++++++++++++ core-java-modules/pom.xml | 1 + 4 files changed, 51 insertions(+) create mode 100644 core-java-modules/core-java-hex/README.md create mode 100644 core-java-modules/core-java-hex/pom.xml create mode 100644 core-java-modules/core-java-hex/src/test/java/com/baeldung/hextorgb/HexToRgbUnitTest.java diff --git a/core-java-modules/core-java-hex/README.md b/core-java-modules/core-java-hex/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java-modules/core-java-hex/pom.xml b/core-java-modules/core-java-hex/pom.xml new file mode 100644 index 0000000000..afac1c4d66 --- /dev/null +++ b/core-java-modules/core-java-hex/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + core-java-hex + 0.1.0-SNAPSHOT + core-java-hex + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-hex/src/test/java/com/baeldung/hextorgb/HexToRgbUnitTest.java b/core-java-modules/core-java-hex/src/test/java/com/baeldung/hextorgb/HexToRgbUnitTest.java new file mode 100644 index 0000000000..35e5b87d29 --- /dev/null +++ b/core-java-modules/core-java-hex/src/test/java/com/baeldung/hextorgb/HexToRgbUnitTest.java @@ -0,0 +1,25 @@ +package com.baeldung.hextorgb; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class HexToRgbUnitTest { + + @Test + public void givenHexCode_whenConvertedToRgb_thenCorrectRgbValuesAreReturned() { + String hexCode = "FF9933"; + int red = 255; + int green = 153; + int blue = 51; + + int resultRed = Integer.valueOf(hexCode.substring(0, 2), 16); + int resultGreen = Integer.valueOf(hexCode.substring(2, 4), 16); + int resultBlue = Integer.valueOf(hexCode.substring(4, 6), 16); + + assertEquals(red, resultRed); + assertEquals(green, resultGreen); + assertEquals(blue, resultBlue); + } + +} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index bbbca6adf5..612e607a38 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -62,6 +62,7 @@ core-java-exceptions-4 core-java-function core-java-functional + core-java-hex core-java-io core-java-io-2 core-java-io-3 From 5b852b64b54f51b3ae06b8a4cab5f4a372ea7724 Mon Sep 17 00:00:00 2001 From: Alexandru Borza Date: Sat, 11 Feb 2023 06:38:29 +0200 Subject: [PATCH 440/592] BAEL-6195 Find the First Embedded Occurrence of an Integer in a Java String (#13448) * initialize arraylist with null or zeros * configure pom parent * move code * delete module * BAEL-6195 * first occurence of an integer * review changes --- .../FirstOccurrenceOfAnInteger.java | 18 ++++++++ .../FirstOccurrenceOfAnIntegerUnitTest.java | 46 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 core-java-modules/core-java-string-algorithms-3/src/main/java/com/baeldung/firstocurrenceofaninteger/FirstOccurrenceOfAnInteger.java create mode 100644 core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/firstocurrenceofaninteger/FirstOccurrenceOfAnIntegerUnitTest.java diff --git a/core-java-modules/core-java-string-algorithms-3/src/main/java/com/baeldung/firstocurrenceofaninteger/FirstOccurrenceOfAnInteger.java b/core-java-modules/core-java-string-algorithms-3/src/main/java/com/baeldung/firstocurrenceofaninteger/FirstOccurrenceOfAnInteger.java new file mode 100644 index 0000000000..ca86208e59 --- /dev/null +++ b/core-java-modules/core-java-string-algorithms-3/src/main/java/com/baeldung/firstocurrenceofaninteger/FirstOccurrenceOfAnInteger.java @@ -0,0 +1,18 @@ +package com.baeldung.firstocurrenceofaninteger; + +public class FirstOccurrenceOfAnInteger { + + static Integer findFirstInteger(String s) { + int i = 0; + while (i < s.length() && !Character.isDigit(s.charAt(i))) { + i++; + } + int j = i; + while (j < s.length() && Character.isDigit(s.charAt(j))) { + j++; + } + return Integer.parseInt(s.substring(i, j)); + } + +} + diff --git a/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/firstocurrenceofaninteger/FirstOccurrenceOfAnIntegerUnitTest.java b/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/firstocurrenceofaninteger/FirstOccurrenceOfAnIntegerUnitTest.java new file mode 100644 index 0000000000..ab40316708 --- /dev/null +++ b/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/firstocurrenceofaninteger/FirstOccurrenceOfAnIntegerUnitTest.java @@ -0,0 +1,46 @@ +package com.baeldung.firstocurrenceofaninteger; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +class FirstOccurrenceOfAnIntegerUnitTest { + + @Test + void whenUsingPatternMatcher_findFirstInteger() { + String s = "ba31dung123"; + Matcher matcher = Pattern.compile("\\d+").matcher(s); + matcher.find(); + int i = Integer.parseInt(matcher.group()); + Assertions.assertEquals(31, i); + } + + @Test + void whenUsingScanner_findFirstInteger() { + int i = new Scanner("ba31dung123").useDelimiter("\\D+").nextInt(); + Assertions.assertEquals(31, i); + } + + @Test + void whenUsingSplit_findFirstInteger() { + String str = "ba31dung123"; + List tokens = Arrays.stream(str.split("\\D+")) + .filter(s -> s.length() > 0).collect(Collectors.toList()); + Assertions.assertEquals(31, Integer.parseInt(tokens.get(0))); + } + + @Test + void whenUsingCustomMethod_findFirstInteger() { + String str = "ba31dung123"; + Integer i = FirstOccurrenceOfAnInteger.findFirstInteger(str); + Assertions.assertEquals(31, i); + } + + +} From 79cb26d04f3c2e0a22232ae5d09044d818495cc3 Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Sat, 11 Feb 2023 13:40:09 +0100 Subject: [PATCH 441/592] BAEL-6198: fixed spacing for line continuation --- .../src/main/java/com/baeldung/junit5/nested/Publication.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/Publication.java b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/Publication.java index 998419acc9..bfadbd3fe8 100644 --- a/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/Publication.java +++ b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/nested/Publication.java @@ -13,7 +13,7 @@ public class Publication { public List getReadableArticles(User user) { return articles.stream() .filter(a -> a.getArticleLevel() - .compare(user.getMembership()) <= 0) + .compare(user.getMembership()) <= 0) .map(Article::getName) .collect(Collectors.toList()); } @@ -21,7 +21,7 @@ public class Publication { public List getLockedArticles(User user) { return articles.stream() .filter(a -> a.getArticleLevel() - .compare(user.getMembership()) > 0) + .compare(user.getMembership()) > 0) .map(Article::getName) .collect(Collectors.toList()); } From 792bda644dbb5a799dca791d95f0862d95568381 Mon Sep 17 00:00:00 2001 From: Amit Kumatr Date: Sun, 12 Feb 2023 13:30:21 +0530 Subject: [PATCH 442/592] renamed the Test class --- ...positoryIntegrationTest.java => UserRepositoryUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/collectionsvsstream/{UserRepositoryIntegrationTest.java => UserRepositoryUnitTest.java} (97%) diff --git a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/collectionsvsstream/UserRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/collectionsvsstream/UserRepositoryUnitTest.java similarity index 97% rename from persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/collectionsvsstream/UserRepositoryIntegrationTest.java rename to persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/collectionsvsstream/UserRepositoryUnitTest.java index 009ace0f9c..3a0342bf41 100644 --- a/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/collectionsvsstream/UserRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-query-3/src/test/java/com/baeldung/spring/data/jpa/collectionsvsstream/UserRepositoryUnitTest.java @@ -16,7 +16,7 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import com.github.javafaker.Faker; @DataJpaTest -class UserRepositoryIntegrationTest { +class UserRepositoryUnitTest { @Autowired private UserRepository userRepository; From 4ccb022bad1da8695edca70949b9c0b1d1ed2c6a Mon Sep 17 00:00:00 2001 From: exaucae Date: Sun, 12 Feb 2023 13:05:10 +0000 Subject: [PATCH 443/592] remove generated code --- .../java/panama/jextract/Greetings.java | 6 +- .../main/java/foreign/c/Constants$root.java | 23 - java-panama/src/main/java/foreign/c/FILE.java | 14 - .../main/java/foreign/c/RuntimeHelper.java | 233 -- .../src/main/java/foreign/c/_iobuf.java | 162 -- .../src/main/java/foreign/c/constants$0.java | 52 - .../src/main/java/foreign/c/constants$1.java | 54 - .../src/main/java/foreign/c/constants$10.java | 61 - .../src/main/java/foreign/c/constants$11.java | 60 - .../src/main/java/foreign/c/constants$12.java | 58 - .../src/main/java/foreign/c/constants$13.java | 53 - .../src/main/java/foreign/c/constants$14.java | 52 - .../src/main/java/foreign/c/constants$15.java | 50 - .../src/main/java/foreign/c/constants$16.java | 61 - .../src/main/java/foreign/c/constants$17.java | 64 - .../src/main/java/foreign/c/constants$18.java | 63 - .../src/main/java/foreign/c/constants$19.java | 62 - .../src/main/java/foreign/c/constants$2.java | 60 - .../src/main/java/foreign/c/constants$20.java | 56 - .../src/main/java/foreign/c/constants$21.java | 18 - .../src/main/java/foreign/c/constants$3.java | 64 - .../src/main/java/foreign/c/constants$4.java | 64 - .../src/main/java/foreign/c/constants$5.java | 63 - .../src/main/java/foreign/c/constants$6.java | 67 - .../src/main/java/foreign/c/constants$7.java | 69 - .../src/main/java/foreign/c/constants$8.java | 61 - .../src/main/java/foreign/c/constants$9.java | 59 - .../src/main/java/foreign/c/stdio_h.java | 1881 ----------------- 28 files changed, 4 insertions(+), 3586 deletions(-) delete mode 100644 java-panama/src/main/java/foreign/c/Constants$root.java delete mode 100644 java-panama/src/main/java/foreign/c/FILE.java delete mode 100644 java-panama/src/main/java/foreign/c/RuntimeHelper.java delete mode 100644 java-panama/src/main/java/foreign/c/_iobuf.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$0.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$1.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$10.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$11.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$12.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$13.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$14.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$15.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$16.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$17.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$18.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$19.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$2.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$20.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$21.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$3.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$4.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$5.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$6.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$7.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$8.java delete mode 100644 java-panama/src/main/java/foreign/c/constants$9.java delete mode 100644 java-panama/src/main/java/foreign/c/stdio_h.java diff --git a/java-panama/src/main/java/com/baeldung/java/panama/jextract/Greetings.java b/java-panama/src/main/java/com/baeldung/java/panama/jextract/Greetings.java index 7a22c70fce..90d8e8f253 100644 --- a/java-panama/src/main/java/com/baeldung/java/panama/jextract/Greetings.java +++ b/java-panama/src/main/java/com/baeldung/java/panama/jextract/Greetings.java @@ -2,7 +2,8 @@ package com.baeldung.java.panama.jextract; import java.lang.foreign.MemorySegment; import java.lang.foreign.MemorySession; -import static foreign.c.stdio_h.printf; +// Generate JExtract bingings before uncommenting +// import static foreign.c.stdio_h.printf; public class Greetings { @@ -11,7 +12,8 @@ public class Greetings { try (MemorySession memorySession = MemorySession.openConfined()) { MemorySegment greetingSegment = memorySession.allocateUtf8String(greeting); - printf(greetingSegment); + // Generate JExtract bingings before uncommenting + // printf(greetingSegment); } } } diff --git a/java-panama/src/main/java/foreign/c/Constants$root.java b/java-panama/src/main/java/foreign/c/Constants$root.java deleted file mode 100644 index 2a8f1bad0c..0000000000 --- a/java-panama/src/main/java/foreign/c/Constants$root.java +++ /dev/null @@ -1,23 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -public class Constants$root { - - static final OfBoolean C_BOOL$LAYOUT = JAVA_BOOLEAN; - static final OfByte C_CHAR$LAYOUT = JAVA_BYTE; - static final OfShort C_SHORT$LAYOUT = JAVA_SHORT.withBitAlignment(16); - static final OfInt C_INT$LAYOUT = JAVA_INT.withBitAlignment(32); - static final OfInt C_LONG$LAYOUT = JAVA_INT.withBitAlignment(32); - static final OfLong C_LONG_LONG$LAYOUT = JAVA_LONG.withBitAlignment(64); - static final OfFloat C_FLOAT$LAYOUT = JAVA_FLOAT.withBitAlignment(32); - static final OfDouble C_DOUBLE$LAYOUT = JAVA_DOUBLE.withBitAlignment(64); - static final OfAddress C_POINTER$LAYOUT = ADDRESS.withBitAlignment(64); -} - - diff --git a/java-panama/src/main/java/foreign/c/FILE.java b/java-panama/src/main/java/foreign/c/FILE.java deleted file mode 100644 index 1956914637..0000000000 --- a/java-panama/src/main/java/foreign/c/FILE.java +++ /dev/null @@ -1,14 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -public class FILE extends _iobuf { - -} - - diff --git a/java-panama/src/main/java/foreign/c/RuntimeHelper.java b/java-panama/src/main/java/foreign/c/RuntimeHelper.java deleted file mode 100644 index 5fd36bdc7b..0000000000 --- a/java-panama/src/main/java/foreign/c/RuntimeHelper.java +++ /dev/null @@ -1,233 +0,0 @@ -package foreign.c; -// Generated by jextract - -import java.lang.foreign.Addressable; -import java.lang.foreign.Linker; -import java.lang.foreign.FunctionDescriptor; -import java.lang.foreign.GroupLayout; -import java.lang.foreign.SymbolLookup; -import java.lang.foreign.MemoryAddress; -import java.lang.foreign.MemoryLayout; -import java.lang.foreign.MemorySegment; -import java.lang.foreign.MemorySession; -import java.lang.foreign.SegmentAllocator; -import java.lang.foreign.ValueLayout; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.io.File; -import java.nio.file.Path; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Optional; -import java.util.stream.Stream; - -import static java.lang.foreign.Linker.*; -import static java.lang.foreign.ValueLayout.*; - -final class RuntimeHelper { - - private RuntimeHelper() {} - private final static Linker LINKER = Linker.nativeLinker(); - private final static ClassLoader LOADER = RuntimeHelper.class.getClassLoader(); - private final static MethodHandles.Lookup MH_LOOKUP = MethodHandles.lookup(); - private final static SymbolLookup SYMBOL_LOOKUP; - - final static SegmentAllocator CONSTANT_ALLOCATOR = - (size, align) -> MemorySegment.allocateNative(size, align, MemorySession.openImplicit()); - - static { - - SymbolLookup loaderLookup = SymbolLookup.loaderLookup(); - SYMBOL_LOOKUP = name -> loaderLookup.lookup(name).or(() -> LINKER.defaultLookup().lookup(name)); - } - - static T requireNonNull(T obj, String symbolName) { - if (obj == null) { - throw new UnsatisfiedLinkError("unresolved symbol: " + symbolName); - } - return obj; - } - - private final static SegmentAllocator THROWING_ALLOCATOR = (x, y) -> { throw new AssertionError("should not reach here"); }; - - static final MemorySegment lookupGlobalVariable(String name, MemoryLayout layout) { - return SYMBOL_LOOKUP.lookup(name).map(symbol -> MemorySegment.ofAddress(symbol.address(), layout.byteSize(), MemorySession.openShared())).orElse(null); - } - - static final MethodHandle downcallHandle(String name, FunctionDescriptor fdesc) { - return SYMBOL_LOOKUP.lookup(name). - map(addr -> LINKER.downcallHandle(addr, fdesc)). - orElse(null); - } - - static final MethodHandle downcallHandle(FunctionDescriptor fdesc) { - return LINKER.downcallHandle(fdesc); - } - - static final MethodHandle downcallHandleVariadic(String name, FunctionDescriptor fdesc) { - return SYMBOL_LOOKUP.lookup(name). - map(addr -> VarargsInvoker.make(addr, fdesc)). - orElse(null); - } - - static final MemorySegment upcallStub(Class fi, Z z, FunctionDescriptor fdesc, MemorySession session) { - try { - MethodHandle handle = MH_LOOKUP.findVirtual(fi, "apply", Linker.upcallType(fdesc)); - handle = handle.bindTo(z); - return LINKER.upcallStub(handle, fdesc, session); - } catch (Throwable ex) { - throw new AssertionError(ex); - } - } - - static MemorySegment asArray(MemoryAddress addr, MemoryLayout layout, int numElements, MemorySession session) { - return MemorySegment.ofAddress(addr, numElements * layout.byteSize(), session); - } - - // Internals only below this point - - private static class VarargsInvoker { - private static final MethodHandle INVOKE_MH; - private final MemorySegment symbol; - private final FunctionDescriptor function; - - private VarargsInvoker(MemorySegment symbol, FunctionDescriptor function) { - this.symbol = symbol; - this.function = function; - } - - static { - try { - INVOKE_MH = MethodHandles.lookup().findVirtual(VarargsInvoker.class, "invoke", MethodType.methodType(Object.class, SegmentAllocator.class, Object[].class)); - } catch (ReflectiveOperationException e) { - throw new RuntimeException(e); - } - } - - static MethodHandle make(MemorySegment symbol, FunctionDescriptor function) { - VarargsInvoker invoker = new VarargsInvoker(symbol, function); - MethodHandle handle = INVOKE_MH.bindTo(invoker).asCollector(Object[].class, function.argumentLayouts().size() + 1); - MethodType mtype = MethodType.methodType(function.returnLayout().isPresent() ? carrier(function.returnLayout().get(), true) : void.class); - for (MemoryLayout layout : function.argumentLayouts()) { - mtype = mtype.appendParameterTypes(carrier(layout, false)); - } - mtype = mtype.appendParameterTypes(Object[].class); - if (mtype.returnType().equals(MemorySegment.class)) { - mtype = mtype.insertParameterTypes(0, SegmentAllocator.class); - } else { - handle = MethodHandles.insertArguments(handle, 0, THROWING_ALLOCATOR); - } - return handle.asType(mtype); - } - - static Class carrier(MemoryLayout layout, boolean ret) { - if (layout instanceof ValueLayout valueLayout) { - return (ret || valueLayout.carrier() != MemoryAddress.class) ? - valueLayout.carrier() : Addressable.class; - } else if (layout instanceof GroupLayout) { - return MemorySegment.class; - } else { - throw new AssertionError("Cannot get here!"); - } - } - - private Object invoke(SegmentAllocator allocator, Object[] args) throws Throwable { - // one trailing Object[] - int nNamedArgs = function.argumentLayouts().size(); - assert(args.length == nNamedArgs + 1); - // The last argument is the array of vararg collector - Object[] unnamedArgs = (Object[]) args[args.length - 1]; - - int argsCount = nNamedArgs + unnamedArgs.length; - Class[] argTypes = new Class[argsCount]; - MemoryLayout[] argLayouts = new MemoryLayout[nNamedArgs + unnamedArgs.length]; - - int pos = 0; - for (pos = 0; pos < nNamedArgs; pos++) { - argLayouts[pos] = function.argumentLayouts().get(pos); - } - - assert pos == nNamedArgs; - for (Object o: unnamedArgs) { - argLayouts[pos] = variadicLayout(normalize(o.getClass())); - pos++; - } - assert pos == argsCount; - - FunctionDescriptor f = (function.returnLayout().isEmpty()) ? - FunctionDescriptor.ofVoid(argLayouts) : - FunctionDescriptor.of(function.returnLayout().get(), argLayouts); - MethodHandle mh = LINKER.downcallHandle(symbol, f); - if (mh.type().returnType() == MemorySegment.class) { - mh = mh.bindTo(allocator); - } - // flatten argument list so that it can be passed to an asSpreader MH - Object[] allArgs = new Object[nNamedArgs + unnamedArgs.length]; - System.arraycopy(args, 0, allArgs, 0, nNamedArgs); - System.arraycopy(unnamedArgs, 0, allArgs, nNamedArgs, unnamedArgs.length); - - return mh.asSpreader(Object[].class, argsCount).invoke(allArgs); - } - - private static Class unboxIfNeeded(Class clazz) { - if (clazz == Boolean.class) { - return boolean.class; - } else if (clazz == Void.class) { - return void.class; - } else if (clazz == Byte.class) { - return byte.class; - } else if (clazz == Character.class) { - return char.class; - } else if (clazz == Short.class) { - return short.class; - } else if (clazz == Integer.class) { - return int.class; - } else if (clazz == Long.class) { - return long.class; - } else if (clazz == Float.class) { - return float.class; - } else if (clazz == Double.class) { - return double.class; - } else { - return clazz; - } - } - - private Class promote(Class c) { - if (c == byte.class || c == char.class || c == short.class || c == int.class) { - return long.class; - } else if (c == float.class) { - return double.class; - } else { - return c; - } - } - - private Class normalize(Class c) { - c = unboxIfNeeded(c); - if (c.isPrimitive()) { - return promote(c); - } - if (MemoryAddress.class.isAssignableFrom(c)) { - return MemoryAddress.class; - } - if (MemorySegment.class.isAssignableFrom(c)) { - return MemorySegment.class; - } - throw new IllegalArgumentException("Invalid type for ABI: " + c.getTypeName()); - } - - private MemoryLayout variadicLayout(Class c) { - if (c == long.class) { - return JAVA_LONG; - } else if (c == double.class) { - return JAVA_DOUBLE; - } else if (MemoryAddress.class.isAssignableFrom(c)) { - return ADDRESS; - } else { - throw new IllegalArgumentException("Unhandled variadic argument class: " + c); - } - } - } -} diff --git a/java-panama/src/main/java/foreign/c/_iobuf.java b/java-panama/src/main/java/foreign/c/_iobuf.java deleted file mode 100644 index b9f546f634..0000000000 --- a/java-panama/src/main/java/foreign/c/_iobuf.java +++ /dev/null @@ -1,162 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -public class _iobuf { - - static final GroupLayout $struct$LAYOUT = MemoryLayout.structLayout( - Constants$root.C_POINTER$LAYOUT.withName("_ptr"), - Constants$root.C_LONG$LAYOUT.withName("_cnt"), - MemoryLayout.paddingLayout(32), - Constants$root.C_POINTER$LAYOUT.withName("_base"), - Constants$root.C_LONG$LAYOUT.withName("_flag"), - Constants$root.C_LONG$LAYOUT.withName("_file"), - Constants$root.C_LONG$LAYOUT.withName("_charbuf"), - Constants$root.C_LONG$LAYOUT.withName("_bufsiz"), - Constants$root.C_POINTER$LAYOUT.withName("_tmpfname") - ).withName("_iobuf"); - public static MemoryLayout $LAYOUT() { - return _iobuf.$struct$LAYOUT; - } - static final VarHandle _ptr$VH = $struct$LAYOUT.varHandle(MemoryLayout.PathElement.groupElement("_ptr")); - public static VarHandle _ptr$VH() { - return _iobuf._ptr$VH; - } - public static MemoryAddress _ptr$get(MemorySegment seg) { - return (java.lang.foreign.MemoryAddress)_iobuf._ptr$VH.get(seg); - } - public static void _ptr$set( MemorySegment seg, MemoryAddress x) { - _iobuf._ptr$VH.set(seg, x); - } - public static MemoryAddress _ptr$get(MemorySegment seg, long index) { - return (java.lang.foreign.MemoryAddress)_iobuf._ptr$VH.get(seg.asSlice(index*sizeof())); - } - public static void _ptr$set(MemorySegment seg, long index, MemoryAddress x) { - _iobuf._ptr$VH.set(seg.asSlice(index*sizeof()), x); - } - static final VarHandle _cnt$VH = $struct$LAYOUT.varHandle(MemoryLayout.PathElement.groupElement("_cnt")); - public static VarHandle _cnt$VH() { - return _iobuf._cnt$VH; - } - public static int _cnt$get(MemorySegment seg) { - return (int)_iobuf._cnt$VH.get(seg); - } - public static void _cnt$set( MemorySegment seg, int x) { - _iobuf._cnt$VH.set(seg, x); - } - public static int _cnt$get(MemorySegment seg, long index) { - return (int)_iobuf._cnt$VH.get(seg.asSlice(index*sizeof())); - } - public static void _cnt$set(MemorySegment seg, long index, int x) { - _iobuf._cnt$VH.set(seg.asSlice(index*sizeof()), x); - } - static final VarHandle _base$VH = $struct$LAYOUT.varHandle(MemoryLayout.PathElement.groupElement("_base")); - public static VarHandle _base$VH() { - return _iobuf._base$VH; - } - public static MemoryAddress _base$get(MemorySegment seg) { - return (java.lang.foreign.MemoryAddress)_iobuf._base$VH.get(seg); - } - public static void _base$set( MemorySegment seg, MemoryAddress x) { - _iobuf._base$VH.set(seg, x); - } - public static MemoryAddress _base$get(MemorySegment seg, long index) { - return (java.lang.foreign.MemoryAddress)_iobuf._base$VH.get(seg.asSlice(index*sizeof())); - } - public static void _base$set(MemorySegment seg, long index, MemoryAddress x) { - _iobuf._base$VH.set(seg.asSlice(index*sizeof()), x); - } - static final VarHandle _flag$VH = $struct$LAYOUT.varHandle(MemoryLayout.PathElement.groupElement("_flag")); - public static VarHandle _flag$VH() { - return _iobuf._flag$VH; - } - public static int _flag$get(MemorySegment seg) { - return (int)_iobuf._flag$VH.get(seg); - } - public static void _flag$set( MemorySegment seg, int x) { - _iobuf._flag$VH.set(seg, x); - } - public static int _flag$get(MemorySegment seg, long index) { - return (int)_iobuf._flag$VH.get(seg.asSlice(index*sizeof())); - } - public static void _flag$set(MemorySegment seg, long index, int x) { - _iobuf._flag$VH.set(seg.asSlice(index*sizeof()), x); - } - static final VarHandle _file$VH = $struct$LAYOUT.varHandle(MemoryLayout.PathElement.groupElement("_file")); - public static VarHandle _file$VH() { - return _iobuf._file$VH; - } - public static int _file$get(MemorySegment seg) { - return (int)_iobuf._file$VH.get(seg); - } - public static void _file$set( MemorySegment seg, int x) { - _iobuf._file$VH.set(seg, x); - } - public static int _file$get(MemorySegment seg, long index) { - return (int)_iobuf._file$VH.get(seg.asSlice(index*sizeof())); - } - public static void _file$set(MemorySegment seg, long index, int x) { - _iobuf._file$VH.set(seg.asSlice(index*sizeof()), x); - } - static final VarHandle _charbuf$VH = $struct$LAYOUT.varHandle(MemoryLayout.PathElement.groupElement("_charbuf")); - public static VarHandle _charbuf$VH() { - return _iobuf._charbuf$VH; - } - public static int _charbuf$get(MemorySegment seg) { - return (int)_iobuf._charbuf$VH.get(seg); - } - public static void _charbuf$set( MemorySegment seg, int x) { - _iobuf._charbuf$VH.set(seg, x); - } - public static int _charbuf$get(MemorySegment seg, long index) { - return (int)_iobuf._charbuf$VH.get(seg.asSlice(index*sizeof())); - } - public static void _charbuf$set(MemorySegment seg, long index, int x) { - _iobuf._charbuf$VH.set(seg.asSlice(index*sizeof()), x); - } - static final VarHandle _bufsiz$VH = $struct$LAYOUT.varHandle(MemoryLayout.PathElement.groupElement("_bufsiz")); - public static VarHandle _bufsiz$VH() { - return _iobuf._bufsiz$VH; - } - public static int _bufsiz$get(MemorySegment seg) { - return (int)_iobuf._bufsiz$VH.get(seg); - } - public static void _bufsiz$set( MemorySegment seg, int x) { - _iobuf._bufsiz$VH.set(seg, x); - } - public static int _bufsiz$get(MemorySegment seg, long index) { - return (int)_iobuf._bufsiz$VH.get(seg.asSlice(index*sizeof())); - } - public static void _bufsiz$set(MemorySegment seg, long index, int x) { - _iobuf._bufsiz$VH.set(seg.asSlice(index*sizeof()), x); - } - static final VarHandle _tmpfname$VH = $struct$LAYOUT.varHandle(MemoryLayout.PathElement.groupElement("_tmpfname")); - public static VarHandle _tmpfname$VH() { - return _iobuf._tmpfname$VH; - } - public static MemoryAddress _tmpfname$get(MemorySegment seg) { - return (java.lang.foreign.MemoryAddress)_iobuf._tmpfname$VH.get(seg); - } - public static void _tmpfname$set( MemorySegment seg, MemoryAddress x) { - _iobuf._tmpfname$VH.set(seg, x); - } - public static MemoryAddress _tmpfname$get(MemorySegment seg, long index) { - return (java.lang.foreign.MemoryAddress)_iobuf._tmpfname$VH.get(seg.asSlice(index*sizeof())); - } - public static void _tmpfname$set(MemorySegment seg, long index, MemoryAddress x) { - _iobuf._tmpfname$VH.set(seg.asSlice(index*sizeof()), x); - } - public static long sizeof() { return $LAYOUT().byteSize(); } - public static MemorySegment allocate(SegmentAllocator allocator) { return allocator.allocate($LAYOUT()); } - public static MemorySegment allocateArray(int len, SegmentAllocator allocator) { - return allocator.allocate(MemoryLayout.sequenceLayout(len, $LAYOUT())); - } - public static MemorySegment ofAddress(MemoryAddress addr, MemorySession session) { return RuntimeHelper.asArray(addr, $LAYOUT(), 1, session); } -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$0.java b/java-panama/src/main/java/foreign/c/constants$0.java deleted file mode 100644 index 4bd3d3fa4b..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$0.java +++ /dev/null @@ -1,52 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$0 { - - static final FunctionDescriptor fopen$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fopen$MH = RuntimeHelper.downcallHandle( - "fopen", - constants$0.fopen$FUNC - ); - static final FunctionDescriptor freopen$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle freopen$MH = RuntimeHelper.downcallHandle( - "freopen", - constants$0.freopen$FUNC - ); - static final FunctionDescriptor fflush$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fflush$MH = RuntimeHelper.downcallHandle( - "fflush", - constants$0.fflush$FUNC - ); - static final FunctionDescriptor fclose$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fclose$MH = RuntimeHelper.downcallHandle( - "fclose", - constants$0.fclose$FUNC - ); - static final FunctionDescriptor remove$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle remove$MH = RuntimeHelper.downcallHandle( - "remove", - constants$0.remove$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$1.java b/java-panama/src/main/java/foreign/c/constants$1.java deleted file mode 100644 index acd4dbf615..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$1.java +++ /dev/null @@ -1,54 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$1 { - - static final FunctionDescriptor rename$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle rename$MH = RuntimeHelper.downcallHandle( - "rename", - constants$1.rename$FUNC - ); - static final FunctionDescriptor tmpfile$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT); - static final MethodHandle tmpfile$MH = RuntimeHelper.downcallHandle( - "tmpfile", - constants$1.tmpfile$FUNC - ); - static final FunctionDescriptor tmpnam$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle tmpnam$MH = RuntimeHelper.downcallHandle( - "tmpnam", - constants$1.tmpnam$FUNC - ); - static final FunctionDescriptor _tempnam$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle _tempnam$MH = RuntimeHelper.downcallHandle( - "_tempnam", - constants$1._tempnam$FUNC - ); - static final FunctionDescriptor _rmtmp$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); - static final MethodHandle _rmtmp$MH = RuntimeHelper.downcallHandle( - "_rmtmp", - constants$1._rmtmp$FUNC - ); - static final FunctionDescriptor _unlink$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle _unlink$MH = RuntimeHelper.downcallHandle( - "_unlink", - constants$1._unlink$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$10.java b/java-panama/src/main/java/foreign/c/constants$10.java deleted file mode 100644 index 5f9cef3d67..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$10.java +++ /dev/null @@ -1,61 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$10 { - - static final FunctionDescriptor getc$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle getc$MH = RuntimeHelper.downcallHandle( - "getc", - constants$10.getc$FUNC - ); - static final FunctionDescriptor putc$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle putc$MH = RuntimeHelper.downcallHandle( - "putc", - constants$10.putc$FUNC - ); - static final FunctionDescriptor getchar$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); - static final MethodHandle getchar$MH = RuntimeHelper.downcallHandle( - "getchar", - constants$10.getchar$FUNC - ); - static final FunctionDescriptor putchar$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG$LAYOUT - ); - static final MethodHandle putchar$MH = RuntimeHelper.downcallHandle( - "putchar", - constants$10.putchar$FUNC - ); - static final FunctionDescriptor fread$FUNC = FunctionDescriptor.of(Constants$root.C_LONG_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG_LONG$LAYOUT, - Constants$root.C_LONG_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fread$MH = RuntimeHelper.downcallHandle( - "fread", - constants$10.fread$FUNC - ); - static final FunctionDescriptor fwrite$FUNC = FunctionDescriptor.of(Constants$root.C_LONG_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG_LONG$LAYOUT, - Constants$root.C_LONG_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fwrite$MH = RuntimeHelper.downcallHandle( - "fwrite", - constants$10.fwrite$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$11.java b/java-panama/src/main/java/foreign/c/constants$11.java deleted file mode 100644 index c854ef9302..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$11.java +++ /dev/null @@ -1,60 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$11 { - - static final FunctionDescriptor fseek$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG$LAYOUT - ); - static final MethodHandle fseek$MH = RuntimeHelper.downcallHandle( - "fseek", - constants$11.fseek$FUNC - ); - static final FunctionDescriptor ftell$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle ftell$MH = RuntimeHelper.downcallHandle( - "ftell", - constants$11.ftell$FUNC - ); - static final FunctionDescriptor rewind$FUNC = FunctionDescriptor.ofVoid( - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle rewind$MH = RuntimeHelper.downcallHandle( - "rewind", - constants$11.rewind$FUNC - ); - static final FunctionDescriptor fgetpos$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fgetpos$MH = RuntimeHelper.downcallHandle( - "fgetpos", - constants$11.fgetpos$FUNC - ); - static final FunctionDescriptor fsetpos$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fsetpos$MH = RuntimeHelper.downcallHandle( - "fsetpos", - constants$11.fsetpos$FUNC - ); - static final FunctionDescriptor feof$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle feof$MH = RuntimeHelper.downcallHandle( - "feof", - constants$11.feof$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$12.java b/java-panama/src/main/java/foreign/c/constants$12.java deleted file mode 100644 index db0d19a2b8..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$12.java +++ /dev/null @@ -1,58 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$12 { - - static final FunctionDescriptor ferror$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle ferror$MH = RuntimeHelper.downcallHandle( - "ferror", - constants$12.ferror$FUNC - ); - static final FunctionDescriptor clearerr$FUNC = FunctionDescriptor.ofVoid( - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle clearerr$MH = RuntimeHelper.downcallHandle( - "clearerr", - constants$12.clearerr$FUNC - ); - static final FunctionDescriptor perror$FUNC = FunctionDescriptor.ofVoid( - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle perror$MH = RuntimeHelper.downcallHandle( - "perror", - constants$12.perror$FUNC - ); - static final FunctionDescriptor _popen$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle _popen$MH = RuntimeHelper.downcallHandle( - "_popen", - constants$12._popen$FUNC - ); - static final FunctionDescriptor _pclose$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle _pclose$MH = RuntimeHelper.downcallHandle( - "_pclose", - constants$12._pclose$FUNC - ); - static final FunctionDescriptor popen$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle popen$MH = RuntimeHelper.downcallHandle( - "popen", - constants$12.popen$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$13.java b/java-panama/src/main/java/foreign/c/constants$13.java deleted file mode 100644 index f71ff564a0..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$13.java +++ /dev/null @@ -1,53 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$13 { - - static final FunctionDescriptor pclose$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle pclose$MH = RuntimeHelper.downcallHandle( - "pclose", - constants$13.pclose$FUNC - ); - static final FunctionDescriptor _flushall$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); - static final MethodHandle _flushall$MH = RuntimeHelper.downcallHandle( - "_flushall", - constants$13._flushall$FUNC - ); - static final FunctionDescriptor _fgetchar$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); - static final MethodHandle _fgetchar$MH = RuntimeHelper.downcallHandle( - "_fgetchar", - constants$13._fgetchar$FUNC - ); - static final FunctionDescriptor _fputchar$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG$LAYOUT - ); - static final MethodHandle _fputchar$MH = RuntimeHelper.downcallHandle( - "_fputchar", - constants$13._fputchar$FUNC - ); - static final FunctionDescriptor _fdopen$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle _fdopen$MH = RuntimeHelper.downcallHandle( - "_fdopen", - constants$13._fdopen$FUNC - ); - static final FunctionDescriptor _fileno$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle _fileno$MH = RuntimeHelper.downcallHandle( - "_fileno", - constants$13._fileno$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$14.java b/java-panama/src/main/java/foreign/c/constants$14.java deleted file mode 100644 index d1c82c9abb..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$14.java +++ /dev/null @@ -1,52 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$14 { - - static final FunctionDescriptor _fcloseall$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); - static final MethodHandle _fcloseall$MH = RuntimeHelper.downcallHandle( - "_fcloseall", - constants$14._fcloseall$FUNC - ); - static final FunctionDescriptor _fsopen$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG$LAYOUT - ); - static final MethodHandle _fsopen$MH = RuntimeHelper.downcallHandle( - "_fsopen", - constants$14._fsopen$FUNC - ); - static final FunctionDescriptor __mingw_get_output_format$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); - static final MethodHandle __mingw_get_output_format$MH = RuntimeHelper.downcallHandle( - "__mingw_get_output_format", - constants$14.__mingw_get_output_format$FUNC - ); - static final FunctionDescriptor __mingw_set_output_format$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG$LAYOUT - ); - static final MethodHandle __mingw_set_output_format$MH = RuntimeHelper.downcallHandle( - "__mingw_set_output_format", - constants$14.__mingw_set_output_format$FUNC - ); - static final FunctionDescriptor __mingw_get_printf_count_output$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); - static final MethodHandle __mingw_get_printf_count_output$MH = RuntimeHelper.downcallHandle( - "__mingw_get_printf_count_output", - constants$14.__mingw_get_printf_count_output$FUNC - ); - static final FunctionDescriptor __mingw_set_printf_count_output$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG$LAYOUT - ); - static final MethodHandle __mingw_set_printf_count_output$MH = RuntimeHelper.downcallHandle( - "__mingw_set_printf_count_output", - constants$14.__mingw_set_printf_count_output$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$15.java b/java-panama/src/main/java/foreign/c/constants$15.java deleted file mode 100644 index 426e33db00..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$15.java +++ /dev/null @@ -1,50 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$15 { - - static final FunctionDescriptor _get_output_format$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); - static final MethodHandle _get_output_format$MH = RuntimeHelper.downcallHandle( - "_get_output_format", - constants$15._get_output_format$FUNC - ); - static final FunctionDescriptor _set_output_format$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG$LAYOUT - ); - static final MethodHandle _set_output_format$MH = RuntimeHelper.downcallHandle( - "_set_output_format", - constants$15._set_output_format$FUNC - ); - static final FunctionDescriptor _get_printf_count_output$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); - static final MethodHandle _get_printf_count_output$MH = RuntimeHelper.downcallHandle( - "_get_printf_count_output", - constants$15._get_printf_count_output$FUNC - ); - static final FunctionDescriptor _set_printf_count_output$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG$LAYOUT - ); - static final MethodHandle _set_printf_count_output$MH = RuntimeHelper.downcallHandle( - "_set_printf_count_output", - constants$15._set_printf_count_output$FUNC - ); - static final FunctionDescriptor fgetchar$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); - static final MethodHandle fgetchar$MH = RuntimeHelper.downcallHandle( - "fgetchar", - constants$15.fgetchar$FUNC - ); - static final FunctionDescriptor fputchar$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG$LAYOUT - ); - static final MethodHandle fputchar$MH = RuntimeHelper.downcallHandle( - "fputchar", - constants$15.fputchar$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$16.java b/java-panama/src/main/java/foreign/c/constants$16.java deleted file mode 100644 index 58e06fa164..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$16.java +++ /dev/null @@ -1,61 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$16 { - - static final FunctionDescriptor fdopen$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fdopen$MH = RuntimeHelper.downcallHandle( - "fdopen", - constants$16.fdopen$FUNC - ); - static final FunctionDescriptor fileno$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fileno$MH = RuntimeHelper.downcallHandle( - "fileno", - constants$16.fileno$FUNC - ); - static final FunctionDescriptor fwprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fwprintf$MH = RuntimeHelper.downcallHandleVariadic( - "fwprintf", - constants$16.fwprintf$FUNC - ); - static final FunctionDescriptor wprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle wprintf$MH = RuntimeHelper.downcallHandleVariadic( - "wprintf", - constants$16.wprintf$FUNC - ); - static final FunctionDescriptor vfwprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle vfwprintf$MH = RuntimeHelper.downcallHandle( - "vfwprintf", - constants$16.vfwprintf$FUNC - ); - static final FunctionDescriptor vwprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle vwprintf$MH = RuntimeHelper.downcallHandle( - "vwprintf", - constants$16.vwprintf$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$17.java b/java-panama/src/main/java/foreign/c/constants$17.java deleted file mode 100644 index f58aad6fb6..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$17.java +++ /dev/null @@ -1,64 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$17 { - - static final FunctionDescriptor _snwprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle _snwprintf$MH = RuntimeHelper.downcallHandleVariadic( - "_snwprintf", - constants$17._snwprintf$FUNC - ); - static final FunctionDescriptor _vscwprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle _vscwprintf$MH = RuntimeHelper.downcallHandle( - "_vscwprintf", - constants$17._vscwprintf$FUNC - ); - static final FunctionDescriptor _vsnwprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle _vsnwprintf$MH = RuntimeHelper.downcallHandle( - "_vsnwprintf", - constants$17._vsnwprintf$FUNC - ); - static final FunctionDescriptor fwscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fwscanf$MH = RuntimeHelper.downcallHandleVariadic( - "fwscanf", - constants$17.fwscanf$FUNC - ); - static final FunctionDescriptor wscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle wscanf$MH = RuntimeHelper.downcallHandleVariadic( - "wscanf", - constants$17.wscanf$FUNC - ); - static final FunctionDescriptor swscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle swscanf$MH = RuntimeHelper.downcallHandleVariadic( - "swscanf", - constants$17.swscanf$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$18.java b/java-panama/src/main/java/foreign/c/constants$18.java deleted file mode 100644 index 15af05eb64..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$18.java +++ /dev/null @@ -1,63 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$18 { - - static final FunctionDescriptor fgetwc$FUNC = FunctionDescriptor.of(Constants$root.C_SHORT$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fgetwc$MH = RuntimeHelper.downcallHandle( - "fgetwc", - constants$18.fgetwc$FUNC - ); - static final FunctionDescriptor fputwc$FUNC = FunctionDescriptor.of(Constants$root.C_SHORT$LAYOUT, - Constants$root.C_SHORT$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fputwc$MH = RuntimeHelper.downcallHandle( - "fputwc", - constants$18.fputwc$FUNC - ); - static final FunctionDescriptor ungetwc$FUNC = FunctionDescriptor.of(Constants$root.C_SHORT$LAYOUT, - Constants$root.C_SHORT$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle ungetwc$MH = RuntimeHelper.downcallHandle( - "ungetwc", - constants$18.ungetwc$FUNC - ); - static final FunctionDescriptor swprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle swprintf$MH = RuntimeHelper.downcallHandleVariadic( - "swprintf", - constants$18.swprintf$FUNC - ); - static final FunctionDescriptor vswprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle vswprintf$MH = RuntimeHelper.downcallHandle( - "vswprintf", - constants$18.vswprintf$FUNC - ); - static final FunctionDescriptor snwprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle snwprintf$MH = RuntimeHelper.downcallHandleVariadic( - "snwprintf", - constants$18.snwprintf$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$19.java b/java-panama/src/main/java/foreign/c/constants$19.java deleted file mode 100644 index a9cadf6ddb..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$19.java +++ /dev/null @@ -1,62 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$19 { - - static final FunctionDescriptor vsnwprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle vsnwprintf$MH = RuntimeHelper.downcallHandle( - "vsnwprintf", - constants$19.vsnwprintf$FUNC - ); - static final FunctionDescriptor vwscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle vwscanf$MH = RuntimeHelper.downcallHandle( - "vwscanf", - constants$19.vwscanf$FUNC - ); - static final FunctionDescriptor vfwscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle vfwscanf$MH = RuntimeHelper.downcallHandle( - "vfwscanf", - constants$19.vfwscanf$FUNC - ); - static final FunctionDescriptor vswscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle vswscanf$MH = RuntimeHelper.downcallHandle( - "vswscanf", - constants$19.vswscanf$FUNC - ); - static final FunctionDescriptor _fgetwchar$FUNC = FunctionDescriptor.of(Constants$root.C_SHORT$LAYOUT); - static final MethodHandle _fgetwchar$MH = RuntimeHelper.downcallHandle( - "_fgetwchar", - constants$19._fgetwchar$FUNC - ); - static final FunctionDescriptor _fputwchar$FUNC = FunctionDescriptor.of(Constants$root.C_SHORT$LAYOUT, - Constants$root.C_SHORT$LAYOUT - ); - static final MethodHandle _fputwchar$MH = RuntimeHelper.downcallHandle( - "_fputwchar", - constants$19._fputwchar$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$2.java b/java-panama/src/main/java/foreign/c/constants$2.java deleted file mode 100644 index a522b398aa..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$2.java +++ /dev/null @@ -1,60 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$2 { - - static final FunctionDescriptor tempnam$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle tempnam$MH = RuntimeHelper.downcallHandle( - "tempnam", - constants$2.tempnam$FUNC - ); - static final FunctionDescriptor rmtmp$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT); - static final MethodHandle rmtmp$MH = RuntimeHelper.downcallHandle( - "rmtmp", - constants$2.rmtmp$FUNC - ); - static final FunctionDescriptor unlink$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle unlink$MH = RuntimeHelper.downcallHandle( - "unlink", - constants$2.unlink$FUNC - ); - static final FunctionDescriptor setvbuf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG_LONG$LAYOUT - ); - static final MethodHandle setvbuf$MH = RuntimeHelper.downcallHandle( - "setvbuf", - constants$2.setvbuf$FUNC - ); - static final FunctionDescriptor setbuf$FUNC = FunctionDescriptor.ofVoid( - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle setbuf$MH = RuntimeHelper.downcallHandle( - "setbuf", - constants$2.setbuf$FUNC - ); - static final FunctionDescriptor __mingw_fprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle __mingw_fprintf$MH = RuntimeHelper.downcallHandleVariadic( - "__mingw_fprintf", - constants$2.__mingw_fprintf$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$20.java b/java-panama/src/main/java/foreign/c/constants$20.java deleted file mode 100644 index feec0d4d44..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$20.java +++ /dev/null @@ -1,56 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$20 { - - static final FunctionDescriptor _getw$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle _getw$MH = RuntimeHelper.downcallHandle( - "_getw", - constants$20._getw$FUNC - ); - static final FunctionDescriptor _putw$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle _putw$MH = RuntimeHelper.downcallHandle( - "_putw", - constants$20._putw$FUNC - ); - static final FunctionDescriptor fgetwchar$FUNC = FunctionDescriptor.of(Constants$root.C_SHORT$LAYOUT); - static final MethodHandle fgetwchar$MH = RuntimeHelper.downcallHandle( - "fgetwchar", - constants$20.fgetwchar$FUNC - ); - static final FunctionDescriptor fputwchar$FUNC = FunctionDescriptor.of(Constants$root.C_SHORT$LAYOUT, - Constants$root.C_SHORT$LAYOUT - ); - static final MethodHandle fputwchar$MH = RuntimeHelper.downcallHandle( - "fputwchar", - constants$20.fputwchar$FUNC - ); - static final FunctionDescriptor getw$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle getw$MH = RuntimeHelper.downcallHandle( - "getw", - constants$20.getw$FUNC - ); - static final FunctionDescriptor putw$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle putw$MH = RuntimeHelper.downcallHandle( - "putw", - constants$20.putw$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$21.java b/java-panama/src/main/java/foreign/c/constants$21.java deleted file mode 100644 index ed21424dc5..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$21.java +++ /dev/null @@ -1,18 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$21 { - - static final MemoryAddress NULL$ADDR = MemoryAddress.ofLong(0L); - static final MemorySegment _P_tmpdir$SEGMENT = RuntimeHelper.CONSTANT_ALLOCATOR.allocateUtf8String("\\"); - static final MemorySegment P_tmpdir$SEGMENT = RuntimeHelper.CONSTANT_ALLOCATOR.allocateUtf8String("\\"); - static final MemorySegment _wP_tmpdir$SEGMENT = RuntimeHelper.CONSTANT_ALLOCATOR.allocateUtf8String("\\"); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$3.java b/java-panama/src/main/java/foreign/c/constants$3.java deleted file mode 100644 index 0709e943bd..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$3.java +++ /dev/null @@ -1,64 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$3 { - - static final FunctionDescriptor __mingw_printf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle __mingw_printf$MH = RuntimeHelper.downcallHandleVariadic( - "__mingw_printf", - constants$3.__mingw_printf$FUNC - ); - static final FunctionDescriptor __mingw_sprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle __mingw_sprintf$MH = RuntimeHelper.downcallHandleVariadic( - "__mingw_sprintf", - constants$3.__mingw_sprintf$FUNC - ); - static final FunctionDescriptor __mingw_snprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle __mingw_snprintf$MH = RuntimeHelper.downcallHandleVariadic( - "__mingw_snprintf", - constants$3.__mingw_snprintf$FUNC - ); - static final FunctionDescriptor __mingw_vfprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle __mingw_vfprintf$MH = RuntimeHelper.downcallHandle( - "__mingw_vfprintf", - constants$3.__mingw_vfprintf$FUNC - ); - static final FunctionDescriptor __mingw_vprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle __mingw_vprintf$MH = RuntimeHelper.downcallHandle( - "__mingw_vprintf", - constants$3.__mingw_vprintf$FUNC - ); - static final FunctionDescriptor __mingw_vsprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle __mingw_vsprintf$MH = RuntimeHelper.downcallHandle( - "__mingw_vsprintf", - constants$3.__mingw_vsprintf$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$4.java b/java-panama/src/main/java/foreign/c/constants$4.java deleted file mode 100644 index b5098ce7fd..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$4.java +++ /dev/null @@ -1,64 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$4 { - - static final FunctionDescriptor __mingw_vsnprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle __mingw_vsnprintf$MH = RuntimeHelper.downcallHandle( - "__mingw_vsnprintf", - constants$4.__mingw_vsnprintf$FUNC - ); - static final FunctionDescriptor _mingw_output_format_control$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG$LAYOUT - ); - static final MethodHandle _mingw_output_format_control$MH = RuntimeHelper.downcallHandle( - "_mingw_output_format_control", - constants$4._mingw_output_format_control$FUNC - ); - static final FunctionDescriptor fprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fprintf$MH = RuntimeHelper.downcallHandleVariadic( - "fprintf", - constants$4.fprintf$FUNC - ); - static final FunctionDescriptor printf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle printf$MH = RuntimeHelper.downcallHandleVariadic( - "printf", - constants$4.printf$FUNC - ); - static final FunctionDescriptor sprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle sprintf$MH = RuntimeHelper.downcallHandleVariadic( - "sprintf", - constants$4.sprintf$FUNC - ); - static final FunctionDescriptor vfprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle vfprintf$MH = RuntimeHelper.downcallHandle( - "vfprintf", - constants$4.vfprintf$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$5.java b/java-panama/src/main/java/foreign/c/constants$5.java deleted file mode 100644 index 663b2d6143..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$5.java +++ /dev/null @@ -1,63 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$5 { - - static final FunctionDescriptor vprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle vprintf$MH = RuntimeHelper.downcallHandle( - "vprintf", - constants$5.vprintf$FUNC - ); - static final FunctionDescriptor vsprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle vsprintf$MH = RuntimeHelper.downcallHandle( - "vsprintf", - constants$5.vsprintf$FUNC - ); - static final FunctionDescriptor __msvcrt_fprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle __msvcrt_fprintf$MH = RuntimeHelper.downcallHandleVariadic( - "__msvcrt_fprintf", - constants$5.__msvcrt_fprintf$FUNC - ); - static final FunctionDescriptor __msvcrt_printf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle __msvcrt_printf$MH = RuntimeHelper.downcallHandleVariadic( - "__msvcrt_printf", - constants$5.__msvcrt_printf$FUNC - ); - static final FunctionDescriptor __msvcrt_sprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle __msvcrt_sprintf$MH = RuntimeHelper.downcallHandleVariadic( - "__msvcrt_sprintf", - constants$5.__msvcrt_sprintf$FUNC - ); - static final FunctionDescriptor __msvcrt_vfprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle __msvcrt_vfprintf$MH = RuntimeHelper.downcallHandle( - "__msvcrt_vfprintf", - constants$5.__msvcrt_vfprintf$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$6.java b/java-panama/src/main/java/foreign/c/constants$6.java deleted file mode 100644 index c03430d45d..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$6.java +++ /dev/null @@ -1,67 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$6 { - - static final FunctionDescriptor __msvcrt_vprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle __msvcrt_vprintf$MH = RuntimeHelper.downcallHandle( - "__msvcrt_vprintf", - constants$6.__msvcrt_vprintf$FUNC - ); - static final FunctionDescriptor __msvcrt_vsprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle __msvcrt_vsprintf$MH = RuntimeHelper.downcallHandle( - "__msvcrt_vsprintf", - constants$6.__msvcrt_vsprintf$FUNC - ); - static final FunctionDescriptor _snprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle _snprintf$MH = RuntimeHelper.downcallHandleVariadic( - "_snprintf", - constants$6._snprintf$FUNC - ); - static final FunctionDescriptor _vsnprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle _vsnprintf$MH = RuntimeHelper.downcallHandle( - "_vsnprintf", - constants$6._vsnprintf$FUNC - ); - static final FunctionDescriptor _vscprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle _vscprintf$MH = RuntimeHelper.downcallHandle( - "_vscprintf", - constants$6._vscprintf$FUNC - ); - static final FunctionDescriptor snprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle snprintf$MH = RuntimeHelper.downcallHandleVariadic( - "snprintf", - constants$6.snprintf$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$7.java b/java-panama/src/main/java/foreign/c/constants$7.java deleted file mode 100644 index 21676e164a..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$7.java +++ /dev/null @@ -1,69 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$7 { - - static final FunctionDescriptor vsnprintf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle vsnprintf$MH = RuntimeHelper.downcallHandle( - "vsnprintf", - constants$7.vsnprintf$FUNC - ); - static final FunctionDescriptor vscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle vscanf$MH = RuntimeHelper.downcallHandle( - "vscanf", - constants$7.vscanf$FUNC - ); - static final FunctionDescriptor vfscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle vfscanf$MH = RuntimeHelper.downcallHandle( - "vfscanf", - constants$7.vfscanf$FUNC - ); - static final FunctionDescriptor vsscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle vsscanf$MH = RuntimeHelper.downcallHandle( - "vsscanf", - constants$7.vsscanf$FUNC - ); - static final FunctionDescriptor getdelim$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle getdelim$MH = RuntimeHelper.downcallHandle( - "getdelim", - constants$7.getdelim$FUNC - ); - static final FunctionDescriptor getline$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle getline$MH = RuntimeHelper.downcallHandle( - "getline", - constants$7.getline$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$8.java b/java-panama/src/main/java/foreign/c/constants$8.java deleted file mode 100644 index 5fb37ec59e..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$8.java +++ /dev/null @@ -1,61 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$8 { - - static final FunctionDescriptor fscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fscanf$MH = RuntimeHelper.downcallHandleVariadic( - "fscanf", - constants$8.fscanf$FUNC - ); - static final FunctionDescriptor scanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle scanf$MH = RuntimeHelper.downcallHandleVariadic( - "scanf", - constants$8.scanf$FUNC - ); - static final FunctionDescriptor sscanf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle sscanf$MH = RuntimeHelper.downcallHandleVariadic( - "sscanf", - constants$8.sscanf$FUNC - ); - static final FunctionDescriptor fgetc$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fgetc$MH = RuntimeHelper.downcallHandle( - "fgetc", - constants$8.fgetc$FUNC - ); - static final FunctionDescriptor fgets$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fgets$MH = RuntimeHelper.downcallHandle( - "fgets", - constants$8.fgets$FUNC - ); - static final FunctionDescriptor fputc$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fputc$MH = RuntimeHelper.downcallHandle( - "fputc", - constants$8.fputc$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/constants$9.java b/java-panama/src/main/java/foreign/c/constants$9.java deleted file mode 100644 index 1badf27ac5..0000000000 --- a/java-panama/src/main/java/foreign/c/constants$9.java +++ /dev/null @@ -1,59 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -class constants$9 { - - static final FunctionDescriptor fputs$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle fputs$MH = RuntimeHelper.downcallHandle( - "fputs", - constants$9.fputs$FUNC - ); - static final FunctionDescriptor gets$FUNC = FunctionDescriptor.of(Constants$root.C_POINTER$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle gets$MH = RuntimeHelper.downcallHandle( - "gets", - constants$9.gets$FUNC - ); - static final FunctionDescriptor puts$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle puts$MH = RuntimeHelper.downcallHandle( - "puts", - constants$9.puts$FUNC - ); - static final FunctionDescriptor ungetc$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle ungetc$MH = RuntimeHelper.downcallHandle( - "ungetc", - constants$9.ungetc$FUNC - ); - static final FunctionDescriptor _filbuf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle _filbuf$MH = RuntimeHelper.downcallHandle( - "_filbuf", - constants$9._filbuf$FUNC - ); - static final FunctionDescriptor _flsbuf$FUNC = FunctionDescriptor.of(Constants$root.C_LONG$LAYOUT, - Constants$root.C_LONG$LAYOUT, - Constants$root.C_POINTER$LAYOUT - ); - static final MethodHandle _flsbuf$MH = RuntimeHelper.downcallHandle( - "_flsbuf", - constants$9._flsbuf$FUNC - ); -} - - diff --git a/java-panama/src/main/java/foreign/c/stdio_h.java b/java-panama/src/main/java/foreign/c/stdio_h.java deleted file mode 100644 index 7aba552771..0000000000 --- a/java-panama/src/main/java/foreign/c/stdio_h.java +++ /dev/null @@ -1,1881 +0,0 @@ -// Generated by jextract - -package foreign.c; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.VarHandle; -import java.nio.ByteOrder; -import java.lang.foreign.*; -import static java.lang.foreign.ValueLayout.*; -public class stdio_h { - - /* package-private */ stdio_h() {} - public static OfByte C_CHAR = Constants$root.C_CHAR$LAYOUT; - public static OfShort C_SHORT = Constants$root.C_SHORT$LAYOUT; - public static OfInt C_INT = Constants$root.C_LONG$LAYOUT; - public static OfInt C_LONG = Constants$root.C_LONG$LAYOUT; - public static OfLong C_LONG_LONG = Constants$root.C_LONG_LONG$LAYOUT; - public static OfFloat C_FLOAT = Constants$root.C_FLOAT$LAYOUT; - public static OfDouble C_DOUBLE = Constants$root.C_DOUBLE$LAYOUT; - public static OfAddress C_POINTER = Constants$root.C_POINTER$LAYOUT; - public static int __MINGW32_MAJOR_VERSION() { - return (int)5L; - } - public static int __MINGW32_MINOR_VERSION() { - return (int)0L; - } - public static int __MINGW32_PATCHLEVEL() { - return (int)2L; - } - public static int __MSVCR60_DLL() { - return (int)1536L; - } - public static int __MSVCR61_DLL() { - return (int)1537L; - } - public static int __MSVCR70_DLL() { - return (int)1792L; - } - public static int __MSVCR71_DLL() { - return (int)1793L; - } - public static int __MSVCR80_DLL() { - return (int)2048L; - } - public static int __MSVCR90_DLL() { - return (int)2304L; - } - public static int __MSVCR100_DLL() { - return (int)4096L; - } - public static int __MSVCR110_DLL() { - return (int)4352L; - } - public static int __MSVCR120_DLL() { - return (int)4608L; - } - public static int __W32API_MAJOR_VERSION() { - return (int)5L; - } - public static int __W32API_MINOR_VERSION() { - return (int)0L; - } - public static int __W32API_PATCHLEVEL() { - return (int)2L; - } - public static int SPVERSION_MASK() { - return (int)65280L; - } - public static int SUBVERSION_MASK() { - return (int)255L; - } - public static int _WIN32_WINNT_NT4() { - return (int)1024L; - } - public static int _WIN32_WINNT_NT4E() { - return (int)1025L; - } - public static int _WIN32_WINNT_NT4SP3() { - return (int)1027L; - } - public static int _WIN32_WINDOWS_95() { - return (int)1024L; - } - public static int _WIN32_WINDOWS_98() { - return (int)1040L; - } - public static int _WIN32_WINDOWS_ME() { - return (int)1168L; - } - public static int _WIN32_WINNT_WIN2K() { - return (int)1280L; - } - public static int _WIN32_WINNT_WINXP() { - return (int)1281L; - } - public static int _WIN32_WINNT_WS03() { - return (int)1282L; - } - public static int _WIN32_WINNT_WIN6() { - return (int)1536L; - } - public static int _WIN32_WINNT_VISTA() { - return (int)1536L; - } - public static int _WIN32_WINNT_WS08() { - return (int)1536L; - } - public static int _WIN32_WINNT_LONGHORN() { - return (int)1536L; - } - public static int _WIN32_WINNT_WIN7() { - return (int)1537L; - } - public static int _WIN32_WINNT_WIN8() { - return (int)1538L; - } - public static int _WIN32_WINNT_WINBLUE() { - return (int)1539L; - } - public static int _WIN32_IE_IE50() { - return (int)1280L; - } - public static int _WIN32_IE_IE501() { - return (int)1281L; - } - public static int _WIN32_IE_IE55() { - return (int)1360L; - } - public static int _WIN32_IE_IE56() { - return (int)1376L; - } - public static int _WIN32_IE_IE60() { - return (int)1536L; - } - public static int _WIN32_IE_IE60SP1() { - return (int)1537L; - } - public static int _WIN32_IE_IE60SP2() { - return (int)1539L; - } - public static int _WIN32_IE_IE70() { - return (int)1792L; - } - public static int _WIN32_IE_IE80() { - return (int)2048L; - } - public static int _WIN32_IE_IE30() { - return (int)768L; - } - public static int _WIN32_IE_IE301() { - return (int)769L; - } - public static int _WIN32_IE_IE302() { - return (int)770L; - } - public static int _WIN32_IE_IE40() { - return (int)1024L; - } - public static int _WIN32_IE_IE401() { - return (int)1025L; - } - public static int __NTDDI_WIN5() { - return (int)83886080L; - } - public static int __NTDDI_WIN51() { - return (int)83951616L; - } - public static int __NTDDI_WIN52() { - return (int)84017152L; - } - public static int __NTDDI_WIN6() { - return (int)100663296L; - } - public static int __NTDDI_WIN61() { - return (int)100728832L; - } - public static int __NTDDI_WIN62() { - return (int)100794368L; - } - public static int __NTDDI_WIN63() { - return (int)100859904L; - } - public static int __NTDDI_SP0() { - return (int)0L; - } - public static int __NTDDI_SP1() { - return (int)256L; - } - public static int __NTDDI_SP2() { - return (int)512L; - } - public static int __NTDDI_SP3() { - return (int)768L; - } - public static int __NTDDI_SP4() { - return (int)1024L; - } - public static int __CRT_GLOB_USE_MSVCRT__() { - return (int)1L; - } - public static int __CRT_GLOB_USE_MINGW__() { - return (int)2L; - } - public static int __CRT_GLOB_USE_SINGLE_QUOTE__() { - return (int)16L; - } - public static int __CRT_GLOB_BRACKET_GROUPS__() { - return (int)32L; - } - public static int _EMULATE_GLIBC() { - return (int)1L; - } - public static int _ISOC99_SOURCE() { - return (int)7L; - } - public static int _MINGW32_SOURCE_EXTENDED() { - return (int)1L; - } - public static int _IOREAD() { - return (int)1L; - } - public static int _IOWRT() { - return (int)2L; - } - public static int _IORW() { - return (int)128L; - } - public static int STDIN_FILENO() { - return (int)0L; - } - public static int STDOUT_FILENO() { - return (int)1L; - } - public static int STDERR_FILENO() { - return (int)2L; - } - public static int TMP_MAX() { - return (int)32767L; - } - public static int _IOFBF() { - return (int)0L; - } - public static int _IOLBF() { - return (int)64L; - } - public static int _IONBF() { - return (int)4L; - } - public static int _IOMYBUF() { - return (int)8L; - } - public static int _IOEOF() { - return (int)16L; - } - public static int _IOERR() { - return (int)32L; - } - public static int _IOSTRG() { - return (int)64L; - } - public static int BUFSIZ() { - return (int)512L; - } - public static int SEEK_SET() { - return (int)0L; - } - public static int SEEK_CUR() { - return (int)1L; - } - public static int SEEK_END() { - return (int)2L; - } - public static int _TWO_DIGIT_EXPONENT() { - return (int)1L; - } - public static int _THREE_DIGIT_EXPONENT() { - return (int)0L; - } - public static int __USE_MINGW_PRINTF() { - return (int)0L; - } - public static OfInt __off32_t = Constants$root.C_LONG$LAYOUT; - public static OfInt _off_t = Constants$root.C_LONG$LAYOUT; - public static OfInt off_t = Constants$root.C_LONG$LAYOUT; - public static OfInt _ssize_t = Constants$root.C_LONG$LAYOUT; - public static OfInt ssize_t = Constants$root.C_LONG$LAYOUT; - public static MethodHandle fopen$MH() { - return RuntimeHelper.requireNonNull(constants$0.fopen$MH,"fopen"); - } - public static MemoryAddress fopen ( Addressable x0, Addressable x1) { - var mh$ = fopen$MH(); - try { - return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle freopen$MH() { - return RuntimeHelper.requireNonNull(constants$0.freopen$MH,"freopen"); - } - public static MemoryAddress freopen ( Addressable x0, Addressable x1, Addressable x2) { - var mh$ = freopen$MH(); - try { - return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fflush$MH() { - return RuntimeHelper.requireNonNull(constants$0.fflush$MH,"fflush"); - } - public static int fflush ( Addressable x0) { - var mh$ = fflush$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fclose$MH() { - return RuntimeHelper.requireNonNull(constants$0.fclose$MH,"fclose"); - } - public static int fclose ( Addressable x0) { - var mh$ = fclose$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle remove$MH() { - return RuntimeHelper.requireNonNull(constants$0.remove$MH,"remove"); - } - public static int remove ( Addressable x0) { - var mh$ = remove$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle rename$MH() { - return RuntimeHelper.requireNonNull(constants$1.rename$MH,"rename"); - } - public static int rename ( Addressable x0, Addressable x1) { - var mh$ = rename$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle tmpfile$MH() { - return RuntimeHelper.requireNonNull(constants$1.tmpfile$MH,"tmpfile"); - } - public static MemoryAddress tmpfile () { - var mh$ = tmpfile$MH(); - try { - return (java.lang.foreign.MemoryAddress)mh$.invokeExact(); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle tmpnam$MH() { - return RuntimeHelper.requireNonNull(constants$1.tmpnam$MH,"tmpnam"); - } - public static MemoryAddress tmpnam ( Addressable x0) { - var mh$ = tmpnam$MH(); - try { - return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _tempnam$MH() { - return RuntimeHelper.requireNonNull(constants$1._tempnam$MH,"_tempnam"); - } - public static MemoryAddress _tempnam ( Addressable x0, Addressable x1) { - var mh$ = _tempnam$MH(); - try { - return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _rmtmp$MH() { - return RuntimeHelper.requireNonNull(constants$1._rmtmp$MH,"_rmtmp"); - } - public static int _rmtmp () { - var mh$ = _rmtmp$MH(); - try { - return (int)mh$.invokeExact(); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _unlink$MH() { - return RuntimeHelper.requireNonNull(constants$1._unlink$MH,"_unlink"); - } - public static int _unlink ( Addressable x0) { - var mh$ = _unlink$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle tempnam$MH() { - return RuntimeHelper.requireNonNull(constants$2.tempnam$MH,"tempnam"); - } - public static MemoryAddress tempnam ( Addressable x0, Addressable x1) { - var mh$ = tempnam$MH(); - try { - return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle rmtmp$MH() { - return RuntimeHelper.requireNonNull(constants$2.rmtmp$MH,"rmtmp"); - } - public static int rmtmp () { - var mh$ = rmtmp$MH(); - try { - return (int)mh$.invokeExact(); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle unlink$MH() { - return RuntimeHelper.requireNonNull(constants$2.unlink$MH,"unlink"); - } - public static int unlink ( Addressable x0) { - var mh$ = unlink$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle setvbuf$MH() { - return RuntimeHelper.requireNonNull(constants$2.setvbuf$MH,"setvbuf"); - } - public static int setvbuf ( Addressable x0, Addressable x1, int x2, long x3) { - var mh$ = setvbuf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2, x3); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle setbuf$MH() { - return RuntimeHelper.requireNonNull(constants$2.setbuf$MH,"setbuf"); - } - public static void setbuf ( Addressable x0, Addressable x1) { - var mh$ = setbuf$MH(); - try { - mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __mingw_fprintf$MH() { - return RuntimeHelper.requireNonNull(constants$2.__mingw_fprintf$MH,"__mingw_fprintf"); - } - public static int __mingw_fprintf ( Addressable x0, Addressable x1, Object... x2) { - var mh$ = __mingw_fprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __mingw_printf$MH() { - return RuntimeHelper.requireNonNull(constants$3.__mingw_printf$MH,"__mingw_printf"); - } - public static int __mingw_printf ( Addressable x0, Object... x1) { - var mh$ = __mingw_printf$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __mingw_sprintf$MH() { - return RuntimeHelper.requireNonNull(constants$3.__mingw_sprintf$MH,"__mingw_sprintf"); - } - public static int __mingw_sprintf ( Addressable x0, Addressable x1, Object... x2) { - var mh$ = __mingw_sprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __mingw_snprintf$MH() { - return RuntimeHelper.requireNonNull(constants$3.__mingw_snprintf$MH,"__mingw_snprintf"); - } - public static int __mingw_snprintf ( Addressable x0, long x1, Addressable x2, Object... x3) { - var mh$ = __mingw_snprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2, x3); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __mingw_vfprintf$MH() { - return RuntimeHelper.requireNonNull(constants$3.__mingw_vfprintf$MH,"__mingw_vfprintf"); - } - public static int __mingw_vfprintf ( Addressable x0, Addressable x1, Addressable x2) { - var mh$ = __mingw_vfprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __mingw_vprintf$MH() { - return RuntimeHelper.requireNonNull(constants$3.__mingw_vprintf$MH,"__mingw_vprintf"); - } - public static int __mingw_vprintf ( Addressable x0, Addressable x1) { - var mh$ = __mingw_vprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __mingw_vsprintf$MH() { - return RuntimeHelper.requireNonNull(constants$3.__mingw_vsprintf$MH,"__mingw_vsprintf"); - } - public static int __mingw_vsprintf ( Addressable x0, Addressable x1, Addressable x2) { - var mh$ = __mingw_vsprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __mingw_vsnprintf$MH() { - return RuntimeHelper.requireNonNull(constants$4.__mingw_vsnprintf$MH,"__mingw_vsnprintf"); - } - public static int __mingw_vsnprintf ( Addressable x0, long x1, Addressable x2, Addressable x3) { - var mh$ = __mingw_vsnprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2, x3); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _mingw_output_format_control$MH() { - return RuntimeHelper.requireNonNull(constants$4._mingw_output_format_control$MH,"_mingw_output_format_control"); - } - public static int _mingw_output_format_control ( int x0, int x1) { - var mh$ = _mingw_output_format_control$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fprintf$MH() { - return RuntimeHelper.requireNonNull(constants$4.fprintf$MH,"fprintf"); - } - public static int fprintf ( Addressable x0, Addressable x1, Object... x2) { - var mh$ = fprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle printf$MH() { - return RuntimeHelper.requireNonNull(constants$4.printf$MH,"printf"); - } - public static int printf ( Addressable x0, Object... x1) { - var mh$ = printf$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle sprintf$MH() { - return RuntimeHelper.requireNonNull(constants$4.sprintf$MH,"sprintf"); - } - public static int sprintf ( Addressable x0, Addressable x1, Object... x2) { - var mh$ = sprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle vfprintf$MH() { - return RuntimeHelper.requireNonNull(constants$4.vfprintf$MH,"vfprintf"); - } - public static int vfprintf ( Addressable x0, Addressable x1, Addressable x2) { - var mh$ = vfprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle vprintf$MH() { - return RuntimeHelper.requireNonNull(constants$5.vprintf$MH,"vprintf"); - } - public static int vprintf ( Addressable x0, Addressable x1) { - var mh$ = vprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle vsprintf$MH() { - return RuntimeHelper.requireNonNull(constants$5.vsprintf$MH,"vsprintf"); - } - public static int vsprintf ( Addressable x0, Addressable x1, Addressable x2) { - var mh$ = vsprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __msvcrt_fprintf$MH() { - return RuntimeHelper.requireNonNull(constants$5.__msvcrt_fprintf$MH,"__msvcrt_fprintf"); - } - public static int __msvcrt_fprintf ( Addressable x0, Addressable x1, Object... x2) { - var mh$ = __msvcrt_fprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __msvcrt_printf$MH() { - return RuntimeHelper.requireNonNull(constants$5.__msvcrt_printf$MH,"__msvcrt_printf"); - } - public static int __msvcrt_printf ( Addressable x0, Object... x1) { - var mh$ = __msvcrt_printf$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __msvcrt_sprintf$MH() { - return RuntimeHelper.requireNonNull(constants$5.__msvcrt_sprintf$MH,"__msvcrt_sprintf"); - } - public static int __msvcrt_sprintf ( Addressable x0, Addressable x1, Object... x2) { - var mh$ = __msvcrt_sprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __msvcrt_vfprintf$MH() { - return RuntimeHelper.requireNonNull(constants$5.__msvcrt_vfprintf$MH,"__msvcrt_vfprintf"); - } - public static int __msvcrt_vfprintf ( Addressable x0, Addressable x1, Addressable x2) { - var mh$ = __msvcrt_vfprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __msvcrt_vprintf$MH() { - return RuntimeHelper.requireNonNull(constants$6.__msvcrt_vprintf$MH,"__msvcrt_vprintf"); - } - public static int __msvcrt_vprintf ( Addressable x0, Addressable x1) { - var mh$ = __msvcrt_vprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __msvcrt_vsprintf$MH() { - return RuntimeHelper.requireNonNull(constants$6.__msvcrt_vsprintf$MH,"__msvcrt_vsprintf"); - } - public static int __msvcrt_vsprintf ( Addressable x0, Addressable x1, Addressable x2) { - var mh$ = __msvcrt_vsprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _snprintf$MH() { - return RuntimeHelper.requireNonNull(constants$6._snprintf$MH,"_snprintf"); - } - public static int _snprintf ( Addressable x0, long x1, Addressable x2, Object... x3) { - var mh$ = _snprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2, x3); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _vsnprintf$MH() { - return RuntimeHelper.requireNonNull(constants$6._vsnprintf$MH,"_vsnprintf"); - } - public static int _vsnprintf ( Addressable x0, long x1, Addressable x2, Addressable x3) { - var mh$ = _vsnprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2, x3); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _vscprintf$MH() { - return RuntimeHelper.requireNonNull(constants$6._vscprintf$MH,"_vscprintf"); - } - public static int _vscprintf ( Addressable x0, Addressable x1) { - var mh$ = _vscprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle snprintf$MH() { - return RuntimeHelper.requireNonNull(constants$6.snprintf$MH,"snprintf"); - } - public static int snprintf ( Addressable x0, long x1, Addressable x2, Object... x3) { - var mh$ = snprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2, x3); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle vsnprintf$MH() { - return RuntimeHelper.requireNonNull(constants$7.vsnprintf$MH,"vsnprintf"); - } - public static int vsnprintf ( Addressable x0, long x1, Addressable x2, Addressable x3) { - var mh$ = vsnprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2, x3); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle vscanf$MH() { - return RuntimeHelper.requireNonNull(constants$7.vscanf$MH,"vscanf"); - } - public static int vscanf ( Addressable x0, Addressable x1) { - var mh$ = vscanf$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle vfscanf$MH() { - return RuntimeHelper.requireNonNull(constants$7.vfscanf$MH,"vfscanf"); - } - public static int vfscanf ( Addressable x0, Addressable x1, Addressable x2) { - var mh$ = vfscanf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle vsscanf$MH() { - return RuntimeHelper.requireNonNull(constants$7.vsscanf$MH,"vsscanf"); - } - public static int vsscanf ( Addressable x0, Addressable x1, Addressable x2) { - var mh$ = vsscanf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle getdelim$MH() { - return RuntimeHelper.requireNonNull(constants$7.getdelim$MH,"getdelim"); - } - public static int getdelim ( Addressable x0, Addressable x1, int x2, Addressable x3) { - var mh$ = getdelim$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2, x3); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle getline$MH() { - return RuntimeHelper.requireNonNull(constants$7.getline$MH,"getline"); - } - public static int getline ( Addressable x0, Addressable x1, Addressable x2) { - var mh$ = getline$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fscanf$MH() { - return RuntimeHelper.requireNonNull(constants$8.fscanf$MH,"fscanf"); - } - public static int fscanf ( Addressable x0, Addressable x1, Object... x2) { - var mh$ = fscanf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle scanf$MH() { - return RuntimeHelper.requireNonNull(constants$8.scanf$MH,"scanf"); - } - public static int scanf ( Addressable x0, Object... x1) { - var mh$ = scanf$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle sscanf$MH() { - return RuntimeHelper.requireNonNull(constants$8.sscanf$MH,"sscanf"); - } - public static int sscanf ( Addressable x0, Addressable x1, Object... x2) { - var mh$ = sscanf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fgetc$MH() { - return RuntimeHelper.requireNonNull(constants$8.fgetc$MH,"fgetc"); - } - public static int fgetc ( Addressable x0) { - var mh$ = fgetc$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fgets$MH() { - return RuntimeHelper.requireNonNull(constants$8.fgets$MH,"fgets"); - } - public static MemoryAddress fgets ( Addressable x0, int x1, Addressable x2) { - var mh$ = fgets$MH(); - try { - return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fputc$MH() { - return RuntimeHelper.requireNonNull(constants$8.fputc$MH,"fputc"); - } - public static int fputc ( int x0, Addressable x1) { - var mh$ = fputc$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fputs$MH() { - return RuntimeHelper.requireNonNull(constants$9.fputs$MH,"fputs"); - } - public static int fputs ( Addressable x0, Addressable x1) { - var mh$ = fputs$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle gets$MH() { - return RuntimeHelper.requireNonNull(constants$9.gets$MH,"gets"); - } - public static MemoryAddress gets ( Addressable x0) { - var mh$ = gets$MH(); - try { - return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle puts$MH() { - return RuntimeHelper.requireNonNull(constants$9.puts$MH,"puts"); - } - public static int puts ( Addressable x0) { - var mh$ = puts$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle ungetc$MH() { - return RuntimeHelper.requireNonNull(constants$9.ungetc$MH,"ungetc"); - } - public static int ungetc ( int x0, Addressable x1) { - var mh$ = ungetc$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _filbuf$MH() { - return RuntimeHelper.requireNonNull(constants$9._filbuf$MH,"_filbuf"); - } - public static int _filbuf ( Addressable x0) { - var mh$ = _filbuf$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _flsbuf$MH() { - return RuntimeHelper.requireNonNull(constants$9._flsbuf$MH,"_flsbuf"); - } - public static int _flsbuf ( int x0, Addressable x1) { - var mh$ = _flsbuf$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle getc$MH() { - return RuntimeHelper.requireNonNull(constants$10.getc$MH,"getc"); - } - public static int getc ( Addressable x0) { - var mh$ = getc$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle putc$MH() { - return RuntimeHelper.requireNonNull(constants$10.putc$MH,"putc"); - } - public static int putc ( int x0, Addressable x1) { - var mh$ = putc$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle getchar$MH() { - return RuntimeHelper.requireNonNull(constants$10.getchar$MH,"getchar"); - } - public static int getchar () { - var mh$ = getchar$MH(); - try { - return (int)mh$.invokeExact(); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle putchar$MH() { - return RuntimeHelper.requireNonNull(constants$10.putchar$MH,"putchar"); - } - public static int putchar ( int x0) { - var mh$ = putchar$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fread$MH() { - return RuntimeHelper.requireNonNull(constants$10.fread$MH,"fread"); - } - public static long fread ( Addressable x0, long x1, long x2, Addressable x3) { - var mh$ = fread$MH(); - try { - return (long)mh$.invokeExact(x0, x1, x2, x3); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fwrite$MH() { - return RuntimeHelper.requireNonNull(constants$10.fwrite$MH,"fwrite"); - } - public static long fwrite ( Addressable x0, long x1, long x2, Addressable x3) { - var mh$ = fwrite$MH(); - try { - return (long)mh$.invokeExact(x0, x1, x2, x3); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fseek$MH() { - return RuntimeHelper.requireNonNull(constants$11.fseek$MH,"fseek"); - } - public static int fseek ( Addressable x0, int x1, int x2) { - var mh$ = fseek$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle ftell$MH() { - return RuntimeHelper.requireNonNull(constants$11.ftell$MH,"ftell"); - } - public static int ftell ( Addressable x0) { - var mh$ = ftell$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle rewind$MH() { - return RuntimeHelper.requireNonNull(constants$11.rewind$MH,"rewind"); - } - public static void rewind ( Addressable x0) { - var mh$ = rewind$MH(); - try { - mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static OfInt fpos_t = Constants$root.C_LONG$LAYOUT; - public static MethodHandle fgetpos$MH() { - return RuntimeHelper.requireNonNull(constants$11.fgetpos$MH,"fgetpos"); - } - public static int fgetpos ( Addressable x0, Addressable x1) { - var mh$ = fgetpos$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fsetpos$MH() { - return RuntimeHelper.requireNonNull(constants$11.fsetpos$MH,"fsetpos"); - } - public static int fsetpos ( Addressable x0, Addressable x1) { - var mh$ = fsetpos$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle feof$MH() { - return RuntimeHelper.requireNonNull(constants$11.feof$MH,"feof"); - } - public static int feof ( Addressable x0) { - var mh$ = feof$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle ferror$MH() { - return RuntimeHelper.requireNonNull(constants$12.ferror$MH,"ferror"); - } - public static int ferror ( Addressable x0) { - var mh$ = ferror$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle clearerr$MH() { - return RuntimeHelper.requireNonNull(constants$12.clearerr$MH,"clearerr"); - } - public static void clearerr ( Addressable x0) { - var mh$ = clearerr$MH(); - try { - mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle perror$MH() { - return RuntimeHelper.requireNonNull(constants$12.perror$MH,"perror"); - } - public static void perror ( Addressable x0) { - var mh$ = perror$MH(); - try { - mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _popen$MH() { - return RuntimeHelper.requireNonNull(constants$12._popen$MH,"_popen"); - } - public static MemoryAddress _popen ( Addressable x0, Addressable x1) { - var mh$ = _popen$MH(); - try { - return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _pclose$MH() { - return RuntimeHelper.requireNonNull(constants$12._pclose$MH,"_pclose"); - } - public static int _pclose ( Addressable x0) { - var mh$ = _pclose$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle popen$MH() { - return RuntimeHelper.requireNonNull(constants$12.popen$MH,"popen"); - } - public static MemoryAddress popen ( Addressable x0, Addressable x1) { - var mh$ = popen$MH(); - try { - return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle pclose$MH() { - return RuntimeHelper.requireNonNull(constants$13.pclose$MH,"pclose"); - } - public static int pclose ( Addressable x0) { - var mh$ = pclose$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _flushall$MH() { - return RuntimeHelper.requireNonNull(constants$13._flushall$MH,"_flushall"); - } - public static int _flushall () { - var mh$ = _flushall$MH(); - try { - return (int)mh$.invokeExact(); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _fgetchar$MH() { - return RuntimeHelper.requireNonNull(constants$13._fgetchar$MH,"_fgetchar"); - } - public static int _fgetchar () { - var mh$ = _fgetchar$MH(); - try { - return (int)mh$.invokeExact(); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _fputchar$MH() { - return RuntimeHelper.requireNonNull(constants$13._fputchar$MH,"_fputchar"); - } - public static int _fputchar ( int x0) { - var mh$ = _fputchar$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _fdopen$MH() { - return RuntimeHelper.requireNonNull(constants$13._fdopen$MH,"_fdopen"); - } - public static MemoryAddress _fdopen ( int x0, Addressable x1) { - var mh$ = _fdopen$MH(); - try { - return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _fileno$MH() { - return RuntimeHelper.requireNonNull(constants$13._fileno$MH,"_fileno"); - } - public static int _fileno ( Addressable x0) { - var mh$ = _fileno$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _fcloseall$MH() { - return RuntimeHelper.requireNonNull(constants$14._fcloseall$MH,"_fcloseall"); - } - public static int _fcloseall () { - var mh$ = _fcloseall$MH(); - try { - return (int)mh$.invokeExact(); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _fsopen$MH() { - return RuntimeHelper.requireNonNull(constants$14._fsopen$MH,"_fsopen"); - } - public static MemoryAddress _fsopen ( Addressable x0, Addressable x1, int x2) { - var mh$ = _fsopen$MH(); - try { - return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __mingw_get_output_format$MH() { - return RuntimeHelper.requireNonNull(constants$14.__mingw_get_output_format$MH,"__mingw_get_output_format"); - } - public static int __mingw_get_output_format () { - var mh$ = __mingw_get_output_format$MH(); - try { - return (int)mh$.invokeExact(); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __mingw_set_output_format$MH() { - return RuntimeHelper.requireNonNull(constants$14.__mingw_set_output_format$MH,"__mingw_set_output_format"); - } - public static int __mingw_set_output_format ( int x0) { - var mh$ = __mingw_set_output_format$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __mingw_get_printf_count_output$MH() { - return RuntimeHelper.requireNonNull(constants$14.__mingw_get_printf_count_output$MH,"__mingw_get_printf_count_output"); - } - public static int __mingw_get_printf_count_output () { - var mh$ = __mingw_get_printf_count_output$MH(); - try { - return (int)mh$.invokeExact(); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle __mingw_set_printf_count_output$MH() { - return RuntimeHelper.requireNonNull(constants$14.__mingw_set_printf_count_output$MH,"__mingw_set_printf_count_output"); - } - public static int __mingw_set_printf_count_output ( int x0) { - var mh$ = __mingw_set_printf_count_output$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _get_output_format$MH() { - return RuntimeHelper.requireNonNull(constants$15._get_output_format$MH,"_get_output_format"); - } - public static int _get_output_format () { - var mh$ = _get_output_format$MH(); - try { - return (int)mh$.invokeExact(); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _set_output_format$MH() { - return RuntimeHelper.requireNonNull(constants$15._set_output_format$MH,"_set_output_format"); - } - public static int _set_output_format ( int __style) { - var mh$ = _set_output_format$MH(); - try { - return (int)mh$.invokeExact(__style); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _get_printf_count_output$MH() { - return RuntimeHelper.requireNonNull(constants$15._get_printf_count_output$MH,"_get_printf_count_output"); - } - public static int _get_printf_count_output () { - var mh$ = _get_printf_count_output$MH(); - try { - return (int)mh$.invokeExact(); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _set_printf_count_output$MH() { - return RuntimeHelper.requireNonNull(constants$15._set_printf_count_output$MH,"_set_printf_count_output"); - } - public static int _set_printf_count_output ( int __mode) { - var mh$ = _set_printf_count_output$MH(); - try { - return (int)mh$.invokeExact(__mode); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fgetchar$MH() { - return RuntimeHelper.requireNonNull(constants$15.fgetchar$MH,"fgetchar"); - } - public static int fgetchar () { - var mh$ = fgetchar$MH(); - try { - return (int)mh$.invokeExact(); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fputchar$MH() { - return RuntimeHelper.requireNonNull(constants$15.fputchar$MH,"fputchar"); - } - public static int fputchar ( int x0) { - var mh$ = fputchar$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fdopen$MH() { - return RuntimeHelper.requireNonNull(constants$16.fdopen$MH,"fdopen"); - } - public static MemoryAddress fdopen ( int x0, Addressable x1) { - var mh$ = fdopen$MH(); - try { - return (java.lang.foreign.MemoryAddress)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fileno$MH() { - return RuntimeHelper.requireNonNull(constants$16.fileno$MH,"fileno"); - } - public static int fileno ( Addressable x0) { - var mh$ = fileno$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fwprintf$MH() { - return RuntimeHelper.requireNonNull(constants$16.fwprintf$MH,"fwprintf"); - } - public static int fwprintf ( Addressable x0, Addressable x1, Object... x2) { - var mh$ = fwprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle wprintf$MH() { - return RuntimeHelper.requireNonNull(constants$16.wprintf$MH,"wprintf"); - } - public static int wprintf ( Addressable x0, Object... x1) { - var mh$ = wprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle vfwprintf$MH() { - return RuntimeHelper.requireNonNull(constants$16.vfwprintf$MH,"vfwprintf"); - } - public static int vfwprintf ( Addressable x0, Addressable x1, Addressable x2) { - var mh$ = vfwprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle vwprintf$MH() { - return RuntimeHelper.requireNonNull(constants$16.vwprintf$MH,"vwprintf"); - } - public static int vwprintf ( Addressable x0, Addressable x1) { - var mh$ = vwprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _snwprintf$MH() { - return RuntimeHelper.requireNonNull(constants$17._snwprintf$MH,"_snwprintf"); - } - public static int _snwprintf ( Addressable x0, long x1, Addressable x2, Object... x3) { - var mh$ = _snwprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2, x3); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _vscwprintf$MH() { - return RuntimeHelper.requireNonNull(constants$17._vscwprintf$MH,"_vscwprintf"); - } - public static int _vscwprintf ( Addressable x0, Addressable x1) { - var mh$ = _vscwprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _vsnwprintf$MH() { - return RuntimeHelper.requireNonNull(constants$17._vsnwprintf$MH,"_vsnwprintf"); - } - public static int _vsnwprintf ( Addressable x0, long x1, Addressable x2, Addressable x3) { - var mh$ = _vsnwprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2, x3); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fwscanf$MH() { - return RuntimeHelper.requireNonNull(constants$17.fwscanf$MH,"fwscanf"); - } - public static int fwscanf ( Addressable x0, Addressable x1, Object... x2) { - var mh$ = fwscanf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle wscanf$MH() { - return RuntimeHelper.requireNonNull(constants$17.wscanf$MH,"wscanf"); - } - public static int wscanf ( Addressable x0, Object... x1) { - var mh$ = wscanf$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle swscanf$MH() { - return RuntimeHelper.requireNonNull(constants$17.swscanf$MH,"swscanf"); - } - public static int swscanf ( Addressable x0, Addressable x1, Object... x2) { - var mh$ = swscanf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fgetwc$MH() { - return RuntimeHelper.requireNonNull(constants$18.fgetwc$MH,"fgetwc"); - } - public static short fgetwc ( Addressable x0) { - var mh$ = fgetwc$MH(); - try { - return (short)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fputwc$MH() { - return RuntimeHelper.requireNonNull(constants$18.fputwc$MH,"fputwc"); - } - public static short fputwc ( short x0, Addressable x1) { - var mh$ = fputwc$MH(); - try { - return (short)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle ungetwc$MH() { - return RuntimeHelper.requireNonNull(constants$18.ungetwc$MH,"ungetwc"); - } - public static short ungetwc ( short x0, Addressable x1) { - var mh$ = ungetwc$MH(); - try { - return (short)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle swprintf$MH() { - return RuntimeHelper.requireNonNull(constants$18.swprintf$MH,"swprintf"); - } - public static int swprintf ( Addressable x0, Addressable x1, Object... x2) { - var mh$ = swprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle vswprintf$MH() { - return RuntimeHelper.requireNonNull(constants$18.vswprintf$MH,"vswprintf"); - } - public static int vswprintf ( Addressable x0, Addressable x1, Addressable x2) { - var mh$ = vswprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle snwprintf$MH() { - return RuntimeHelper.requireNonNull(constants$18.snwprintf$MH,"snwprintf"); - } - public static int snwprintf ( Addressable x0, long x1, Addressable x2, Object... x3) { - var mh$ = snwprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2, x3); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle vsnwprintf$MH() { - return RuntimeHelper.requireNonNull(constants$19.vsnwprintf$MH,"vsnwprintf"); - } - public static int vsnwprintf ( Addressable x0, long x1, Addressable x2, Addressable x3) { - var mh$ = vsnwprintf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2, x3); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle vwscanf$MH() { - return RuntimeHelper.requireNonNull(constants$19.vwscanf$MH,"vwscanf"); - } - public static int vwscanf ( Addressable x0, Addressable x1) { - var mh$ = vwscanf$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle vfwscanf$MH() { - return RuntimeHelper.requireNonNull(constants$19.vfwscanf$MH,"vfwscanf"); - } - public static int vfwscanf ( Addressable x0, Addressable x1, Addressable x2) { - var mh$ = vfwscanf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle vswscanf$MH() { - return RuntimeHelper.requireNonNull(constants$19.vswscanf$MH,"vswscanf"); - } - public static int vswscanf ( Addressable x0, Addressable x1, Addressable x2) { - var mh$ = vswscanf$MH(); - try { - return (int)mh$.invokeExact(x0, x1, x2); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _fgetwchar$MH() { - return RuntimeHelper.requireNonNull(constants$19._fgetwchar$MH,"_fgetwchar"); - } - public static short _fgetwchar () { - var mh$ = _fgetwchar$MH(); - try { - return (short)mh$.invokeExact(); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _fputwchar$MH() { - return RuntimeHelper.requireNonNull(constants$19._fputwchar$MH,"_fputwchar"); - } - public static short _fputwchar ( short x0) { - var mh$ = _fputwchar$MH(); - try { - return (short)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _getw$MH() { - return RuntimeHelper.requireNonNull(constants$20._getw$MH,"_getw"); - } - public static int _getw ( Addressable x0) { - var mh$ = _getw$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle _putw$MH() { - return RuntimeHelper.requireNonNull(constants$20._putw$MH,"_putw"); - } - public static int _putw ( int x0, Addressable x1) { - var mh$ = _putw$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fgetwchar$MH() { - return RuntimeHelper.requireNonNull(constants$20.fgetwchar$MH,"fgetwchar"); - } - public static short fgetwchar () { - var mh$ = fgetwchar$MH(); - try { - return (short)mh$.invokeExact(); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle fputwchar$MH() { - return RuntimeHelper.requireNonNull(constants$20.fputwchar$MH,"fputwchar"); - } - public static short fputwchar ( short x0) { - var mh$ = fputwchar$MH(); - try { - return (short)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle getw$MH() { - return RuntimeHelper.requireNonNull(constants$20.getw$MH,"getw"); - } - public static int getw ( Addressable x0) { - var mh$ = getw$MH(); - try { - return (int)mh$.invokeExact(x0); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static MethodHandle putw$MH() { - return RuntimeHelper.requireNonNull(constants$20.putw$MH,"putw"); - } - public static int putw ( int x0, Addressable x1) { - var mh$ = putw$MH(); - try { - return (int)mh$.invokeExact(x0, x1); - } catch (Throwable ex$) { - throw new AssertionError("should not reach here", ex$); - } - } - public static int __MINGW32_VERSION() { - return (int)5000002L; - } - public static int __MSVCRT_VERSION__() { - return (int)1536L; - } - public static int __W32API_VERSION() { - return (int)5000002L; - } - public static int OSVERSION_MASK() { - return (int)4294901760L; - } - public static int NTDDI_WIN2K() { - return (int)83886080L; - } - public static int NTDDI_WIN2KSP1() { - return (int)83886336L; - } - public static int NTDDI_WIN2KSP2() { - return (int)83886592L; - } - public static int NTDDI_WIN2KSP3() { - return (int)83886848L; - } - public static int NTDDI_WIN2KSP4() { - return (int)83887104L; - } - public static int NTDDI_WINXP() { - return (int)83951616L; - } - public static int NTDDI_WINXPSP1() { - return (int)83951872L; - } - public static int NTDDI_WINXPSP2() { - return (int)83952128L; - } - public static int NTDDI_WINXPSP3() { - return (int)83952384L; - } - public static int NTDDI_WS03() { - return (int)84017152L; - } - public static int NTDDI_WS03SP1() { - return (int)84017408L; - } - public static int NTDDI_WS03SP2() { - return (int)84017664L; - } - public static int NTDDI_VISTA() { - return (int)100663296L; - } - public static int NTDDI_VISTASP1() { - return (int)100663552L; - } - public static int NTDDI_VISTASP2() { - return (int)100663808L; - } - public static int NTDDI_LONGHORN() { - return (int)100663296L; - } - public static int NTDDI_WIN6() { - return (int)100663296L; - } - public static int NTDDI_WIN6SP1() { - return (int)100663552L; - } - public static int NTDDI_WIN6SP2() { - return (int)100663808L; - } - public static int NTDDI_WS08() { - return (int)100663552L; - } - public static int NTDDI_WIN7() { - return (int)100728832L; - } - public static int NTDDI_WIN8() { - return (int)100794368L; - } - public static int NTDDI_WINBLUE() { - return (int)100859904L; - } - public static int _WIN32_WINNT() { - return (int)1280L; - } - public static int WINVER() { - return (int)1280L; - } - public static int NTDDI_VERSION() { - return (int)83886080L; - } - public static int Windows95() { - return (int)1024L; - } - public static int Windows98() { - return (int)1040L; - } - public static int WindowsME() { - return (int)1168L; - } - public static int WindowsNT4() { - return (int)1024L; - } - public static int Windows2000() { - return (int)1280L; - } - public static int WindowsXP() { - return (int)1281L; - } - public static int Windows2003() { - return (int)1282L; - } - public static int WindowsVista() { - return (int)1536L; - } - public static int IE3() { - return (int)768L; - } - public static int IE301() { - return (int)769L; - } - public static int IE302() { - return (int)770L; - } - public static int IE4() { - return (int)1024L; - } - public static int IE401() { - return (int)1025L; - } - public static int IE5() { - return (int)1280L; - } - public static int IE5a() { - return (int)1280L; - } - public static int IE5b() { - return (int)1280L; - } - public static int IE501() { - return (int)1281L; - } - public static int IE55() { - return (int)1360L; - } - public static int IE56() { - return (int)1376L; - } - public static int IE6() { - return (int)1536L; - } - public static int IE601() { - return (int)1537L; - } - public static int IE602() { - return (int)1539L; - } - public static int IE7() { - return (int)1792L; - } - public static byte __CRT_GLOB_ESCAPE_CHAR__() { - return (byte)127L; - } - public static long __MINGW_ANSI_STDIO__() { - return 1L; - } - public static long __MINGW_LC_EXTENSIONS__() { - return 80L; - } - public static long __MINGW_LC_MESSAGES__() { - return 16L; - } - public static long __MINGW_LC_ENVVARS__() { - return 64L; - } - public static int _POSIX_C_SOURCE() { - return (int)200809L; - } - public static MemoryAddress NULL() { - return constants$21.NULL$ADDR; - } - public static int EOF() { - return (int)-1L; - } - public static int FILENAME_MAX() { - return (int)260L; - } - public static int FOPEN_MAX() { - return (int)20L; - } - public static MemorySegment _P_tmpdir() { - return constants$21._P_tmpdir$SEGMENT; - } - public static MemorySegment P_tmpdir() { - return constants$21.P_tmpdir$SEGMENT; - } - public static MemorySegment _wP_tmpdir() { - return constants$21._wP_tmpdir$SEGMENT; - } - public static int L_tmpnam() { - return (int)16L; - } - public static int _MSVC_PRINTF_QUIRKS() { - return (int)256L; - } - public static int _QUERY_MSVC_PRINTF_QUIRKS() { - return (int)4294967295L; - } - public static int _DISABLE_MSVC_PRINTF_QUIRKS() { - return (int)4294967039L; - } - public static int _ENABLE_MSVC_PRINTF_QUIRKS() { - return (int)4294967295L; - } - public static int _EXPONENT_DIGIT_MASK() { - return (int)1L; - } -} - - From 4c5bbd838a4addc1b0aca6c3d6cb88367514f448 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Sun, 12 Feb 2023 18:43:59 +0200 Subject: [PATCH 444/592] JAVA-17765 Cleanup un-committed or un-ignored artifacts - Week 6 - 2023 (#13456) Co-authored-by: timis1 --- .gitignore | 2 ++ .../baeldung/cxf/aegis/BaeldungIntegrationTest.java | 10 +++++++--- jmeter/pom.xml | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 7b448f6cb0..5dc7abec6a 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,8 @@ ethereum/logs/ jmeter/src/main/resources/*-JMeter.csv jmeter/src/main/resources/*-Basic*.csv jmeter/src/main/resources/*-JMeter*.csv +jmeter/src/main/resources/*ReportsDashboard*.csv +jmeter/src/main/resources/dashboard/*ReportsDashboard*.csv ninja/devDb.mv.db diff --git a/apache-cxf-modules/cxf-aegis/src/test/java/com/baeldung/cxf/aegis/BaeldungIntegrationTest.java b/apache-cxf-modules/cxf-aegis/src/test/java/com/baeldung/cxf/aegis/BaeldungIntegrationTest.java index b28b987cfa..9c89d769e0 100644 --- a/apache-cxf-modules/cxf-aegis/src/test/java/com/baeldung/cxf/aegis/BaeldungIntegrationTest.java +++ b/apache-cxf-modules/cxf-aegis/src/test/java/com/baeldung/cxf/aegis/BaeldungIntegrationTest.java @@ -80,16 +80,20 @@ public class BaeldungIntegrationTest { private void marshalCourseRepo(CourseRepo courseRepo) throws Exception { AegisWriter writer = context.createXMLStreamWriter(); AegisType aegisType = context.getTypeMapping().getType(CourseRepo.class); - XMLStreamWriter xmlWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(new FileOutputStream(fileName)); + final FileOutputStream stream = new FileOutputStream(fileName); + XMLStreamWriter xmlWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(stream); writer.write(courseRepo, new QName("http://aegis.cxf.baeldung.com", "baeldung"), false, xmlWriter, aegisType); xmlWriter.close(); + stream.close(); } private CourseRepo unmarshalCourseRepo() throws Exception { AegisReader reader = context.createXMLStreamReader(); - XMLStreamReader xmlReader = XMLInputFactory.newInstance().createXMLStreamReader(new FileInputStream(fileName)); + final FileInputStream stream = new FileInputStream(fileName); + XMLStreamReader xmlReader = XMLInputFactory.newInstance().createXMLStreamReader(stream); CourseRepo courseRepo = (CourseRepo) reader.read(xmlReader, context.getTypeMapping().getType(CourseRepo.class)); xmlReader.close(); + stream.close(); return courseRepo; } @@ -97,7 +101,7 @@ public class BaeldungIntegrationTest { public void cleanup(){ File testFile = new File(fileName); if (testFile.exists()) { - testFile.delete(); + testFile.deleteOnExit(); } } } \ No newline at end of file diff --git a/jmeter/pom.xml b/jmeter/pom.xml index c4d09b9106..acd823b74f 100644 --- a/jmeter/pom.xml +++ b/jmeter/pom.xml @@ -136,7 +136,7 @@ ${project.basedir}/src/main/resources/dashboard true true - false + true From cdd9f1a29e3794dfb4522fb55846b88aae7857bf Mon Sep 17 00:00:00 2001 From: Kumar Prabhash Anand Date: Sun, 12 Feb 2023 22:33:02 +0100 Subject: [PATCH 445/592] added parent in pox.xml (#13469) --- quarkus-modules/quarkus-funqy/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/quarkus-modules/quarkus-funqy/pom.xml b/quarkus-modules/quarkus-funqy/pom.xml index 95d712b9fa..603f458287 100644 --- a/quarkus-modules/quarkus-funqy/pom.xml +++ b/quarkus-modules/quarkus-funqy/pom.xml @@ -16,6 +16,11 @@ 2.16.0.Final 3.0.0-M7 + + com.baeldung + quarkus-modules + 1.0.0-SNAPSHOT + From 8e7055060f6edae37441172431bec225219d4794 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Mon, 13 Feb 2023 06:14:55 +0100 Subject: [PATCH 446/592] [is-object-array] Check if Object is an Array in Java (#13463) --- .../CheckObjectIsArrayUnitTest.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/isobjectarray/CheckObjectIsArrayUnitTest.java diff --git a/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/isobjectarray/CheckObjectIsArrayUnitTest.java b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/isobjectarray/CheckObjectIsArrayUnitTest.java new file mode 100644 index 0000000000..ed38ab0765 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-basic/src/test/java/com/baeldung/array/isobjectarray/CheckObjectIsArrayUnitTest.java @@ -0,0 +1,78 @@ +package com.baeldung.array.isobjectarray; + +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 java.lang.reflect.Array; + +import org.junit.jupiter.api.Test; + +public class CheckObjectIsArrayUnitTest { + private static final Object ARRAY_INT = new int[] { 1, 2, 3, 4, 5 }; + private static final Object ARRAY_PERSON = new Person[] { new Person("Jackie Chan", "Hong Kong"), new Person("Tom Hanks", "United States") }; + + boolean isArray(Object obj) { + return obj instanceof Object[] || obj instanceof boolean[] || obj instanceof byte[] || obj instanceof short[] || obj instanceof char[] || obj instanceof int[] || obj instanceof long[] || obj instanceof float[] || obj instanceof double[]; + } + + @Test + void givenAnArrayObject_whenUsingInstanceof_getExpectedResult() { + assertTrue(ARRAY_PERSON instanceof Object[]); + assertFalse(ARRAY_INT instanceof Object[]); + assertTrue(ARRAY_INT instanceof int[]); + } + + @Test + void givenAnArrayObject_whenUsingOurIsArray_getExpectedResult() { + assertTrue(isArray(ARRAY_PERSON)); + assertTrue(isArray(ARRAY_INT)); + } + + @Test + void givenAnArrayObject_whenUsingClassIsArray_getExpectedResult() { + assertTrue(ARRAY_INT.getClass() + .isArray()); + assertTrue(ARRAY_PERSON.getClass() + .isArray()); + + assertEquals(Person.class, ARRAY_PERSON.getClass() + .getComponentType()); + assertEquals(int.class, ARRAY_INT.getClass() + .getComponentType()); + + } + + @Test + void givenAnArrayObject_whenUsingArrayGet_getExpectedElement() { + if (ARRAY_PERSON.getClass() + .isArray() && ARRAY_PERSON.getClass() + .getComponentType() == Person.class) { + Person person = (Person) Array.get(ARRAY_PERSON, 1); + assertEquals("Tom Hanks", person.getName()); + } + if (ARRAY_INT.getClass() + .isArray() && ARRAY_INT.getClass() + .getComponentType() == int.class) { + assertEquals(2, ((int) Array.get(ARRAY_INT, 1))); + } + } +} + +class Person { + private String name; + private String Location; + + public Person(String name, String location) { + this.name = name; + this.Location = location; + } + + public String getName() { + return name; + } + + public String getLocation() { + return Location; + } +} \ No newline at end of file From 7575ceee8966c80b66015c93e7bcf7661c2525b7 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Mon, 13 Feb 2023 23:27:26 +0530 Subject: [PATCH 447/592] Added Ebook related notes in the Readme (#13472) --- spring-reactive-modules/spring-reactive/README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/spring-reactive-modules/spring-reactive/README.md b/spring-reactive-modules/spring-reactive/README.md index 9f1852d912..7dfc7b2952 100644 --- a/spring-reactive-modules/spring-reactive/README.md +++ b/spring-reactive-modules/spring-reactive/README.md @@ -1,3 +1,7 @@ +### Spring Reactive Articles that are also part of the e-book + +This module contains articles about Spring Reactive that are also part of an Ebook. + ## Spring Reactive This module contains articles describing reactive processing in Spring. @@ -13,4 +17,8 @@ This module contains articles describing reactive processing in Spring. - [Spring WebClient Requests with Parameters](https://www.baeldung.com/webflux-webclient-parameters) - [Handling Errors in Spring WebFlux](https://www.baeldung.com/spring-webflux-errors) - [Spring Security 5 for Reactive Applications](https://www.baeldung.com/spring-security-5-reactive) -- [Concurrency in Spring WebFlux](https://www.baeldung.com/spring-webflux-concurrency) \ No newline at end of file +- [Concurrency in Spring WebFlux](https://www.baeldung.com/spring-webflux-concurrency) + +### 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. From c311ca5ad3f386a9593d269b18c9e852722b945e Mon Sep 17 00:00:00 2001 From: Daniel Strmecki Date: Mon, 13 Feb 2023 20:41:29 +0100 Subject: [PATCH 448/592] Feature/bael 6101 singleton (#13325) * BAEL-6101: singleton bean and pattern example * BAEL-6101: change package * BAEL-6101: refactor * BAEL-6101: refactor * BAEL-6101: PR comment fix --- .../sample/singleton/SingletonBeanConfig.java | 29 +++++++++++++++ .../singleton/ThreadSafeSingleInstance.java | 24 +++++++++++++ .../singleton/SingletonBeanUnitTest.java | 35 +++++++++++++++++++ .../ThreadSafeSingleInstanceUnitTest.java | 16 +++++++++ 4 files changed, 104 insertions(+) create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/singleton/SingletonBeanConfig.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/singleton/ThreadSafeSingleInstance.java create mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/sample/singleton/SingletonBeanUnitTest.java create mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/sample/singleton/ThreadSafeSingleInstanceUnitTest.java diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/singleton/SingletonBeanConfig.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/singleton/SingletonBeanConfig.java new file mode 100644 index 0000000000..1c40097ba5 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/singleton/SingletonBeanConfig.java @@ -0,0 +1,29 @@ +package com.baeldung.sample.singleton; + +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class SingletonBeanConfig { + + @Bean + @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) + public SingletonBean singletonBean() { + return new SingletonBean(); + } + + @Bean + @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) + public SingletonBean anotherSingletonBean() { + return new SingletonBean(); + } + + static class SingletonBean { + public String getValue() { + return "test"; + } + } + +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/singleton/ThreadSafeSingleInstance.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/singleton/ThreadSafeSingleInstance.java new file mode 100644 index 0000000000..ae6e85bf2b --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/singleton/ThreadSafeSingleInstance.java @@ -0,0 +1,24 @@ +package com.baeldung.sample.singleton; + +public final class ThreadSafeSingleInstance { + + private static volatile ThreadSafeSingleInstance instance = null; + + private ThreadSafeSingleInstance() {} + + public static ThreadSafeSingleInstance getInstance() { + if (instance == null) { + synchronized(ThreadSafeSingleInstance.class) { + if (instance == null) { + instance = new ThreadSafeSingleInstance(); + } + } + } + return instance; + } + + public String getValue() { + return "test"; + } + +} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/sample/singleton/SingletonBeanUnitTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/sample/singleton/SingletonBeanUnitTest.java new file mode 100644 index 0000000000..72c1ae4170 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/sample/singleton/SingletonBeanUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.sample.singleton; + +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertSame; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class SingletonBeanUnitTest { + + @Autowired + @Qualifier("singletonBean") + private SingletonBeanConfig.SingletonBean beanOne; + + @Autowired + @Qualifier("singletonBean") + private SingletonBeanConfig.SingletonBean beanTwo; + + @Autowired + @Qualifier("anotherSingletonBean") + private SingletonBeanConfig.SingletonBean beanThree; + + @Test + void givenTwoBeansWithSameId_whenInjectingThem_thenSameInstancesAreReturned() { + assertSame(beanOne, beanTwo); + } + + @Test + void givenTwoBeansWithDifferentId_whenInjectingThem_thenDifferentInstancesAreReturned() { + assertNotSame(beanOne, beanThree); + } + +} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/sample/singleton/ThreadSafeSingleInstanceUnitTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/sample/singleton/ThreadSafeSingleInstanceUnitTest.java new file mode 100644 index 0000000000..0753f92e31 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/sample/singleton/ThreadSafeSingleInstanceUnitTest.java @@ -0,0 +1,16 @@ +package com.baeldung.sample.singleton; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertSame; + +class ThreadSafeSingleInstanceUnitTest { + + @Test + void givenTwoSingletonInstances_whenGettingThem_thenSameInstancesAreReturned() { + ThreadSafeSingleInstance instanceOne = ThreadSafeSingleInstance.getInstance(); + ThreadSafeSingleInstance instanceTwo = ThreadSafeSingleInstance.getInstance(); + assertSame(instanceOne, instanceTwo); + } + +} From cb308a89e8eb32ab329e488c0b5052e144adc4cd Mon Sep 17 00:00:00 2001 From: Stef Serban-Cristian Date: Mon, 13 Feb 2023 23:42:35 +0200 Subject: [PATCH 449/592] [BAEL-5788] Accessing Private Constructor --- .../reflection/PrivateConstructorClass.java | 8 ++++++++ .../reflection/PrivateConstructorUnitTest.java | 17 +++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/reflection/PrivateConstructorClass.java create mode 100644 core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/reflection/PrivateConstructorUnitTest.java diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/reflection/PrivateConstructorClass.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/reflection/PrivateConstructorClass.java new file mode 100644 index 0000000000..24e7d435c7 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/reflection/PrivateConstructorClass.java @@ -0,0 +1,8 @@ +package com.baeldung.reflection; + +public class PrivateConstructorClass { + + private PrivateConstructorClass() { + System.out.println("Used the private constructor!"); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/reflection/PrivateConstructorUnitTest.java b/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/reflection/PrivateConstructorUnitTest.java new file mode 100644 index 0000000000..cd1f48d720 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/reflection/PrivateConstructorUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.reflection; + +import java.lang.reflect.Constructor; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class PrivateConstructorUnitTest { + + @Test + public void whenConstructorIsPrivate_thenInstanceSuccess() throws Exception { + Constructor pcc = PrivateConstructorClass.class.getDeclaredConstructor(); + pcc.setAccessible(true); + PrivateConstructorClass privateConstructorInstance = pcc.newInstance(); + Assertions.assertTrue(privateConstructorInstance instanceof PrivateConstructorClass); + } +} \ No newline at end of file From e4214237da1cd160ee6ceda7b13e6af1027074ee Mon Sep 17 00:00:00 2001 From: Ralf Ueberfuhr <40685729+ueberfuhr@users.noreply.github.com> Date: Tue, 14 Feb 2023 07:28:13 +0100 Subject: [PATCH 450/592] BAEL-6097: Pitfalls on Testing with Spring Boot (#13441) * BAEL-6097: Create project * BAEL-6097: Implement sample code and tests with custom test slices * BAEL-6097: Fix application-test.yml * BAEL-6097: Rename tests to match BDD naming strategy, add test for Mapper Integration Test --- pom.xml | 4 +- .../spring-boot-3-test-pitfalls/pom.xml | 87 +++++++++++++++++++ .../baeldung/sample/pets/PetsApplication.java | 13 +++ .../baeldung/sample/pets/boundary/PetDto.java | 10 +++ .../sample/pets/boundary/PetDtoMapper.java | 13 +++ .../sample/pets/boundary/PetsController.java | 28 ++++++ .../com/baeldung/sample/pets/domain/Pet.java | 4 + .../sample/pets/domain/PetService.java | 14 +++ .../pets/domain/PetServiceRepository.java | 13 +++ .../pets/domain/PetServiceRepositoryImpl.java | 29 +++++++ .../src/main/resources/application.yml | 1 + .../boundary/PetDtoMapperIntegrationTest.java | 47 ++++++++++ .../pets/boundary/PetsBoundaryLayer.java | 10 +++ .../PetsControllerMvcIntegrationTest.java | 36 ++++++++ .../domain/PetServiceIntegrationTest.java | 26 ++++++ .../pets/domain/PetServiceUnitTest.java | 31 +++++++ .../sample/pets/domain/PetsDomainLayer.java | 10 +++ .../sample/test/slices/PetsBoundaryTest.java | 52 +++++++++++ .../sample/test/slices/PetsDomainTest.java | 52 +++++++++++ .../src/test/resources/application-test.yml | 11 +++ 20 files changed, 490 insertions(+), 1 deletion(-) create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/pom.xml create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/PetsApplication.java create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/boundary/PetDto.java create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/boundary/PetDtoMapper.java create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/boundary/PetsController.java create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/domain/Pet.java create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/domain/PetService.java create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/domain/PetServiceRepository.java create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/domain/PetServiceRepositoryImpl.java create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/main/resources/application.yml create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/boundary/PetDtoMapperIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/boundary/PetsBoundaryLayer.java create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/boundary/PetsControllerMvcIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/domain/PetServiceIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/domain/PetServiceUnitTest.java create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/domain/PetsDomainLayer.java create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/test/slices/PetsBoundaryTest.java create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/test/slices/PetsDomainTest.java create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/src/test/resources/application-test.yml diff --git a/pom.xml b/pom.xml index 4016d669a4..83ba73229f 100644 --- a/pom.xml +++ b/pom.xml @@ -965,6 +965,7 @@ spring-boot-modules/spring-boot-3 spring-boot-modules/spring-boot-3-native spring-boot-modules/spring-boot-3-observation + spring-boot-modules/spring-boot-3-test-pitfalls spring-swagger-codegen/custom-validations-opeanpi-codegen testing-modules/testing-assertions persistence-modules/fauna @@ -1163,6 +1164,7 @@ spring-boot-modules/spring-boot-3 spring-boot-modules/spring-boot-3-native spring-boot-modules/spring-boot-3-observation + spring-boot-modules/spring-boot-3-test-pitfalls spring-swagger-codegen/custom-validations-opeanpi-codegen testing-modules/testing-assertions persistence-modules/fauna @@ -1283,7 +1285,7 @@ 11 - + parents diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/pom.xml b/spring-boot-modules/spring-boot-3-test-pitfalls/pom.xml new file mode 100644 index 0000000000..90e4ba022a --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/pom.xml @@ -0,0 +1,87 @@ + + + 4.0.0 + spring-boot-3-test-pitfalls + 0.0.1-SNAPSHOT + spring-boot-3-test-pitfalls + Demo project for Spring Boot Testing Pitfalls + + + 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-validation + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.projectlombok + lombok + true + + + org.mapstruct + mapstruct + ${org.mapstruct.version} + true + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + ${lombok.version} + + + org.mapstruct + mapstruct-processor + ${org.mapstruct.version} + + + org.projectlombok + lombok-mapstruct-binding + 0.2.0 + + + + + + + + + + 1.5.3.Final + 3.0.0-M7 + + + + diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/PetsApplication.java b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/PetsApplication.java new file mode 100644 index 0000000000..17ba1abb2e --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/PetsApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.sample.pets; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class PetsApplication { + + public static void main(String[] args) { + SpringApplication.run(PetsApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/boundary/PetDto.java b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/boundary/PetDto.java new file mode 100644 index 0000000000..62b1202ce8 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/boundary/PetDto.java @@ -0,0 +1,10 @@ +package com.baeldung.sample.pets.boundary; + +import lombok.Data; + +@Data +public class PetDto { + + private String name; + +} diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/boundary/PetDtoMapper.java b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/boundary/PetDtoMapper.java new file mode 100644 index 0000000000..07fbb77f2e --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/boundary/PetDtoMapper.java @@ -0,0 +1,13 @@ +package com.baeldung.sample.pets.boundary; + +import com.baeldung.sample.pets.domain.Pet; +import org.mapstruct.Mapper; + +@Mapper(componentModel = "spring") +public interface PetDtoMapper { + + PetDto map(Pet source); + + Pet map(PetDto source); + +} diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/boundary/PetsController.java b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/boundary/PetsController.java new file mode 100644 index 0000000000..d95d43028b --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/boundary/PetsController.java @@ -0,0 +1,28 @@ +package com.baeldung.sample.pets.boundary; + +import com.baeldung.sample.pets.domain.PetService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Collection; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/pets") +@RequiredArgsConstructor +public class PetsController { + + private final PetService service; + private final PetDtoMapper mapper; + + @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) + public Collection readAll() { + return service.getPets().stream() + .map(mapper::map) + .collect(Collectors.toList()); + } + +} diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/domain/Pet.java b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/domain/Pet.java new file mode 100644 index 0000000000..3dfe5e1a47 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/domain/Pet.java @@ -0,0 +1,4 @@ +package com.baeldung.sample.pets.domain; + +public record Pet(String name) { +} diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/domain/PetService.java b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/domain/PetService.java new file mode 100644 index 0000000000..c5f83047b8 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/domain/PetService.java @@ -0,0 +1,14 @@ +package com.baeldung.sample.pets.domain; + +import lombok.RequiredArgsConstructor; +import lombok.experimental.Delegate; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class PetService { + + @Delegate + private final PetServiceRepository repo; + +} diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/domain/PetServiceRepository.java b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/domain/PetServiceRepository.java new file mode 100644 index 0000000000..1900f72a1c --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/domain/PetServiceRepository.java @@ -0,0 +1,13 @@ +package com.baeldung.sample.pets.domain; + +import java.util.Collection; + +public interface PetServiceRepository { + + boolean add(Pet pet); + + void clear(); + + Collection getPets(); + +} diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/domain/PetServiceRepositoryImpl.java b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/domain/PetServiceRepositoryImpl.java new file mode 100644 index 0000000000..d1d4bba175 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/java/com/baeldung/sample/pets/domain/PetServiceRepositoryImpl.java @@ -0,0 +1,29 @@ +package com.baeldung.sample.pets.domain; + +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +@Component +public class PetServiceRepositoryImpl implements PetServiceRepository { + + private final Set pets = new HashSet<>(); + + @Override + public Set getPets() { + return Collections.unmodifiableSet(pets); + } + + @Override + public boolean add(Pet pet) { + return this.pets.add(pet); + } + + @Override + public void clear() { + this.pets.clear(); + } + +} diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/resources/application.yml b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/resources/application.yml new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/main/resources/application.yml @@ -0,0 +1 @@ + diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/boundary/PetDtoMapperIntegrationTest.java b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/boundary/PetDtoMapperIntegrationTest.java new file mode 100644 index 0000000000..14b12cb6e9 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/boundary/PetDtoMapperIntegrationTest.java @@ -0,0 +1,47 @@ +package com.baeldung.sample.pets.boundary; + +import com.baeldung.sample.pets.domain.PetService; +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.mock.mockito.MockReset; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +@ExtendWith(SpringExtension.class) +public class PetDtoMapperIntegrationTest { + + @Configuration + @ComponentScan(basePackageClasses = PetDtoMapper.class) + static class PetDtoMapperTestConfig { + + /* + * This would be necessary because the controller is also initialized + * and needs the service, although we do not want to test it here. + * + * Solutions: + * - place the mapper into a separate sub package + * - do not test the mapper separately, test it integrated within the controller + * (recommended) + */ + @Bean + PetService createServiceMock() { + return mock(PetService.class, MockReset.withSettings(MockReset.AFTER)); + } + + } + + @Autowired + PetDtoMapper mapper; + + @Test + void shouldExist() { // simply test correct test setup + assertThat(mapper).isNotNull(); + } + +} diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/boundary/PetsBoundaryLayer.java b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/boundary/PetsBoundaryLayer.java new file mode 100644 index 0000000000..2a83b364c3 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/boundary/PetsBoundaryLayer.java @@ -0,0 +1,10 @@ +package com.baeldung.sample.pets.boundary; + +import org.springframework.context.annotation.ComponentScan; + +/** + * Just an interface to use for compiler-checked component scanning during tests. + * @see ComponentScan#basePackageClasses() + */ +public interface PetsBoundaryLayer { +} diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/boundary/PetsControllerMvcIntegrationTest.java b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/boundary/PetsControllerMvcIntegrationTest.java new file mode 100644 index 0000000000..9a5df7b727 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/boundary/PetsControllerMvcIntegrationTest.java @@ -0,0 +1,36 @@ +package com.baeldung.sample.pets.boundary; + +import com.baeldung.sample.pets.domain.PetService; +import com.baeldung.sample.test.slices.PetsBoundaryTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.Collections; + +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; + +@PetsBoundaryTest +class PetsControllerMvcIntegrationTest { + + @Autowired + MockMvc mvc; + @Autowired + PetService service; + + @Test + void shouldReturnEmptyArrayWhenGetPets() throws Exception { + when(service.getPets()).thenReturn(Collections.emptyList()); + mvc.perform( + get("/pets") + .accept(MediaType.APPLICATION_JSON) + ) + .andExpect(status().isOk()) + .andExpect(content().string("[]")); + } + +} diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/domain/PetServiceIntegrationTest.java b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/domain/PetServiceIntegrationTest.java new file mode 100644 index 0000000000..5e2ec41089 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/domain/PetServiceIntegrationTest.java @@ -0,0 +1,26 @@ +package com.baeldung.sample.pets.domain; + +import com.baeldung.sample.test.slices.PetsDomainTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@PetsDomainTest +class PetServiceIntegrationTest { + + @Autowired + PetService service; + @Autowired // Mock + PetServiceRepository repository; + + @Test + void shouldAddPetWhenNotAlreadyExisting() { + var pet = new Pet("Dog"); + when(repository.add(pet)).thenReturn(true); + var result = service.add(pet); + assertThat(result).isTrue(); + } + +} diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/domain/PetServiceUnitTest.java b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/domain/PetServiceUnitTest.java new file mode 100644 index 0000000000..b0ecdfaeb7 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/domain/PetServiceUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.sample.pets.domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class PetServiceUnitTest { + + PetService service = new PetService(new PetServiceRepositoryImpl()); + + @Test + void shouldAddPetWhenNotAlreadyExisting() { + var pet = new Pet("Dog"); + var result = service.add(pet); + assertThat(result).isTrue(); + assertThat(service.getPets()).hasSize(1); + } + + @Test + void shouldNotAddPetWhenAlreadyExisting() { + var pet = new Pet("Cat"); + var result = service.add(pet); + assertThat(result).isTrue(); + // try a second time + result = service.add(pet); + assertThat(result).isFalse(); + assertThat(service.getPets()).hasSize(1); + } + + +} diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/domain/PetsDomainLayer.java b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/domain/PetsDomainLayer.java new file mode 100644 index 0000000000..f32fd189e0 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/pets/domain/PetsDomainLayer.java @@ -0,0 +1,10 @@ +package com.baeldung.sample.pets.domain; + +import org.springframework.context.annotation.ComponentScan; + +/** + * Just an interface to use for compiler-checked component scanning during tests. + * @see ComponentScan#basePackageClasses() + */ +public interface PetsDomainLayer { +} diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/test/slices/PetsBoundaryTest.java b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/test/slices/PetsBoundaryTest.java new file mode 100644 index 0000000000..f58239f971 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/test/slices/PetsBoundaryTest.java @@ -0,0 +1,52 @@ +package com.baeldung.sample.test.slices; + +import com.baeldung.sample.pets.boundary.PetsBoundaryLayer; +import com.baeldung.sample.pets.boundary.PetsController; +import com.baeldung.sample.pets.domain.PetService; +import org.junit.jupiter.api.Tag; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.boot.test.mock.mockito.MockReset; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Primary; +import org.springframework.test.context.ActiveProfiles; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import static org.mockito.Mockito.mock; + +@Documented +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@WebMvcTest(controllers = PetsController.class) +@ComponentScan(basePackageClasses = PetsBoundaryLayer.class) +@Import(PetsBoundaryTest.PetBoundaryTestConfiguration.class) +// further features that can help to configure and execute tests +@ActiveProfiles({ "test", "boundary-test" }) +@Tag("integration-test") +@Tag("boundary-test") +public @interface PetsBoundaryTest { + + @TestConfiguration + class PetBoundaryTestConfiguration { + + @Primary + @Bean + PetService createPetServiceMock() { + return mock( + PetService.class, + MockReset.withSettings(MockReset.AFTER) + ); + } + + } + +} diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/test/slices/PetsDomainTest.java b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/test/slices/PetsDomainTest.java new file mode 100644 index 0000000000..b061889135 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/java/com/baeldung/sample/test/slices/PetsDomainTest.java @@ -0,0 +1,52 @@ +package com.baeldung.sample.test.slices; + +import com.baeldung.sample.pets.domain.PetServiceRepository; +import com.baeldung.sample.pets.domain.PetsDomainLayer; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.boot.test.mock.mockito.MockReset; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Primary; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import static org.mockito.Mockito.mock; + +@Documented +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@ExtendWith(SpringExtension.class) +@ComponentScan(basePackageClasses = PetsDomainLayer.class) +@Import(PetsDomainTest.PetServiceTestConfiguration.class) +// further features that can help to configure and execute tests +@ActiveProfiles({"test", "domain-test"}) +@Tag("integration-test") +@Tag("domain-test") +public @interface PetsDomainTest { + + @TestConfiguration + class PetServiceTestConfiguration { + + @Primary + @Bean + PetServiceRepository createPetsRepositoryMock() { + return mock( + PetServiceRepository.class, + MockReset.withSettings(MockReset.AFTER) + ); + } + + } + +} diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/resources/application-test.yml b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/resources/application-test.yml new file mode 100644 index 0000000000..9801fe9e7e --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/src/test/resources/application-test.yml @@ -0,0 +1,11 @@ +logging: + level: + root: info + org: + springframework: + test: + context: + cache: DEBUG +spring: + main: + allow-bean-definition-overriding: true From 14be293c96d7963b17e19f15e9f5e464bea59794 Mon Sep 17 00:00:00 2001 From: timis1 Date: Tue, 14 Feb 2023 22:11:53 +0200 Subject: [PATCH 451/592] JAVA-18149 Upgrade libraries-2 module to JDK 11 --- .gitignore | 6 ++- libraries-2/pom.xml | 43 ++++++++++--------- .../ParallelCollectorsUnitTest.java | 14 +++--- pom.xml | 4 +- 4 files changed, 37 insertions(+), 30 deletions(-) diff --git a/.gitignore b/.gitignore index 7b448f6cb0..87b9545954 100644 --- a/.gitignore +++ b/.gitignore @@ -105,4 +105,8 @@ spring-boot-modules/spring-boot-properties-3/*.log .sdkmanrc # Localstack -**/.localstack \ No newline at end of file +**/.localstack + +#libraries-2 +libraries-2/employee* +libraries-2/src/test/resources/crawler4j/** \ No newline at end of file diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml index ea1b2ca8b6..3f6f787f31 100644 --- a/libraries-2/pom.xml +++ b/libraries-2/pom.xml @@ -16,15 +16,7 @@ jboss-public-repository-group JBoss Public Repository Group - http://repository.jboss.org/nexus/content/groups/public/ - - true - never - - - true - daily - + https://repo.maven.apache.org/maven2 @@ -82,6 +74,12 @@ edu.uci.ics crawler4j ${crawler4j.version} + + + com.sleepycat + je + + com.github.jknack @@ -119,22 +117,27 @@ spring-jdbc ${spring.version} + + com.sleepycat + je + 18.3.12 + - 3.0.7 - 4.8.28 - 6.0.0.Final - 3.9.6 - 3.17.2 + 3.0.8 + 4.8.153 + 7.1.0.Final + 4.7.0 + 3.24ea1 4.4.0 - 2.1.4.RELEASE - 0.28.3 + 2.7.8 + 1.11.0 1.1.0 - 4.1.2 - 6.17.0 - 5.1.9.RELEASE - 2.5.0 + 4.3.1 + 6.20.0 + 5.3.25 + 2.7.1 \ No newline at end of file diff --git a/libraries-2/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java b/libraries-2/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java index adc753a8ad..e1ad2f7537 100644 --- a/libraries-2/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java +++ b/libraries-2/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java @@ -40,7 +40,7 @@ public class ParallelCollectorsUnitTest { List ids = Arrays.asList(1, 2, 3); CompletableFuture> results = ids.stream() - .collect(parallelToList(i -> fetchById(i), executor, 4)); + .collect(parallelToList(ParallelCollectorsUnitTest::fetchById, executor, 4)); System.out.println(results.join()); } @@ -52,7 +52,7 @@ public class ParallelCollectorsUnitTest { List ids = Arrays.asList(1, 2, 3); List results = ids.stream() - .collect(parallelToList(i -> fetchById(i), executor, 4)) + .collect(parallelToList(ParallelCollectorsUnitTest::fetchById, executor, 4)) .join(); System.out.println(results); // [user-1, user-2, user-3] @@ -92,7 +92,7 @@ public class ParallelCollectorsUnitTest { List ids = Arrays.asList(1, 2, 3); ids.stream() - .collect(parallel(i -> fetchByIdWithRandomDelay(i), executor, 4)) + .collect(parallel(ParallelCollectorsUnitTest::fetchByIdWithRandomDelay, executor, 4)) .forEach(System.out::println); } @@ -103,7 +103,7 @@ public class ParallelCollectorsUnitTest { List ids = Arrays.asList(1, 2, 3); ids.stream() - .collect(parallelOrdered(i -> fetchByIdWithRandomDelay(i), executor, 4)) + .collect(parallelOrdered(ParallelCollectorsUnitTest::fetchByIdWithRandomDelay, executor, 4)) .forEach(System.out::println); } @@ -114,7 +114,7 @@ public class ParallelCollectorsUnitTest { List ids = Arrays.asList(1, 2, 3); Map results = ids.stream() - .collect(parallelToMap(i -> i, i -> fetchById(i), executor, 4)) + .collect(parallelToMap(i -> i, ParallelCollectorsUnitTest::fetchById, executor, 4)) .join(); System.out.println(results); // {1=user-1, 2=user-2, 3=user-3} @@ -127,7 +127,7 @@ public class ParallelCollectorsUnitTest { List ids = Arrays.asList(1, 2, 3); Map results = ids.stream() - .collect(parallelToMap(i -> i, i -> fetchById(i), TreeMap::new, executor, 4)) + .collect(parallelToMap(i -> i, ParallelCollectorsUnitTest::fetchById, TreeMap::new, executor, 4)) .join(); System.out.println(results); // {1=user-1, 2=user-2, 3=user-3} @@ -140,7 +140,7 @@ public class ParallelCollectorsUnitTest { List ids = Arrays.asList(1, 2, 3); Map results = ids.stream() - .collect(parallelToMap(i -> i, i -> fetchById(i), TreeMap::new, (s1, s2) -> s1, executor, 4)) + .collect(parallelToMap(i -> i, ParallelCollectorsUnitTest::fetchById, TreeMap::new, (s1, s2) -> s1, executor, 4)) .join(); System.out.println(results); // {1=user-1, 2=user-2, 3=user-3} diff --git a/pom.xml b/pom.xml index 4016d669a4..ea69fc7570 100644 --- a/pom.xml +++ b/pom.xml @@ -387,7 +387,6 @@ language-interop - libraries-2 libraries-3 libraries-data @@ -670,7 +669,6 @@ language-interop - libraries-2 libraries-3 libraries-data @@ -1074,6 +1072,7 @@ tensorflow-java xstream webrtc + libraries-2 @@ -1275,6 +1274,7 @@ tensorflow-java xstream webrtc + libraries-2 From e173c125f0610a39b4d2e731265e9a6c10cff4ac Mon Sep 17 00:00:00 2001 From: Iniubong LA Date: Wed, 15 Feb 2023 07:07:51 +0000 Subject: [PATCH 452/592] =?UTF-8?q?Difference=20Between=20Function(String?= =?UTF-8?q?=E2=80=A6=20args)=20and=20Function(String[]=20args)=20(#13473)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../argsVsvarargs/StringArrayAndVarargs.java | 19 +++++++++++++++ .../StringArrayAndVarargsUnitTest.java | 24 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 core-java-modules/core-java-8-2/src/main/java/com/baeldung/argsVsvarargs/StringArrayAndVarargs.java create mode 100644 core-java-modules/core-java-8-2/src/test/java/com/baeldung/argsVsvarargs/StringArrayAndVarargsUnitTest.java diff --git a/core-java-modules/core-java-8-2/src/main/java/com/baeldung/argsVsvarargs/StringArrayAndVarargs.java b/core-java-modules/core-java-8-2/src/main/java/com/baeldung/argsVsvarargs/StringArrayAndVarargs.java new file mode 100644 index 0000000000..dc9137646f --- /dev/null +++ b/core-java-modules/core-java-8-2/src/main/java/com/baeldung/argsVsvarargs/StringArrayAndVarargs.java @@ -0,0 +1,19 @@ +package com.baeldung.argsVsvarargs; + +public class StringArrayAndVarargs { + public static void capitalizeNames(String[] args) { + for(int i = 0; i < args.length; i++){ + args[i] = args[i].toUpperCase(); + } + + } + + public static String[] firstLetterOfWords(String... args) { + String[] firstLetter = new String[args.length]; + for(int i = 0; i < args.length; i++){ + firstLetter[i] = String.valueOf(args[i].charAt(0)); + } + return firstLetter; + } + +} diff --git a/core-java-modules/core-java-8-2/src/test/java/com/baeldung/argsVsvarargs/StringArrayAndVarargsUnitTest.java b/core-java-modules/core-java-8-2/src/test/java/com/baeldung/argsVsvarargs/StringArrayAndVarargsUnitTest.java new file mode 100644 index 0000000000..f917373229 --- /dev/null +++ b/core-java-modules/core-java-8-2/src/test/java/com/baeldung/argsVsvarargs/StringArrayAndVarargsUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.argsVsvarargs; + +import static com.baeldung.argsVsvarargs.StringArrayAndVarargs.capitalizeNames; +import static com.baeldung.argsVsvarargs.StringArrayAndVarargs.firstLetterOfWords; +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class StringArrayAndVarargsUnitTest { + + @Test + void whenCheckingArgumentClassName_thenNameShouldBeStringArray() { + String[] names = {"john", "ade", "kofi", "imo"}; + assertNotNull(names); + assertEquals("java.lang.String[]", names.getClass().getTypeName()); + capitalizeNames(names); + } + + @Test + void whenCheckingReturnedObjectClass_thenClassShouldBeStringArray() { + assertEquals(String[].class, firstLetterOfWords("football", "basketball", "volleyball").getClass()); + assertEquals(3, firstLetterOfWords("football", "basketball", "volleyball").length); + } +} \ No newline at end of file From 7cacb733895e3233dbbbcbbc86281b89bc51a5ec Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Wed, 15 Feb 2023 07:16:43 +0000 Subject: [PATCH 453/592] BAEL-6210: Examples for RethinkDB article (#13481) --- persistence-modules/rethinkdb/pom.xml | 53 ++++++++ .../rethinkdb/InsertIntegrationTest.java | 62 ++++++++++ .../rethinkdb/QueryIntegrationTest.java | 81 ++++++++++++ .../rethinkdb/StreamingIntegrationTest.java | 117 ++++++++++++++++++ .../rethinkdb/TablesIntegrationTest.java | 39 ++++++ .../java/com/baeldung/rethinkdb/TestBase.java | 44 +++++++ .../rethinkdb/UpdateIntegrationTest.java | 55 ++++++++ 7 files changed, 451 insertions(+) create mode 100644 persistence-modules/rethinkdb/pom.xml create mode 100644 persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/InsertIntegrationTest.java create mode 100644 persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/QueryIntegrationTest.java create mode 100644 persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/StreamingIntegrationTest.java create mode 100644 persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/TablesIntegrationTest.java create mode 100644 persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/TestBase.java create mode 100644 persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/UpdateIntegrationTest.java diff --git a/persistence-modules/rethinkdb/pom.xml b/persistence-modules/rethinkdb/pom.xml new file mode 100644 index 0000000000..17c7036ed3 --- /dev/null +++ b/persistence-modules/rethinkdb/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + rethinkdb + rethinkdb + Code snippets for RethinkDB articles + + + 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.rethinkdb + rethinkdb-driver + 2.4.4 + + + + org.projectlombok + lombok + provided + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + 17 + + + diff --git a/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/InsertIntegrationTest.java b/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/InsertIntegrationTest.java new file mode 100644 index 0000000000..244959d854 --- /dev/null +++ b/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/InsertIntegrationTest.java @@ -0,0 +1,62 @@ +package com.baeldung.rethinkdb; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static com.rethinkdb.RethinkDB.r; + +/** + * Some tests demonstrating inserting data. + */ +public class InsertIntegrationTest extends TestBase { + /** + * Create a table for the tests. + */ + @BeforeEach + public void createTable() { + r.db(DB_NAME).tableCreate(tableName).run(conn); + } + + /** + * Insert a single simple record into the database. + */ + @Test + public void insertSimpleRecord() { + r.db(DB_NAME).table(tableName) + .insert( + r.hashMap() + .with("name", "Baeldung") + ) + .run(conn); + } + + @Test + public void insertMap() { + r.db(DB_NAME).table(tableName) + .insert( + Map.of("name", "Baeldung") + ) + .run(conn); + } + + @Test + public void insertComplex() { + r.db(DB_NAME).table(tableName) + .insert( + r.hashMap() + .with("name", "Baeldung") + .with("articles", r.array( + r.hashMap() + .with("name", "String Interpolation in Java") + .with("url", "https://www.baeldung.com/java-string-interpolation"), + r.hashMap() + .with("name", "Access HTTPS REST Service Using Spring RestTemplate") + .with("url", "https://www.baeldung.com/spring-resttemplate-secure-https-service") + ) + ) + ) + .run(conn); + } +} diff --git a/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/QueryIntegrationTest.java b/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/QueryIntegrationTest.java new file mode 100644 index 0000000000..263dda9bc6 --- /dev/null +++ b/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/QueryIntegrationTest.java @@ -0,0 +1,81 @@ +package com.baeldung.rethinkdb; + +import com.rethinkdb.net.Result; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static com.rethinkdb.RethinkDB.r; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Some tests demonstrating querying data. + */ +public class QueryIntegrationTest extends TestBase { + /** + * Create a table for the tests. + */ + @BeforeEach + public void createTable() { + r.db(DB_NAME).tableCreate(tableName).run(conn); + + r.db(DB_NAME).table(tableName) + .insert( + r.hashMap() + .with("id", "article1") + .with("name", "String Interpolation in Java") + .with("url", "https://www.baeldung.com/java-string-interpolation") + ).run(conn); + r.db(DB_NAME).table(tableName) + .insert( + r.hashMap() + .with("id", "article2") + .with("name", "Access HTTPS REST Service Using Spring RestTemplate") + .with("url", "https://www.baeldung.com/spring-resttemplate-secure-https-service") + ).run(conn); + } + + @Test + public void listAll() { + Result results = r.db(DB_NAME).table(tableName).run(conn, Map.class); + + // We can't ensure the order the results come back in. + Set expected = new HashSet<>(Set.of( + "String Interpolation in Java", + "Access HTTPS REST Service Using Spring RestTemplate" + )); + + for (Map result : results) { + assertTrue(expected.remove(result.get("name"))); + } + + assertTrue(expected.isEmpty()); + } + + @Test + public void listSome() { + Result results = r.db(DB_NAME) + .table(tableName) + .filter(r -> r.g("name").eq("String Interpolation in Java")) + .run(conn, Map.class); + + // We can't ensure the order the results come back in. + Set expected = Set.of("https://www.baeldung.com/java-string-interpolation"); + + assertEquals(expected, results.stream() + .map(r -> r.get("url")) + .collect(Collectors.toSet())); + } + + @Test + public void getByKey() { + Result results = r.db(DB_NAME).table(tableName).get("article1").run(conn, Map.class); + + assertEquals("String Interpolation in Java", results.first().get("name")); + } +} diff --git a/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/StreamingIntegrationTest.java b/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/StreamingIntegrationTest.java new file mode 100644 index 0000000000..4ca147cf68 --- /dev/null +++ b/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/StreamingIntegrationTest.java @@ -0,0 +1,117 @@ +package com.baeldung.rethinkdb; + +import com.rethinkdb.net.Result; +import org.junit.jupiter.api.Test; + +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import static com.rethinkdb.RethinkDB.r; + +/** + * Some tests demonstrating streaming live changes to data. + */ +public class StreamingIntegrationTest extends TestBase { + @Test + public void getLiveInserts() throws InterruptedException { + ExecutorService executorService = Executors.newCachedThreadPool(); + + r.db(DB_NAME).tableCreate(tableName).run(conn); + + r.db(DB_NAME).table(tableName).insert(r.hashMap().with("index", 0)).run(conn); + + executorService.submit(() -> { + Result cursor = r.db(DB_NAME).table(tableName).changes().run(conn, Map.class); + + cursor.stream().forEach(record -> System.out.println("Record: " + record)); + }); + + for (int i = 0; i < 10; ++i) { + r.db(DB_NAME).table(tableName).insert(r.hashMap().with("index", i)).run(conn); + TimeUnit.MILLISECONDS.sleep(100); + } + + executorService.shutdownNow(); + } + + @Test + public void getSomeLiveInserts() throws InterruptedException { + ExecutorService executorService = Executors.newCachedThreadPool(); + + r.db(DB_NAME).tableCreate(tableName).run(conn); + + r.db(DB_NAME).table(tableName).insert(r.hashMap().with("index", 0)).run(conn); + + executorService.submit(() -> { + Result cursor = r.db(DB_NAME).table(tableName) + .filter(r -> r.g("index").eq(5)) + .changes() + .run(conn, Map.class); + + cursor.stream().forEach(record -> System.out.println("Record: " + record)); + }); + + for (int i = 0; i < 10; ++i) { + r.db(DB_NAME).table(tableName).insert(r.hashMap().with("index", i)).run(conn); + TimeUnit.MILLISECONDS.sleep(100); + } + + executorService.shutdownNow(); + } + + @Test + public void getLiveUpdates() throws InterruptedException { + ExecutorService executorService = Executors.newCachedThreadPool(); + + r.db(DB_NAME).tableCreate(tableName).run(conn); + + r.db(DB_NAME).table(tableName).insert(r.hashMap().with("index", 0)).run(conn); + + executorService.submit(() -> { + Result cursor = r.db(DB_NAME).table(tableName).changes().run(conn, Map.class); + + cursor.stream().forEach(record -> System.out.println("Record: " + record)); + }); + + for (int i = 0; i < 10; ++i) { + r.db(DB_NAME).table(tableName).update(r.hashMap().with("index", i)).run(conn); + TimeUnit.MILLISECONDS.sleep(100); + } + + executorService.shutdownNow(); + } + + @Test + public void getLiveDeletes() throws InterruptedException { + ExecutorService executorService = Executors.newCachedThreadPool(); + + r.db(DB_NAME).tableCreate(tableName).run(conn); + + for (int i = 0; i < 10; ++i) { + r.db(DB_NAME).table(tableName).insert(r.hashMap().with("index", i)).run(conn); + } + + executorService.submit(() -> { + Result cursor = r.db(DB_NAME).table(tableName).changes().run(conn, Map.class); + + cursor.stream().forEach(record -> System.out.println("Record: " + record)); + }); + + r.db(DB_NAME).table(tableName) + .filter(r -> r.g("index").eq(1)) + .delete() + .run(conn); + r.db(DB_NAME).table(tableName) + .filter(r -> r.g("index").eq(3)) + .delete() + .run(conn); + r.db(DB_NAME).table(tableName) + .filter(r -> r.g("index").eq(5)) + .delete() + .run(conn); + + executorService.shutdownNow(); + } +} diff --git a/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/TablesIntegrationTest.java b/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/TablesIntegrationTest.java new file mode 100644 index 0000000000..d60e500373 --- /dev/null +++ b/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/TablesIntegrationTest.java @@ -0,0 +1,39 @@ +package com.baeldung.rethinkdb; + +import com.rethinkdb.gen.exc.ReqlOpFailedError; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static com.rethinkdb.RethinkDB.r; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Some tests demonstrating working with tables. + */ +public class TablesIntegrationTest extends TestBase { + + @Test + public void createTable() { + r.db(DB_NAME).tableCreate(tableName).run(conn); + } + + @Test + public void createTableTwice() { + r.db(DB_NAME).tableCreate(tableName).run(conn); + + Assertions.assertThrows(ReqlOpFailedError.class, () -> { + r.db(DB_NAME).tableCreate(tableName).run(conn); + }); + } + + @Test + public void listTables() { + r.db(DB_NAME).tableCreate(tableName).run(conn); + + List tables = r.db(DB_NAME).tableList().run(conn, List.class).first(); + + assertTrue(tables.contains(tableName)); + } +} diff --git a/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/TestBase.java b/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/TestBase.java new file mode 100644 index 0000000000..396f6655ea --- /dev/null +++ b/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/TestBase.java @@ -0,0 +1,44 @@ +package com.baeldung.rethinkdb; + +import com.rethinkdb.net.Connection; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; + +import java.util.UUID; + +import static com.rethinkdb.RethinkDB.r; + +/** + * Base class for RethinkDB tests. + */ +public class TestBase { + /** The database name to work with */ + protected static final String DB_NAME = "test"; + + /** A randomly generated table name so they never collide */ + protected final String tableName = UUID.randomUUID().toString().replaceAll("-",""); + + /** A database connection */ + protected Connection conn; + + /** + * Connect to the database for each test + */ + @BeforeEach + public void connect() { + conn = r.connection() + .hostname("localhost") + .port(28015) + .connect(); + } + + /** + * Disconnect from the database after each test + */ + @AfterEach + public void disconnect() { + if (this.conn != null) { + conn.close(); + } + } +} diff --git a/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/UpdateIntegrationTest.java b/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/UpdateIntegrationTest.java new file mode 100644 index 0000000000..39fad3a878 --- /dev/null +++ b/persistence-modules/rethinkdb/src/test/java/com/baeldung/rethinkdb/UpdateIntegrationTest.java @@ -0,0 +1,55 @@ +package com.baeldung.rethinkdb; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static com.rethinkdb.RethinkDB.r; + +/** + * Some tests demonstrating updating data. + */ +public class UpdateIntegrationTest extends TestBase { + /** + * Create a table for the tests. + */ + @BeforeEach + public void createTable() { + r.db(DB_NAME).tableCreate(tableName).run(conn); + + r.db(DB_NAME).table(tableName) + .insert( + r.hashMap() + .with("id", "article1") + .with("name", "String Interpolation in Java") + .with("url", "https://www.baeldung.com/java-string-interpolation") + ).run(conn); + r.db(DB_NAME).table(tableName) + .insert( + r.hashMap() + .with("id", "article2") + .with("name", "Access HTTPS REST Service Using Spring RestTemplate") + .with("url", "https://www.baeldung.com/spring-resttemplate-secure-https-service") + ).run(conn); + } + + @Test + public void updateAll() { + r.db(DB_NAME).table(tableName).update(r.hashMap().with("site", "Baeldung")).run(conn); + } + + @Test + public void updateSome() { + r.db(DB_NAME).table(tableName) + .filter(r -> r.g("name").eq("String Interpolation in Java")) + .update(r.hashMap().with("category", "java")) + .run(conn); + } + + @Test + public void delete() { + r.db(DB_NAME).table(tableName) + .filter(r -> r.g("name").eq("String Interpolation in Java")) + .delete() + .run(conn); + } +} From ed51bc4cdaa9a6eff580e578aaeb0657303cff6d Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis Date: Fri, 20 Jan 2023 18:33:28 +0200 Subject: [PATCH 454/592] JAVA-17608 Restored AtomicInteger default increment method --- .../atomic/SafeCounterWithLock.java | 2 +- .../atomic/SafeCounterWithoutLock.java | 8 +----- .../ThreadSafeCounterIntegrationTest.java | 28 ++++++++++++++++--- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java b/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java index ef6b7ee8c8..09dfe575e6 100644 --- a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java +++ b/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java @@ -1,7 +1,7 @@ package com.baeldung.concurrent.atomic; public class SafeCounterWithLock { - private volatile int counter; + private int counter; int getValue() { return counter; diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java b/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java index 8b2aebba7c..e1117dd842 100644 --- a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java +++ b/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java @@ -10,12 +10,6 @@ public class SafeCounterWithoutLock { } void increment() { - while(true) { - int existingValue = getValue(); - int newValue = existingValue + 1; - if(counter.compareAndSet(existingValue, newValue)) { - return; - } - } + counter.incrementAndGet(); } } diff --git a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java b/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java index c3c44b40cf..9b4b628d0f 100644 --- a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java +++ b/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java @@ -17,8 +17,8 @@ public class ThreadSafeCounterIntegrationTest { SafeCounterWithLock safeCounter = new SafeCounterWithLock(); IntStream.range(0, 1000) - .forEach(count -> service.submit(safeCounter::increment)); - service.awaitTermination(100, TimeUnit.MILLISECONDS); + .forEach(count -> service.execute(safeCounter::increment)); + shutdownAndAwaitTermination(service); assertEquals(1000, safeCounter.getValue()); } @@ -29,10 +29,30 @@ public class ThreadSafeCounterIntegrationTest { SafeCounterWithoutLock safeCounter = new SafeCounterWithoutLock(); IntStream.range(0, 1000) - .forEach(count -> service.submit(safeCounter::increment)); - service.awaitTermination(100, TimeUnit.MILLISECONDS); + .forEach(count -> service.execute(safeCounter::increment)); + shutdownAndAwaitTermination(service); assertEquals(1000, safeCounter.getValue()); } + + private void shutdownAndAwaitTermination(ExecutorService pool) { + // Disable new tasks from being submitted + pool.shutdown(); + try { + // Wait a while for existing tasks to terminate + if (!pool.awaitTermination(100, TimeUnit.MILLISECONDS)) { + // Cancel currently executing tasks forcefully + pool.shutdownNow(); + // Wait a while for tasks to respond to being cancelled + if (!pool.awaitTermination(100, TimeUnit.MILLISECONDS)) + System.err.println("Pool did not terminate"); + } + } catch (InterruptedException ex) { + // (Re-)Cancel if current thread also interrupted + pool.shutdownNow(); + // Preserve interrupt status + Thread.currentThread().interrupt(); + } + } } From 1d860a8e674893dc45614fb561cc70eca88e76ec Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 15 Feb 2023 16:51:33 +0200 Subject: [PATCH 455/592] =?UTF-8?q?[JAVA-16376]=20Moved=20apache-poi,=20ap?= =?UTF-8?q?ache-velocity,di-modules,asciidoctor=E2=80=A6=20(#13461)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [JAVA-16376] Moved apache-poi, apache-velocity,di-modules,asciidoctor,aws-modules to jdk9-and-above profile * [JAVA-16376] testing war plugin * [JAVA-16376] Upgraded asciidoctor dependencies * [JAVA-16376] Upgraded lombok version * [JAVA-16376] Upgraded guice version * [JAVA-16376] Clean up properties --- apache-velocity/pom.xml | 1 + asciidoctor/pom.xml | 8 ++++---- aws-modules/aws-reactive/pom.xml | 2 ++ di-modules/guice/pom.xml | 2 +- pom.xml | 23 +++++++++++------------ 5 files changed, 19 insertions(+), 17 deletions(-) diff --git a/apache-velocity/pom.xml b/apache-velocity/pom.xml index f4b6de8872..a562ebeec0 100644 --- a/apache-velocity/pom.xml +++ b/apache-velocity/pom.xml @@ -63,6 +63,7 @@ 4.5.2 1.7 2.0 + 3.3.2 \ No newline at end of file diff --git a/asciidoctor/pom.xml b/asciidoctor/pom.xml index e24917f2f4..b72f050379 100644 --- a/asciidoctor/pom.xml +++ b/asciidoctor/pom.xml @@ -62,10 +62,10 @@ - 1.5.6 - 1.5.6 - 1.5.0-alpha.15 - 1.5.0-alpha.15 + 2.2.2 + 2.5.7 + 2.3.4 + 2.3.4 \ No newline at end of file diff --git a/aws-modules/aws-reactive/pom.xml b/aws-modules/aws-reactive/pom.xml index fbad5e30d0..e6b50cadb2 100644 --- a/aws-modules/aws-reactive/pom.xml +++ b/aws-modules/aws-reactive/pom.xml @@ -77,6 +77,7 @@ org.projectlombok lombok + ${lombok.version} @@ -92,6 +93,7 @@ 2.2.1.RELEASE 2.17.283 + 1.18.20 \ No newline at end of file diff --git a/di-modules/guice/pom.xml b/di-modules/guice/pom.xml index cbadf2119d..a28dbe5297 100644 --- a/di-modules/guice/pom.xml +++ b/di-modules/guice/pom.xml @@ -23,7 +23,7 @@ - 4.1.0 + 5.0.1 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 83ba73229f..0b63defb49 100644 --- a/pom.xml +++ b/pom.xml @@ -332,12 +332,6 @@ apache-cxf-modules apache-libraries - apache-poi - apache-velocity - di-modules - asciidoctor - - aws-modules azure checker-plugin @@ -615,12 +609,6 @@ apache-cxf-modules apache-libraries - apache-poi - apache-velocity - di-modules - asciidoctor - - aws-modules azure checker-plugin @@ -909,6 +897,11 @@ algorithms-modules + apache-poi + apache-velocity + di-modules + asciidoctor + aws-modules core-java-modules/core-java-9 core-java-modules/core-java-9-improvements core-java-modules/core-java-9-jigsaw @@ -1108,6 +1101,12 @@ algorithms-modules + apache-poi + apache-velocity + di-modules + asciidoctor + aws-modules + core-java-modules/core-java-9 core-java-modules/core-java-9-improvements core-java-modules/core-java-9-jigsaw From 47184dc06dae184450cdcc58eedc1983de760615 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Wed, 15 Feb 2023 23:00:12 +0530 Subject: [PATCH 456/592] JAVA-18103 Update spring-boot-keycloak-2 module --- .../spring-boot-keycloak-2/pom.xml | 24 +++------- .../KeycloakConfiguration.java | 14 ------ .../KeycloakSecurityConfig.java | 46 ++++++++++--------- .../application-disabling-keycloak.properties | 7 --- .../src/main/resources/application.properties | 10 ++++ 5 files changed, 41 insertions(+), 60 deletions(-) delete mode 100644 spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakConfiguration.java delete mode 100644 spring-boot-modules/spring-boot-keycloak-2/src/main/resources/application-disabling-keycloak.properties create mode 100644 spring-boot-modules/spring-boot-keycloak-2/src/main/resources/application.properties diff --git a/spring-boot-modules/spring-boot-keycloak-2/pom.xml b/spring-boot-modules/spring-boot-keycloak-2/pom.xml index a119a09561..8b1eec2e4e 100644 --- a/spring-boot-modules/spring-boot-keycloak-2/pom.xml +++ b/spring-boot-modules/spring-boot-keycloak-2/pom.xml @@ -17,18 +17,6 @@ ../../parent-boot-2 - - - - org.keycloak.bom - keycloak-adapter-bom - ${keycloak-adapter-bom.version} - pom - import - - - - org.springframework.boot @@ -39,8 +27,12 @@ spring-boot-starter-security - org.keycloak - keycloak-spring-boot-starter + org.springframework.boot + spring-boot-starter-oauth2-resource-server + + + org.springframework.boot + spring-boot-starter-oauth2-client org.springframework.boot @@ -58,8 +50,4 @@ - - 15.0.2 - - \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakConfiguration.java b/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakConfiguration.java deleted file mode 100644 index a9a2ea6a18..0000000000 --- a/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakConfiguration.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.disablingkeycloak; - -import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class KeycloakConfiguration { - - @Bean - public KeycloakSpringBootConfigResolver keycloakConfigResolver() { - return new KeycloakSpringBootConfigResolver(); - } -} diff --git a/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java b/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java index d48c99d8fd..f5837ba2a5 100644 --- a/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java +++ b/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java @@ -1,38 +1,42 @@ package com.baeldung.disablingkeycloak; -import org.keycloak.adapters.springsecurity.KeycloakConfiguration; -import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +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.security.web.authentication.session.NullAuthenticatedSessionStrategy; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer; +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; -@KeycloakConfiguration +@Configuration +@EnableWebSecurity @ConditionalOnProperty(name = "keycloak.enabled", havingValue = "true", matchIfMissing = true) -public class KeycloakSecurityConfig extends KeycloakWebSecurityConfigurerAdapter { +public class KeycloakSecurityConfig { - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) { - auth.authenticationProvider(keycloakAuthenticationProvider()); + @Bean + protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { + return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl()); } @Bean - @Override - protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { - return new NullAuthenticatedSessionStrategy(); - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - super.configure(http); - + public SecurityFilterChain filterChain1(HttpSecurity http) throws Exception { http.csrf() .disable() - .authorizeRequests() - .anyRequest() - .authenticated(); + .authorizeHttpRequests(auth -> auth.anyRequest() + .authenticated()); + http.oauth2Login(); + http.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt); + return http.build(); + } + + @Bean + public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception { + return http.getSharedObject(AuthenticationManagerBuilder.class) + .build(); } } diff --git a/spring-boot-modules/spring-boot-keycloak-2/src/main/resources/application-disabling-keycloak.properties b/spring-boot-modules/spring-boot-keycloak-2/src/main/resources/application-disabling-keycloak.properties deleted file mode 100644 index 21263cf725..0000000000 --- a/spring-boot-modules/spring-boot-keycloak-2/src/main/resources/application-disabling-keycloak.properties +++ /dev/null @@ -1,7 +0,0 @@ -# Keycloak authentication is enabled for production. -keycloak.enabled=true -keycloak.realm=SpringBootKeycloak -keycloak.auth-server-url=http://localhost:8180/auth -keycloak.resource=login-app -keycloak.bearer-only=true -keycloak.ssl-required=external diff --git a/spring-boot-modules/spring-boot-keycloak-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-keycloak-2/src/main/resources/application.properties new file mode 100644 index 0000000000..1f08eac234 --- /dev/null +++ b/spring-boot-modules/spring-boot-keycloak-2/src/main/resources/application.properties @@ -0,0 +1,10 @@ +server.port=8081 +keycloak.enabled=true + +spring.security.oauth2.client.registration.keycloak.client-id=login-app +spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.keycloak.scope=openid +spring.security.oauth2.client.provider.keycloak.issuer-uri=http://localhost:8080/realms/SpringBootKeycloak +spring.security.oauth2.client.provider.keycloak.user-name-attribute=preferred_username + +spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:8080/realms/SpringBootKeycloak \ No newline at end of file From fc9a23a02a6311fb82554f08095b11f9384c3938 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Wed, 15 Feb 2023 17:52:25 -0300 Subject: [PATCH 457/592] BAEL-6046 - MongoDB - Field Level Encryption (#13440) * bael-6046 - first draft * review 1 * review 2 * null checks and lambda --- .../boot/csfle/config/EncryptionConfig.java | 12 ---- .../boot/csfle/config/MongoClientConfig.java | 35 +++++------ .../config/converter/BinaryConverter.java | 13 ++++ .../config/converter/IntegerConverter.java | 27 -------- .../config/converter/StringConverter.java | 27 -------- .../boot/csfle/service/CitizenService.java | 61 ++++++++++++++++--- 6 files changed, 85 insertions(+), 90 deletions(-) create mode 100644 persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/BinaryConverter.java delete mode 100644 persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/IntegerConverter.java delete mode 100644 persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/StringConverter.java diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/EncryptionConfig.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/EncryptionConfig.java index 1495822bc0..0ff97eb6c1 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/EncryptionConfig.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/EncryptionConfig.java @@ -4,8 +4,6 @@ import org.bson.BsonBinary; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; -import com.mongodb.client.vault.ClientEncryption; - @Configuration public class EncryptionConfig { @@ -21,18 +19,8 @@ public class EncryptionConfig { @Value("${com.baeldung.csfle.auto-decryption:false}") private Boolean autoDecryption; - private ClientEncryption encryption; - private BsonBinary dataKeyId; - public void setEncryption(ClientEncryption encryption) { - this.encryption = encryption; - } - - public ClientEncryption getEncryption() { - return encryption; - } - public void setDataKeyId(BsonBinary dataKeyId) { this.dataKeyId = dataKeyId; } diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/MongoClientConfig.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/MongoClientConfig.java index 29076f4e61..e63034a5b5 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/MongoClientConfig.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/MongoClientConfig.java @@ -11,12 +11,12 @@ import org.bson.Document; import org.bson.conversions.Bson; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration; import org.springframework.data.mongodb.core.convert.MongoCustomConversions; -import com.baeldung.boot.csfle.config.converter.IntegerConverter; -import com.baeldung.boot.csfle.config.converter.StringConverter; +import com.baeldung.boot.csfle.config.converter.BinaryConverter; import com.mongodb.AutoEncryptionSettings; import com.mongodb.ClientEncryptionSettings; import com.mongodb.ConnectionString; @@ -52,16 +52,17 @@ public class MongoClientConfig extends AbstractMongoClientConfiguration { @Override public MongoCustomConversions customConversions() { - return new MongoCustomConversions(Arrays.asList(new StringConverter(encryptionConfig), new IntegerConverter(encryptionConfig))); + return new MongoCustomConversions(Arrays.asList(new BinaryConverter())); } + @Bean @Override public MongoClient mongoClient() { MongoClient client; try { client = MongoClients.create(clientSettings()); - ClientEncryption encryption = createClientEncryption(); + ClientEncryption encryption = clientEncryption(); encryptionConfig.setDataKeyId(createOrRetrieveDataKey(client, encryption)); return client; @@ -70,6 +71,19 @@ public class MongoClientConfig extends AbstractMongoClientConfiguration { } } + @Bean + public ClientEncryption clientEncryption() throws FileNotFoundException, IOException { + Map> kmsProviders = LocalKmsUtils.providersMap(encryptionConfig.getMasterKeyPath()); + + ClientEncryptionSettings encryptionSettings = ClientEncryptionSettings.builder() + .keyVaultMongoClientSettings(clientSettings()) + .keyVaultNamespace(encryptionConfig.getKeyVaultNamespace()) + .kmsProviders(kmsProviders) + .build(); + + return ClientEncryptions.create(encryptionSettings); + } + private BsonBinary createOrRetrieveDataKey(MongoClient client, ClientEncryption encryption) { MongoNamespace namespace = new MongoNamespace(encryptionConfig.getKeyVaultNamespace()); MongoCollection keyVault = client.getDatabase(namespace.getDatabaseName()) @@ -92,19 +106,6 @@ public class MongoClientConfig extends AbstractMongoClientConfiguration { } } - private ClientEncryption createClientEncryption() throws FileNotFoundException, IOException { - Map> kmsProviders = LocalKmsUtils.providersMap(encryptionConfig.getMasterKeyPath()); - - ClientEncryptionSettings encryptionSettings = ClientEncryptionSettings.builder() - .keyVaultMongoClientSettings(clientSettings()) - .keyVaultNamespace(encryptionConfig.getKeyVaultNamespace()) - .kmsProviders(kmsProviders) - .build(); - - encryptionConfig.setEncryption(ClientEncryptions.create(encryptionSettings)); - return encryptionConfig.getEncryption(); - } - private MongoClientSettings clientSettings() throws FileNotFoundException, IOException { Builder settings = MongoClientSettings.builder() .applyConnectionString(new ConnectionString(uri)); diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/BinaryConverter.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/BinaryConverter.java new file mode 100644 index 0000000000..15231551fc --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/BinaryConverter.java @@ -0,0 +1,13 @@ +package com.baeldung.boot.csfle.config.converter; + +import org.bson.BsonBinary; +import org.bson.types.Binary; +import org.springframework.core.convert.converter.Converter; + +public class BinaryConverter implements Converter { + + @Override + public BsonBinary convert(Binary source) { + return new BsonBinary(source.getType(), source.getData()); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/IntegerConverter.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/IntegerConverter.java deleted file mode 100644 index 020513ebff..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/IntegerConverter.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.boot.csfle.config.converter; - -import org.bson.BsonBinary; -import org.bson.BsonValue; -import org.bson.types.Binary; -import org.springframework.core.convert.converter.Converter; - -import com.baeldung.boot.csfle.config.EncryptionConfig; - -public class IntegerConverter implements Converter { - - private EncryptionConfig encryptionConfig; - - public IntegerConverter(EncryptionConfig config) { - this.encryptionConfig = config; - } - - @Override - public Integer convert(Binary source) { - BsonBinary bin = new BsonBinary(source.getType(), source.getData()); - BsonValue value = encryptionConfig.getEncryption() - .decrypt(bin); - - return value.asInt32() - .getValue(); - } -} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/StringConverter.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/StringConverter.java deleted file mode 100644 index 7f8193ce43..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/StringConverter.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.boot.csfle.config.converter; - -import org.bson.BsonBinary; -import org.bson.BsonValue; -import org.bson.types.Binary; -import org.springframework.core.convert.converter.Converter; - -import com.baeldung.boot.csfle.config.EncryptionConfig; - -public class StringConverter implements Converter { - - private EncryptionConfig encryptionConfig; - - public StringConverter(EncryptionConfig config) { - this.encryptionConfig = config; - } - - @Override - public String convert(Binary source) { - BsonBinary bin = new BsonBinary(source.getType(), source.getData()); - BsonValue value = encryptionConfig.getEncryption() - .decrypt(bin); - - return value.asString() - .getValue(); - } -} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java index 9cc0753289..91b5940b25 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java @@ -1,6 +1,7 @@ package com.baeldung.boot.csfle.service; import java.util.List; +import java.util.stream.Collectors; import org.bson.BsonBinary; import org.bson.BsonInt32; @@ -16,6 +17,7 @@ import com.baeldung.boot.csfle.config.EncryptionConfig; import com.baeldung.boot.csfle.data.Citizen; import com.baeldung.boot.csfle.data.EncryptedCitizen; import com.mongodb.client.model.vault.EncryptOptions; +import com.mongodb.client.vault.ClientEncryption; @Service public class CitizenService { @@ -29,6 +31,9 @@ public class CitizenService { @Autowired private EncryptionConfig encryptionConfig; + @Autowired + private ClientEncryption clientEncryption; + public EncryptedCitizen save(Citizen citizen) { EncryptedCitizen encryptedCitizen = new EncryptedCitizen(citizen); encryptedCitizen.setEmail(encrypt(citizen.getEmail(), DETERMINISTIC_ALGORITHM)); @@ -38,26 +43,68 @@ public class CitizenService { } public List findAll() { - return mongo.findAll(Citizen.class); + if (!encryptionConfig.getAutoDecryption()) { + List allEncrypted = mongo.findAll(EncryptedCitizen.class); + + return allEncrypted.stream() + .map(this::decrypt) + .collect(Collectors.toList()); + } else { + return mongo.findAll(Citizen.class); + } } public Citizen findByEmail(String email) { Query byEmail = new Query(Criteria.where("email") .is(encrypt(email, DETERMINISTIC_ALGORITHM))); - return mongo.findOne(byEmail, Citizen.class); + if (!encryptionConfig.getAutoDecryption()) { + EncryptedCitizen encryptedCitizen = mongo.findOne(byEmail, EncryptedCitizen.class); + return decrypt(encryptedCitizen); + } else { + return mongo.findOne(byEmail, Citizen.class); + } } public BsonBinary encrypt(Object value, String algorithm) { if (value == null) return null; - BsonValue bsonValue = value instanceof Integer - ? new BsonInt32((Integer) value) - : new BsonString(value.toString()); + BsonValue bsonValue; + if (value instanceof Integer) { + bsonValue = new BsonInt32((Integer) value); + } else if (value instanceof String) { + bsonValue = new BsonString((String) value); + } else { + throw new IllegalArgumentException("unsupported type: " + value.getClass()); + } EncryptOptions options = new EncryptOptions(algorithm); options.keyId(encryptionConfig.getDataKeyId()); - return encryptionConfig.getEncryption() - .encrypt(bsonValue, options); + return clientEncryption.encrypt(bsonValue, options); + } + + public BsonValue decryptProperty(BsonBinary value) { + if (value == null) + return null; + + return clientEncryption.decrypt(value); + } + + private Citizen decrypt(EncryptedCitizen encrypted) { + Citizen citizen = new Citizen(encrypted); + + BsonValue decryptedBirthYear = decryptProperty(encrypted.getBirthYear()); + if (decryptedBirthYear != null) { + citizen.setBirthYear(decryptedBirthYear.asInt32() + .intValue()); + } + + BsonValue decryptedEmail = decryptProperty(encrypted.getEmail()); + if (decryptedEmail != null) { + citizen.setEmail(decryptedEmail.asString() + .getValue()); + } + + return citizen; } } From 42f04eda6436e19732c3bf66e319c88b4c921094 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Thu, 16 Feb 2023 01:41:00 +0000 Subject: [PATCH 458/592] BAEL-6162: Code examples from article (#13458) * Code example from article * BAEL-6162: Add unit tests * Rename test class --- .../spring-resttemplate-3/README.md | 1 + .../spring-resttemplate-3/pom.xml | 2 +- .../RestTemplateMethodsApplication.java | 102 ++++++++++++++++++ .../methods/RestTemplateMethodsUnitTest.java | 86 +++++++++++++++ 4 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/methods/RestTemplateMethodsApplication.java create mode 100644 spring-web-modules/spring-resttemplate-3/src/test/java/com/baeldung/resttemplate/methods/RestTemplateMethodsUnitTest.java diff --git a/spring-web-modules/spring-resttemplate-3/README.md b/spring-web-modules/spring-resttemplate-3/README.md index 52eba522a5..3add0073b2 100644 --- a/spring-web-modules/spring-resttemplate-3/README.md +++ b/spring-web-modules/spring-resttemplate-3/README.md @@ -11,3 +11,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [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) +- [Difference Between exchange(), postForEntity() and execute() in RestTemplate](https://www.baeldung.com/difference-between-exchange-postForEntity-and-execute) diff --git a/spring-web-modules/spring-resttemplate-3/pom.xml b/spring-web-modules/spring-resttemplate-3/pom.xml index b036a5ffcb..5ce7d348a2 100644 --- a/spring-web-modules/spring-resttemplate-3/pom.xml +++ b/spring-web-modules/spring-resttemplate-3/pom.xml @@ -26,4 +26,4 @@ - \ No newline at end of file + diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/methods/RestTemplateMethodsApplication.java b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/methods/RestTemplateMethodsApplication.java new file mode 100644 index 0000000000..72201aa5c9 --- /dev/null +++ b/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/methods/RestTemplateMethodsApplication.java @@ -0,0 +1,102 @@ +package com.baeldung.resttemplate.methods; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.ClientHttpRequest; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.web.client.RequestCallback; +import org.springframework.web.client.ResponseExtractor; +import org.springframework.web.client.RestTemplate; + +import java.io.IOException; + +/** + * Examples of making the same call with RestTemplate + * using postForEntity(), exchange(), and execute(). + */ +@SpringBootApplication +public class RestTemplateMethodsApplication { + private final static RestTemplate restTemplate = new RestTemplate(); + + public static void main(String[] args) { + + } + + private static void postForEntity() { + Book book = new Book( + "Cruising Along with Java", + "Venkat Subramaniam", + 2023); + + ResponseEntity response = restTemplate.postForEntity( + "https://api.bookstore.com", + book, + Book.class); + } + + private static void exchange() { + Book book = new Book( + "Effective Java", + "Joshua Bloch", + 2001); + + HttpHeaders headers = new HttpHeaders(); + headers.setBasicAuth("username", "password"); + + ResponseEntity response = restTemplate.exchange( + "https://api.bookstore.com", + HttpMethod.POST, + new HttpEntity<>(book, headers), + Book.class); + } + + private static void execute() { + ResponseEntity response = restTemplate.execute( + "https://api.bookstore.com", + HttpMethod.POST, + new RequestCallback() { + @Override + public void doWithRequest(ClientHttpRequest request) throws IOException { + // Create or decorate the request object as needed + } + }, + new ResponseExtractor>() { + @Override + public ResponseEntity extractData(ClientHttpResponse response) throws IOException { + // extract required data from response + return null; + } + } + ); + + // Could also use some factory methods in RestTemplate for + // the request callback and/or response extractor + + Book book = new Book( + "Reactive Spring", + "Josh Long", + 2020); + + response = restTemplate.execute( + "https://api.bookstore.com", + HttpMethod.POST, + restTemplate.httpEntityCallback(book), + restTemplate.responseEntityExtractor(Book.class) + ); + } + + private static class Book { + String title; + String author; + int yearPublished; + + public Book(String title, String author, int yearPublished) { + this.title = title; + this.author = author; + this.yearPublished = yearPublished; + } + } +} diff --git a/spring-web-modules/spring-resttemplate-3/src/test/java/com/baeldung/resttemplate/methods/RestTemplateMethodsUnitTest.java b/spring-web-modules/spring-resttemplate-3/src/test/java/com/baeldung/resttemplate/methods/RestTemplateMethodsUnitTest.java new file mode 100644 index 0000000000..c7a2880f9d --- /dev/null +++ b/spring-web-modules/spring-resttemplate-3/src/test/java/com/baeldung/resttemplate/methods/RestTemplateMethodsUnitTest.java @@ -0,0 +1,86 @@ +package com.baeldung.resttemplate.methods; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.http.*; +import org.springframework.test.web.client.MockRestServiceServer; +import org.springframework.test.web.client.response.MockRestResponseCreators; +import org.springframework.web.client.RestTemplate; + +import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; +import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; + +/** + * Unit tests for different ways to send POST with RestTemplate. + */ +public class RestTemplateMethodsUnitTest +{ + + private final RestTemplate restTemplate = new RestTemplate(); + + private final String URL = "https://localhost:8080"; + + private MockRestServiceServer mockServer; + + @BeforeEach + public void setup() { + mockServer = MockRestServiceServer.createServer(restTemplate); + } + + /** + * Test that postForEntity sends a POST to the desired URL. + */ + @Test + public void testPostForEntity() { + + mockServer.expect(requestTo(URL)) + .andExpect(method(HttpMethod.POST)) + .andRespond(MockRestResponseCreators.withStatus(HttpStatus.OK) + .contentType(MediaType.TEXT_PLAIN) + .body("Ok")); + + restTemplate.postForEntity( + URL, + "Test Body", + String.class); + + mockServer.verify(); + } + + /** + * Test that exchange with POST method sends a POST to the desired URL. + */ + @Test + public void testPostExchange() { + mockServer.expect(requestTo(URL)) + .andExpect(method(HttpMethod.POST)) + .andRespond(MockRestResponseCreators.withStatus(HttpStatus.OK) + .contentType(MediaType.TEXT_PLAIN) + .body("Ok")); + + restTemplate.exchange( + URL, + HttpMethod.POST, + new HttpEntity<>("Test Body"), + String.class); + + mockServer.verify(); + } + + @Test + public void testPostExecute() { + mockServer.expect(requestTo(URL)) + .andExpect(method(HttpMethod.POST)) + .andRespond(MockRestResponseCreators.withStatus(HttpStatus.OK) + .contentType(MediaType.TEXT_PLAIN) + .body("Ok")); + + restTemplate.execute( + URL, + HttpMethod.POST, + restTemplate.httpEntityCallback("Test body"), + restTemplate.responseEntityExtractor(String.class)); + + mockServer.verify(); + } +} From 0f1c11f9b226ec516f484aec6db5ad98cffaac19 Mon Sep 17 00:00:00 2001 From: Arman Sharif Date: Tue, 7 Feb 2023 06:35:24 -0800 Subject: [PATCH 459/592] Updated Instancio version --- testing-modules/instancio/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testing-modules/instancio/pom.xml b/testing-modules/instancio/pom.xml index 137da91897..7687ce282d 100644 --- a/testing-modules/instancio/pom.xml +++ b/testing-modules/instancio/pom.xml @@ -51,8 +51,8 @@ - 2.6.0 + 2.9.0 2.14.1 5.9.2 - \ No newline at end of file + From 67b6a1b4681150290be4041cc6f0d11f812c6664 Mon Sep 17 00:00:00 2001 From: timis1 Date: Thu, 16 Feb 2023 09:18:21 +0200 Subject: [PATCH 460/592] JAVA-18149 Change chronicle.map version --- libraries-2/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml index 3f6f787f31..3c822eea47 100644 --- a/libraries-2/pom.xml +++ b/libraries-2/pom.xml @@ -129,7 +129,7 @@ 4.8.153 7.1.0.Final 4.7.0 - 3.24ea1 + 3.17.2 4.4.0 2.7.8 1.11.0 diff --git a/pom.xml b/pom.xml index 14f3c4e5ba..15db6e4cd1 100644 --- a/pom.xml +++ b/pom.xml @@ -1012,6 +1012,7 @@ java-native jsoup ksqldb + libraries-2 libraries-7 libraries-apache-commons libraries-apache-commons-collections @@ -1066,7 +1067,6 @@ tensorflow-java xstream webrtc - libraries-2 From db11ca931d130f0fc935c0737d73536845c04dbc Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 16 Feb 2023 17:57:31 +0200 Subject: [PATCH 461/592] [JAVA-16376] Moved spring-reactive-modules to jdk9-and-above profile (#13470) * [JAVA-16376] Moved spring-reactive-modules to jdk9-and-above profile * [JAVA-16376] Upgraded geotools dependencies and moved module to jdk9-and-above profile * [JAVA-16376] Replaced vividsolutions artifact with locationtech * [JAVA-16376] Moved data-structures to jdk9-and-above profile * [JAVA-16376] Moved deeplearning4j module to jdk9-and-above profile --------- Co-authored-by: Dhawal Kapil --- deeplearning4j/pom.xml | 9 +++++++ geotools/pom.xml | 13 ++++++--- .../java/com/baeldung/geotools/ShapeFile.java | 8 +++--- pom.xml | 27 +++++++------------ 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/deeplearning4j/pom.xml b/deeplearning4j/pom.xml index c63e67d573..01bac93214 100644 --- a/deeplearning4j/pom.xml +++ b/deeplearning4j/pom.xml @@ -57,11 +57,20 @@ httpclient ${httpclient.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + 0.9.1 4.3.5 + 1.18.20 \ No newline at end of file diff --git a/geotools/pom.xml b/geotools/pom.xml index 05cae922a4..6edb344c8c 100644 --- a/geotools/pom.xml +++ b/geotools/pom.xml @@ -39,12 +39,19 @@ gt-swing ${geotools-swing.version} + + org.locationtech.jts + jts-core + 1.19.0 + + + - 15.2 - 15.2 - 15.2 + 28.1 + 28.1 + 28.1 \ No newline at end of file diff --git a/geotools/src/main/java/com/baeldung/geotools/ShapeFile.java b/geotools/src/main/java/com/baeldung/geotools/ShapeFile.java index de789918cd..64650fb486 100644 --- a/geotools/src/main/java/com/baeldung/geotools/ShapeFile.java +++ b/geotools/src/main/java/com/baeldung/geotools/ShapeFile.java @@ -1,8 +1,8 @@ package com.baeldung.geotools; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.GeometryFactory; -import com.vividsolutions.jts.geom.Point; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Point; import org.geotools.data.DataUtilities; import org.geotools.data.DefaultTransaction; import org.geotools.data.Transaction; @@ -35,7 +35,7 @@ public class ShapeFile { DefaultFeatureCollection collection = new DefaultFeatureCollection(); - GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null); + GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null); SimpleFeatureType TYPE = DataUtilities.createType("Location", "location:Point:srid=4326," + "name:String"); diff --git a/pom.xml b/pom.xml index 0b63defb49..8b395d44f1 100644 --- a/pom.xml +++ b/pom.xml @@ -341,16 +341,9 @@ core-java-modules couchbase custom-pmd - data-structures - deeplearning4j + drools - - - - - geotools - gradle-modules/gradle/maven-to-gradle @@ -470,7 +463,6 @@ server-modules spf4j spring-4 - spring-reactive-modules spring-aop spring-aop-2 spring-batch @@ -618,16 +610,8 @@ core-java-modules couchbase custom-pmd - data-structures - deeplearning4j drools - - - - - geotools - gradle-modules/gradle/maven-to-gradle @@ -739,7 +723,6 @@ server-modules spf4j spring-4 - spring-reactive-modules spring-aop spring-aop-2 spring-batch @@ -940,7 +923,9 @@ core-java-modules/core-java-strings core-java-modules/core-java-httpclient spring-core-6 + data-structures ddd-contexts + deeplearning4j docker-modules apache-httpclient-2 kubernetes-modules/kubernetes-spring @@ -959,11 +944,13 @@ spring-boot-modules/spring-boot-3-native spring-boot-modules/spring-boot-3-observation spring-boot-modules/spring-boot-3-test-pitfalls + spring-reactive-modules spring-swagger-codegen/custom-validations-opeanpi-codegen testing-modules/testing-assertions persistence-modules/fauna lightrun tablesaw + geotools @@ -1145,7 +1132,9 @@ core-java-modules/core-java-strings core-java-modules/core-java-httpclient spring-core-6 + data-structures ddd-contexts + deeplearning4j docker-modules apache-httpclient-2 kubernetes-modules/kubernetes-spring @@ -1164,11 +1153,13 @@ spring-boot-modules/spring-boot-3-native spring-boot-modules/spring-boot-3-observation spring-boot-modules/spring-boot-3-test-pitfalls + spring-reactive-modules spring-swagger-codegen/custom-validations-opeanpi-codegen testing-modules/testing-assertions persistence-modules/fauna lightrun tablesaw + geotools From 8890de875da89e0c252e23ff3f1c2124f6cdcac3 Mon Sep 17 00:00:00 2001 From: thibaultfaure Date: Fri, 17 Feb 2023 02:16:55 +0100 Subject: [PATCH 462/592] BAEL-5288 Code for the Map Date Types With openapi generator article (#13467) Co-authored-by: thibault.faure --- .../spring-boot-swagger-2/pom.xml | 59 +++++++++++++++++++ .../src/main/resources/static/event.yaml | 23 ++++++++ .../com/baeldung/dates/EventUnitTest.java | 33 +++++++++++ 3 files changed, 115 insertions(+) create mode 100644 spring-boot-modules/spring-boot-swagger-2/src/main/resources/static/event.yaml create mode 100644 spring-boot-modules/spring-boot-swagger-2/src/test/java/com/baeldung/dates/EventUnitTest.java diff --git a/spring-boot-modules/spring-boot-swagger-2/pom.xml b/spring-boot-modules/spring-boot-swagger-2/pom.xml index 1cd8e5b850..d2d1d10ad9 100644 --- a/spring-boot-modules/spring-boot-swagger-2/pom.xml +++ b/spring-boot-modules/spring-boot-swagger-2/pom.xml @@ -20,6 +20,10 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-validation + org.springdoc springdoc-openapi-ui @@ -59,6 +63,7 @@ ${swagger-codegen-maven-plugin.version} + two-responses generate @@ -71,6 +76,59 @@ + + dates + + generate + + + ${project.basedir}/src/main/resources/static/event.yaml + spring + + true + custom + + + DateTime=Instant + Date=Date + + + Instant=java.time.Instant + Date=java.util.Date + + + + + + + org.openapitools + openapi-generator-maven-plugin + ${openapi-generator.version} + + + + generate + + + true + ${project.basedir}/src/main/resources/static/event.yaml + spring + + true + custom + false + true + + + DateTime=Instant + Date=Date + + + Instant=java.time.Instant + Date=java.util.Date + + + @@ -84,6 +142,7 @@ + 6.2.1 3.0.0 3.0.34 1.6.10 diff --git a/spring-boot-modules/spring-boot-swagger-2/src/main/resources/static/event.yaml b/spring-boot-modules/spring-boot-swagger-2/src/main/resources/static/event.yaml new file mode 100644 index 0000000000..f8a7b01b43 --- /dev/null +++ b/spring-boot-modules/spring-boot-swagger-2/src/main/resources/static/event.yaml @@ -0,0 +1,23 @@ +openapi: 3.0.0 +info: + title: an example api with dates + version: 0.1.0 +paths: +components: + schemas: + Event: + type: object + properties: + organizer: + type: string + startDate: + type: string + format: date + endDate: + type: string + format: date-time + ticketSales: + type: string + description: Beginning of the ticket sales + example: "01-01-2023" + pattern: "[0-9]{2}-[0-9]{2}-[0-9]{4}" \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-swagger-2/src/test/java/com/baeldung/dates/EventUnitTest.java b/spring-boot-modules/spring-boot-swagger-2/src/test/java/com/baeldung/dates/EventUnitTest.java new file mode 100644 index 0000000000..378882c964 --- /dev/null +++ b/spring-boot-modules/spring-boot-swagger-2/src/test/java/com/baeldung/dates/EventUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.dates; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; + +import org.junit.jupiter.api.Test; + +import io.swagger.model.Event; + +class EventUnitTest { + + private static final Validator VALIDATOR = Validation.buildDefaultValidatorFactory() + .getValidator(); + + @Test + void givenACorrectlyFormattedTicketSales_WhenBuildingEvent_ThenSuccess() { + Set> violations = VALIDATOR.validate(new Event().ticketSales("01-01-2024")); + assertTrue(violations.isEmpty()); + } + + @Test + void givenAWronglyFormattedTicketSales_WhenBuildingEvent_ThenSuccess() { + Set> violations = VALIDATOR.validate(new Event().ticketSales("2024-01-01")); + assertEquals(1, violations.size()); + } + +} From 0b4f4d556650a1f6235d92f14b225b3ecb2fe29c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 17 Feb 2023 17:01:56 +0800 Subject: [PATCH 463/592] Update README.md [skip ci] --- core-java-modules/core-java-functional/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-functional/README.md b/core-java-modules/core-java-functional/README.md index 51185f13a1..addb312542 100644 --- a/core-java-modules/core-java-functional/README.md +++ b/core-java-modules/core-java-functional/README.md @@ -2,3 +2,4 @@ - [Functional Programming in Java](https://www.baeldung.com/java-functional-programming) - [Functors in Java](https://www.baeldung.com/java-functors) +- [Callback Functions in Java](https://www.baeldung.com/java-callback-functions) From 08556f76f1b6e3e2625a2719ce5181696abca8d4 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 17 Feb 2023 17:05:09 +0800 Subject: [PATCH 464/592] Update README.md [skip ci] --- spring-core-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-core-6/README.md b/spring-core-6/README.md index 90e2dfed01..e10db19a54 100644 --- a/spring-core-6/README.md +++ b/spring-core-6/README.md @@ -4,3 +4,4 @@ - [Using Environment Variables in Spring Boot’s application.properties](https://www.baeldung.com/spring-boot-properties-env-variables) - [Reinitialize Singleton Bean in Spring Context](https://www.baeldung.com/spring-reinitialize-singleton-bean) - [HTTP Interface in Spring 6](https://www.baeldung.com/spring-6-http-interface) +- [Getting the Current ApplicationContext in Spring](https://www.baeldung.com/spring-get-current-applicationcontext) From f878ccc38fcbad585d80871edacb6145465f86b5 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 17 Feb 2023 17:10:23 +0800 Subject: [PATCH 465/592] Update README.md [skip ci] --- persistence-modules/spring-data-jpa-repo-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-data-jpa-repo-2/README.md b/persistence-modules/spring-data-jpa-repo-2/README.md index 6f19577606..23134ec02d 100644 --- a/persistence-modules/spring-data-jpa-repo-2/README.md +++ b/persistence-modules/spring-data-jpa-repo-2/README.md @@ -8,4 +8,5 @@ - [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) +- [Difference Between findBy and findAllBy in Spring Data JPA](https://www.baeldung.com/spring-data-jpa-find-by-vs-find-all-by) - More articles: [[<-- prev]](../spring-data-jpa-repo) From 0a7631d6c4d14f9a5bc22daec317e216dbf2aeb5 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 17 Feb 2023 17:13:47 +0800 Subject: [PATCH 466/592] Update README.md [skip ci] --- messaging-modules/rabbitmq/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/messaging-modules/rabbitmq/README.md b/messaging-modules/rabbitmq/README.md index 6a74c297fc..93bb795d7b 100644 --- a/messaging-modules/rabbitmq/README.md +++ b/messaging-modules/rabbitmq/README.md @@ -7,5 +7,5 @@ This module contains articles about RabbitMQ. - [Exchanges, Queues, and Bindings in RabbitMQ](https://www.baeldung.com/java-rabbitmq-exchanges-queues-bindings) - [Pub-Sub vs. Message Queues](https://www.baeldung.com/pub-sub-vs-message-queues) - [Channels and Connections in RabbitMQ](https://www.baeldung.com/java-rabbitmq-channels-connections) - +- [Create Dynamic Queues in RabbitMQ](https://www.baeldung.com/rabbitmq-dynamic-queues) From 65d30628727ae9d68eae289c25e765562c77c7dd Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 17 Feb 2023 17:22:14 +0800 Subject: [PATCH 467/592] Update README.md [skip ci] --- persistence-modules/spring-jdbc/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-jdbc/README.md b/persistence-modules/spring-jdbc/README.md index 22f7fb3d63..21d25915de 100644 --- a/persistence-modules/spring-jdbc/README.md +++ b/persistence-modules/spring-jdbc/README.md @@ -6,3 +6,4 @@ - [Using a List of Values in a JdbcTemplate IN Clause](https://www.baeldung.com/spring-jdbctemplate-in-list) - [Obtaining Auto-generated Keys in Spring JDBC](https://www.baeldung.com/spring-jdbc-autogenerated-keys) - [Spring JDBC Batch Inserts](https://www.baeldung.com/spring-jdbc-batch-inserts) +- [Fix EmptyResultDataAccessException When Using JdbcTemplate](https://www.baeldung.com/jdbctemplate-fix-emptyresultdataaccessexception) From cd0f18fcfb9a3bb13ae25eb6301cc969d86d43b9 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 17 Feb 2023 17:27:55 +0800 Subject: [PATCH 468/592] Update README.md [skip ci] --- core-java-modules/core-java-hex/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core-java-modules/core-java-hex/README.md b/core-java-modules/core-java-hex/README.md index e69de29bb2..0ba4d1372f 100644 --- a/core-java-modules/core-java-hex/README.md +++ b/core-java-modules/core-java-hex/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Convert Hex to RGB Using Java](https://www.baeldung.com/java-convert-hex-to-rgb) From bbe335889ca807374ad5cd41636830bf0524addf Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 17 Feb 2023 18:27:38 +0800 Subject: [PATCH 469/592] 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 622730c834..d2863be8e5 100644 --- a/core-java-modules/core-java-string-algorithms-3/README.md +++ b/core-java-modules/core-java-string-algorithms-3/README.md @@ -9,3 +9,4 @@ This module contains articles about string-related algorithms. - [Email Validation in Java](https://www.baeldung.com/java-email-validation-regex) - [Check if the First Letter of a String is Uppercase](https://www.baeldung.com/java-check-first-letter-uppercase) - [Find the First Non Repeating Character in a String in Java](https://www.baeldung.com/java-find-the-first-non-repeating-character) +- [Find the First Embedded Occurrence of an Integer in a Java String](https://www.baeldung.com/java-string-find-embedded-integer) From 532494be75b2855785f32ab82b0cf0c2ef983f06 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 17 Feb 2023 18:32:41 +0800 Subject: [PATCH 470/592] Update README.md [skip ci] --- testing-modules/junit5-annotations/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/junit5-annotations/README.md b/testing-modules/junit5-annotations/README.md index 6fd524592b..49d596607c 100644 --- a/testing-modules/junit5-annotations/README.md +++ b/testing-modules/junit5-annotations/README.md @@ -8,3 +8,4 @@ This module contains articles about JUnit 5 Annotations - [JUnit5 Programmatic Extension Registration with @RegisterExtension](https://www.baeldung.com/junit-5-registerextension-annotation) - [Guide to JUnit 5 Parameterized Tests](https://www.baeldung.com/parameterized-tests-junit-5) - [Writing Templates for Test Cases Using JUnit 5](https://www.baeldung.com/junit5-test-templates) +- [JUnit 5 @Nested Test Classes](https://www.baeldung.com/junit-5-nested-test-classes) From 2ea6076ed887161f1fcd62e4c6d0c1d93334eadc Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 17 Feb 2023 18:36:58 +0800 Subject: [PATCH 471/592] Update README.md [skip ci] --- core-java-modules/core-java-14/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-14/README.md b/core-java-modules/core-java-14/README.md index 00fd2fa320..97be9391fb 100644 --- a/core-java-modules/core-java-14/README.md +++ b/core-java-modules/core-java-14/README.md @@ -12,3 +12,4 @@ This module contains articles about Java 14. - [Java 14 Record Keyword](https://www.baeldung.com/java-record-keyword) - [New Features in Java 14](https://www.baeldung.com/java-14-new-features) - [Java 14 Record vs. Lombok](https://www.baeldung.com/java-record-vs-lombok) +- [Record vs. Final Class in Java](https://www.baeldung.com/java-record-vs-final-class) From ad5d08e619e5acf4788cc89cf8d3713c3a91868f Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 17 Feb 2023 18:44:12 +0800 Subject: [PATCH 472/592] Update README.md [skip ci] --- core-java-modules/core-java-httpclient/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-httpclient/README.md b/core-java-modules/core-java-httpclient/README.md index 68f828e81b..5dbb7a08ef 100644 --- a/core-java-modules/core-java-httpclient/README.md +++ b/core-java-modules/core-java-httpclient/README.md @@ -5,3 +5,4 @@ This module contains articles about Java HttpClient ### Relevant articles - [Posting with Java HttpClient](https://www.baeldung.com/java-httpclient-post) - [Custom HTTP Header With the Java HttpClient](https://www.baeldung.com/java-http-client-custom-header) +- [Java HttpClient Connection Management](https://www.baeldung.com/java-httpclient-connection-management) From a6fb773e276a3165f935d18391dc90030d324ca7 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 17 Feb 2023 18:46:55 +0800 Subject: [PATCH 473/592] Create README.md [skip ci] --- quarkus-modules/quarkus-funqy/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 quarkus-modules/quarkus-funqy/README.md diff --git a/quarkus-modules/quarkus-funqy/README.md b/quarkus-modules/quarkus-funqy/README.md new file mode 100644 index 0000000000..a97005bb00 --- /dev/null +++ b/quarkus-modules/quarkus-funqy/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Guide to Quarkus Funqy](https://www.baeldung.com/java-quarkus-funqy) From d3382762163a5f5ba8ac33c3d8c0d6892987a452 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 17 Feb 2023 18:49:11 +0800 Subject: [PATCH 474/592] Update README.md [skip ci] --- core-java-modules/core-java-streams-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-streams-4/README.md b/core-java-modules/core-java-streams-4/README.md index b0b42324d6..67b16ac153 100644 --- a/core-java-modules/core-java-streams-4/README.md +++ b/core-java-modules/core-java-streams-4/README.md @@ -8,3 +8,4 @@ - [Batch Processing of Stream Data in Java](https://www.baeldung.com/java-stream-batch-processing) - [Stream to Iterable in Java](https://www.baeldung.com/java-stream-to-iterable) - [Understanding the Difference Between Stream.of() and IntStream.range()](https://www.baeldung.com/java-stream-of-and-intstream-range) +- [Check if Object Is an Array in Java](https://www.baeldung.com/java-check-if-object-is-an-array) From 1f2fcf593c54f424c40fe122f2d50479fb5f7be3 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 17 Feb 2023 18:52:43 +0800 Subject: [PATCH 475/592] 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 ea30573163..0d79f006e1 100644 --- a/spring-boot-modules/spring-boot-3/README.md +++ b/spring-boot-modules/spring-boot-3/README.md @@ -2,3 +2,4 @@ ### Relevant Articles: - [Spring Boot 3 and Spring Framework 6.0 – What’s New](https://www.baeldung.com/spring-boot-3-spring-6-new) +- [Singleton Design Pattern vs Singleton Beans in Spring Boot](https://www.baeldung.com/spring-boot-singleton-vs-beans) From d588f4e0013e7130e04f65bba565363d0ee7427c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 17 Feb 2023 18:57:00 +0800 Subject: [PATCH 476/592] Update README.md [skip ci] --- persistence-modules/spring-data-jpa-query-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-data-jpa-query-3/README.md b/persistence-modules/spring-data-jpa-query-3/README.md index f49bb19217..c0cc4f6511 100644 --- a/persistence-modules/spring-data-jpa-query-3/README.md +++ b/persistence-modules/spring-data-jpa-query-3/README.md @@ -7,6 +7,7 @@ This module contains articles about querying data using Spring Data JPA. - [JPA and Hibernate – Criteria vs. JPQL vs. HQL Query](https://www.baeldung.com/jpql-hql-criteria-query) - [Joining Tables With Spring Data JPA Specifications](https://www.baeldung.com/spring-jpa-joining-tables) - [NonUniqueResultException in Spring Data JPA](https://www.baeldung.com/spring-jpa-non-unique-result-exception) +- [Spring Data Repositories – Collections vs. Stream](https://www.baeldung.com/spring-data-collections-vs-stream) - More articles: [[<-- prev]](../spring-data-jpa-query-2) ### Eclipse Config From 81c8fca0883bedf1695dd5ebecab4f9db6df27f2 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 17 Feb 2023 19:00:43 +0800 Subject: [PATCH 477/592] Update README.md [skip ci] --- spring-web-modules/spring-resttemplate-3/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-web-modules/spring-resttemplate-3/README.md b/spring-web-modules/spring-resttemplate-3/README.md index 3add0073b2..1944221138 100644 --- a/spring-web-modules/spring-resttemplate-3/README.md +++ b/spring-web-modules/spring-resttemplate-3/README.md @@ -11,4 +11,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [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) -- [Difference Between exchange(), postForEntity() and execute() in RestTemplate](https://www.baeldung.com/difference-between-exchange-postForEntity-and-execute) +- [Difference Between exchange(), postForEntity() and execute() in RestTemplate](https://www.baeldung.com/spring-resttemplate-exchange-postforentity-execute) From 95fd310053bca18429d324be7efef8e0d81d1ce2 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Fri, 17 Feb 2023 17:04:37 +0100 Subject: [PATCH 478/592] [2lists-to-map] Combining Two Lists into a Map in Java (#13484) * [2lists-to-map] Combining Two Lists into a Map in Java * [2lists-to-map] rename package --- .../CombineTwoListsInAMapUnitTest.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 core-java-modules/core-java-collections-conversions-2/src/test/java/com/baeldung/combine2liststomap/CombineTwoListsInAMapUnitTest.java diff --git a/core-java-modules/core-java-collections-conversions-2/src/test/java/com/baeldung/combine2liststomap/CombineTwoListsInAMapUnitTest.java b/core-java-modules/core-java-collections-conversions-2/src/test/java/com/baeldung/combine2liststomap/CombineTwoListsInAMapUnitTest.java new file mode 100644 index 0000000000..501ec16a21 --- /dev/null +++ b/core-java-modules/core-java-collections-conversions-2/src/test/java/com/baeldung/combine2liststomap/CombineTwoListsInAMapUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.combine2liststomap; + +import static java.lang.Math.min; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.junit.jupiter.api.Test; + +public class CombineTwoListsInAMapUnitTest { + private static final List KEY_LIST = Arrays.asList("Number One", "Number Two", "Number Three", "Number Four", "Number Five"); + private static final List VALUE_LIST = Arrays.asList(1, 2, 3, 4, 5); + private static final Map EXPECTED_MAP = new HashMap() {{ + put("Number One", 1); + put("Number Two", 2); + put("Number Three", 3); + put("Number Four", 4); + put("Number Five", 5); + }}; + + @Test + void givenTwoLists_whenUsingLoopAndListGet_shouldGetExpectedMap() { + Map result = new HashMap<>(); + int size = KEY_LIST.size(); + if (KEY_LIST.size() != VALUE_LIST.size()) { + // throw an exception or print a warning + size = min(KEY_LIST.size(), VALUE_LIST.size()); + } + for (int i = 0; i < size; i++) { + result.put(KEY_LIST.get(i), VALUE_LIST.get(i)); + } + assertEquals(EXPECTED_MAP, result); + } + + @Test + void givenTwoLists_whenUsingStreamApiAndListGet_shouldGetExpectedMap() { + Map result = IntStream.range(0, KEY_LIST.size()) + .boxed() + .collect(Collectors.toMap(KEY_LIST::get, VALUE_LIST::get)); + assertEquals(EXPECTED_MAP, result); + } + + @Test + void givenTwoLists_whenUsingIterators_shouldGetExpectedMap() { + Map result = new HashMap<>(); + + Iterator ik = KEY_LIST.iterator(); + Iterator iv = VALUE_LIST.iterator(); + while (ik.hasNext() && iv.hasNext()) { + result.put(ik.next(), iv.next()); + } + + assertEquals(EXPECTED_MAP, result); + } + +} \ No newline at end of file From b62ce9f58e487ad799740abf37ac894a0a528b68 Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Date: Fri, 17 Feb 2023 18:47:01 +0200 Subject: [PATCH 479/592] JAVA-17429 Upgrade to latest spring-boot-2 (#13480) --- azure/pom.xml | 4 ++-- ddd/pom.xml | 4 ++-- jhipster-5/bookstore-monolith/pom.xml | 6 +----- libraries-data-db/pom.xml | 4 ++-- parent-boot-2/pom.xml | 8 +++++++- .../quarkus-vs-springboot/spring-project/pom.xml | 4 ++-- spring-boot-modules/spring-boot-autoconfiguration/pom.xml | 4 ++-- spring-boot-modules/spring-boot-bootstrap/pom.xml | 4 ++-- spring-boot-modules/spring-boot-data-3/pom.xml | 4 ++-- spring-boot-modules/spring-boot-mvc/pom.xml | 4 ++-- spring-core-2/pom.xml | 4 ++-- 11 files changed, 26 insertions(+), 24 deletions(-) diff --git a/azure/pom.xml b/azure/pom.xml index ae20ae7785..6a06282a71 100644 --- a/azure/pom.xml +++ b/azure/pom.xml @@ -36,8 +36,8 @@ runtime - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime diff --git a/ddd/pom.xml b/ddd/pom.xml index 3beb43bb35..6128bb1cd9 100644 --- a/ddd/pom.xml +++ b/ddd/pom.xml @@ -59,8 +59,8 @@ runtime - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime diff --git a/jhipster-5/bookstore-monolith/pom.xml b/jhipster-5/bookstore-monolith/pom.xml index ccf7a3c85e..ccaa802a39 100644 --- a/jhipster-5/bookstore-monolith/pom.xml +++ b/jhipster-5/bookstore-monolith/pom.xml @@ -94,10 +94,6 @@ org.apache.commons commons-lang3 - - mysql - mysql-connector-java - org.assertj assertj-core @@ -1175,7 +1171,7 @@ 2.1.1 - 2.0.8.RELEASE + 2.7.8 5.2.17.Final diff --git a/libraries-data-db/pom.xml b/libraries-data-db/pom.xml index 8e5140458e..6c72a4902c 100644 --- a/libraries-data-db/pom.xml +++ b/libraries-data-db/pom.xml @@ -127,8 +127,8 @@ - mysql - mysql-connector-java + com.mysql + mysql-connector-j diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml index 115589b1b0..a1f16c4a64 100644 --- a/parent-boot-2/pom.xml +++ b/parent-boot-2/pom.xml @@ -24,6 +24,11 @@ pom import + + mysql + mysql-connector-java + ${mysql-connector-java.version} + org.springframework.boot spring-boot-dependencies @@ -89,8 +94,9 @@ 3.3.0 1.0.22.RELEASE - 2.7.5 + 2.7.8 1.9.1 + 8.0.31 \ No newline at end of file diff --git a/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml b/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml index 69e1dc3ab0..13508d7086 100644 --- a/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml +++ b/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml @@ -71,8 +71,8 @@ test - mysql - mysql-connector-java + com.mysql + mysql-connector-j test diff --git a/spring-boot-modules/spring-boot-autoconfiguration/pom.xml b/spring-boot-modules/spring-boot-autoconfiguration/pom.xml index ef5d4f66dd..7a3f9f01e8 100644 --- a/spring-boot-modules/spring-boot-autoconfiguration/pom.xml +++ b/spring-boot-modules/spring-boot-autoconfiguration/pom.xml @@ -38,8 +38,8 @@ test - mysql - mysql-connector-java + com.mysql + mysql-connector-j org.springframework.boot diff --git a/spring-boot-modules/spring-boot-bootstrap/pom.xml b/spring-boot-modules/spring-boot-bootstrap/pom.xml index efcfcb71ee..4ceae26f60 100644 --- a/spring-boot-modules/spring-boot-bootstrap/pom.xml +++ b/spring-boot-modules/spring-boot-bootstrap/pom.xml @@ -32,8 +32,8 @@ h2 - mysql - mysql-connector-java + com.mysql + mysql-connector-j org.springframework.boot diff --git a/spring-boot-modules/spring-boot-data-3/pom.xml b/spring-boot-modules/spring-boot-data-3/pom.xml index cac5016ebd..cf53c25697 100644 --- a/spring-boot-modules/spring-boot-data-3/pom.xml +++ b/spring-boot-modules/spring-boot-data-3/pom.xml @@ -25,8 +25,8 @@ spring-boot-starter-data-jpa - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime diff --git a/spring-boot-modules/spring-boot-mvc/pom.xml b/spring-boot-modules/spring-boot-mvc/pom.xml index 6d3f722146..d5ec7742c9 100644 --- a/spring-boot-modules/spring-boot-mvc/pom.xml +++ b/spring-boot-modules/spring-boot-mvc/pom.xml @@ -41,8 +41,8 @@ spring-boot-starter-data-rest - mysql - mysql-connector-java + com.mysql + mysql-connector-j org.hsqldb diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index 719bf56e0b..3cd9adf451 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -92,8 +92,8 @@ ${javassist.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From 433877fd7084a6f469922cbfd9433e5dc76a3f6a Mon Sep 17 00:00:00 2001 From: timis1 Date: Fri, 17 Feb 2023 22:09:14 +0200 Subject: [PATCH 480/592] JAVA-18133 Upgrade drools module to JDK 11 --- drools/pom.xml | 8 +++---- .../backward_chaining/BackwardChaining.java | 1 - .../drools/config/DroolsBeanFactory.java | 21 +++++++------------ .../drools/optaplanner/CourseSchedule.java | 2 +- .../drools/optaplanner/ScoreCalculator.java | 9 ++++---- .../drools/service/ApplicantService.java | 17 ++++++++------- .../drools/service/ProductService.java | 13 +++++++----- .../optaplanner/OptaPlannerUnitTest.java | 9 ++++---- pom.xml | 4 ++-- 9 files changed, 40 insertions(+), 44 deletions(-) diff --git a/drools/pom.xml b/drools/pom.xml index daaf1fa8a7..ff121d7838 100644 --- a/drools/pom.xml +++ b/drools/pom.xml @@ -57,10 +57,10 @@ - 4.4.6 - 7.4.1.Final - 3.13 - 7.10.0.Final + 4.4.16 + 8.32.0.Final + 5.2.3 + 8.32.0.Final \ No newline at end of file diff --git a/drools/src/main/java/com/baeldung/drools/backward_chaining/BackwardChaining.java b/drools/src/main/java/com/baeldung/drools/backward_chaining/BackwardChaining.java index 6f15ee510b..3baabbeb0f 100644 --- a/drools/src/main/java/com/baeldung/drools/backward_chaining/BackwardChaining.java +++ b/drools/src/main/java/com/baeldung/drools/backward_chaining/BackwardChaining.java @@ -11,7 +11,6 @@ public class BackwardChaining { Result result = new BackwardChaining().backwardChaining(); System.out.println(result.getValue()); result.getFacts() - .stream() .forEach(System.out::println); } diff --git a/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java b/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java index cf5d56f246..bbc1f3170a 100644 --- a/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java +++ b/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java @@ -10,26 +10,25 @@ import org.kie.internal.builder.DecisionTableConfiguration; import org.kie.internal.builder.DecisionTableInputType; import org.kie.internal.builder.KnowledgeBuilderFactory; import org.kie.internal.io.ResourceFactory; -import java.io.IOException; import java.util.Arrays; import java.util.List; public class DroolsBeanFactory { private static final String RULES_PATH = "com/baeldung/drools/rules/"; - private KieServices kieServices=KieServices.Factory.get(); + private KieServices kieServices = KieServices.Factory.get(); - private KieFileSystem getKieFileSystem() throws IOException{ + private KieFileSystem getKieFileSystem() { KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); - List rules=Arrays.asList("BackwardChaining.drl","SuggestApplicant.drl","Product_rules.xls"); - for(String rule:rules){ + List rules = Arrays.asList("BackwardChaining.drl", "SuggestApplicant.drl", "Product_rules.xls"); + for(String rule:rules) { kieFileSystem.write(ResourceFactory.newClassPathResource(rule)); } return kieFileSystem; } - public KieContainer getKieContainer() throws IOException { + public KieContainer getKieContainer() { getKieRepository(); KieBuilder kb = kieServices.newKieBuilder(getKieFileSystem()); @@ -44,14 +43,10 @@ public class DroolsBeanFactory { private void getKieRepository() { final KieRepository kieRepository = kieServices.getRepository(); - kieRepository.addKieModule(new KieModule() { - public ReleaseId getReleaseId() { - return kieRepository.getDefaultReleaseId(); - } - }); + kieRepository.addKieModule(kieRepository::getDefaultReleaseId); } - public KieSession getKieSession(){ + public KieSession getKieSession() { getKieRepository(); KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); @@ -59,7 +54,6 @@ public class DroolsBeanFactory { kieFileSystem.write(ResourceFactory.newClassPathResource("com/baeldung/drools/rules/SuggestApplicant.drl")); kieFileSystem.write(ResourceFactory.newClassPathResource("com/baeldung/drools/rules/Product_rules.xls")); - KieBuilder kb = kieServices.newKieBuilder(kieFileSystem); kb.buildAll(); KieModule kieModule = kb.getKieModule(); @@ -67,7 +61,6 @@ public class DroolsBeanFactory { KieContainer kContainer = kieServices.newKieContainer(kieModule.getReleaseId()); return kContainer.newKieSession(); - } public KieSession getKieSession(Resource dt) { diff --git a/drools/src/main/java/com/baeldung/drools/optaplanner/CourseSchedule.java b/drools/src/main/java/com/baeldung/drools/optaplanner/CourseSchedule.java index 7b2ba117a1..d0ae5318b9 100644 --- a/drools/src/main/java/com/baeldung/drools/optaplanner/CourseSchedule.java +++ b/drools/src/main/java/com/baeldung/drools/optaplanner/CourseSchedule.java @@ -6,7 +6,7 @@ import java.util.List; import org.optaplanner.core.api.domain.solution.PlanningEntityCollectionProperty; import org.optaplanner.core.api.domain.solution.PlanningScore; import org.optaplanner.core.api.domain.solution.PlanningSolution; -import org.optaplanner.core.api.domain.solution.drools.ProblemFactCollectionProperty; +import org.optaplanner.core.api.domain.solution.ProblemFactCollectionProperty; import org.optaplanner.core.api.domain.valuerange.ValueRangeProvider; import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore; import org.slf4j.Logger; diff --git a/drools/src/main/java/com/baeldung/drools/optaplanner/ScoreCalculator.java b/drools/src/main/java/com/baeldung/drools/optaplanner/ScoreCalculator.java index 86501cdccd..c9d2b4df99 100644 --- a/drools/src/main/java/com/baeldung/drools/optaplanner/ScoreCalculator.java +++ b/drools/src/main/java/com/baeldung/drools/optaplanner/ScoreCalculator.java @@ -2,14 +2,13 @@ package com.baeldung.drools.optaplanner; import java.util.HashSet; -import org.optaplanner.core.api.score.Score; import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore; -import org.optaplanner.core.impl.score.director.easy.EasyScoreCalculator; +import org.optaplanner.core.api.score.calculator.EasyScoreCalculator; -public class ScoreCalculator implements EasyScoreCalculator { +public class ScoreCalculator implements EasyScoreCalculator { @Override - public Score calculateScore(CourseSchedule courseSchedule) { + public HardSoftScore calculateScore(CourseSchedule courseSchedule) { int hardScore = 0; int softScore = 0; @@ -27,6 +26,6 @@ public class ScoreCalculator implements EasyScoreCalculator { } } - return HardSoftScore.valueOf(hardScore, softScore); + return HardSoftScore.of(hardScore, softScore); } } diff --git a/drools/src/main/java/com/baeldung/drools/service/ApplicantService.java b/drools/src/main/java/com/baeldung/drools/service/ApplicantService.java index f74298ef05..06f84358b0 100644 --- a/drools/src/main/java/com/baeldung/drools/service/ApplicantService.java +++ b/drools/src/main/java/com/baeldung/drools/service/ApplicantService.java @@ -3,19 +3,20 @@ package com.baeldung.drools.service; import com.baeldung.drools.config.DroolsBeanFactory; import com.baeldung.drools.model.Applicant; import com.baeldung.drools.model.SuggestedRole; -import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; -import java.io.IOException; - public class ApplicantService { - KieSession kieSession=new DroolsBeanFactory().getKieSession(); + KieSession kieSession = new DroolsBeanFactory().getKieSession(); - public SuggestedRole suggestARoleForApplicant(Applicant applicant,SuggestedRole suggestedRole) throws IOException { - kieSession.insert(applicant); - kieSession.setGlobal("suggestedRole",suggestedRole); - kieSession.fireAllRules(); + public SuggestedRole suggestARoleForApplicant(Applicant applicant,SuggestedRole suggestedRole) { + try { + kieSession.insert(applicant); + kieSession.setGlobal("suggestedRole", suggestedRole); + kieSession.fireAllRules(); + } finally { + kieSession.dispose(); + } System.out.println(suggestedRole.getRole()); return suggestedRole; diff --git a/drools/src/main/java/com/baeldung/drools/service/ProductService.java b/drools/src/main/java/com/baeldung/drools/service/ProductService.java index be5e43ed7b..401f5a600f 100644 --- a/drools/src/main/java/com/baeldung/drools/service/ProductService.java +++ b/drools/src/main/java/com/baeldung/drools/service/ProductService.java @@ -2,18 +2,21 @@ package com.baeldung.drools.service; import com.baeldung.drools.config.DroolsBeanFactory; import com.baeldung.drools.model.Product; -import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; public class ProductService { - private KieSession kieSession=new DroolsBeanFactory().getKieSession(); + private KieSession kieSession = new DroolsBeanFactory().getKieSession(); public Product applyLabelToProduct(Product product){ - kieSession.insert(product); - kieSession.fireAllRules(); + try { + kieSession.insert(product); + kieSession.fireAllRules(); + } finally { + kieSession.dispose(); + } System.out.println(product.getLabel()); - return product; + return product; } diff --git a/drools/src/test/java/com/baeldung/drools/optaplanner/OptaPlannerUnitTest.java b/drools/src/test/java/com/baeldung/drools/optaplanner/OptaPlannerUnitTest.java index 1880e30b86..2165cdda1f 100644 --- a/drools/src/test/java/com/baeldung/drools/optaplanner/OptaPlannerUnitTest.java +++ b/drools/src/test/java/com/baeldung/drools/optaplanner/OptaPlannerUnitTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.optaplanner.core.api.solver.Solver; import org.optaplanner.core.api.solver.SolverFactory; +import org.optaplanner.core.config.solver.SolverConfig; public class OptaPlannerUnitTest { @@ -21,14 +22,14 @@ public class OptaPlannerUnitTest { unsolvedCourseSchedule.getLectureList().add(new Lecture()); } - unsolvedCourseSchedule.getPeriodList().addAll(Arrays.asList(new Integer[] { 1, 2, 3 })); - unsolvedCourseSchedule.getRoomList().addAll(Arrays.asList(new Integer[] { 1, 2 })); + unsolvedCourseSchedule.getPeriodList().addAll(Arrays.asList(1, 2, 3)); + unsolvedCourseSchedule.getRoomList().addAll(Arrays.asList(1, 2)); } @Test public void test_whenCustomJavaSolver() { - - SolverFactory solverFactory = SolverFactory.createFromXmlResource("courseScheduleSolverConfiguration.xml"); + SolverConfig solverConfig = SolverConfig.createFromXmlResource("courseScheduleSolverConfiguration.xml"); + SolverFactory solverFactory = SolverFactory.create(solverConfig); Solver solver = solverFactory.buildSolver(); CourseSchedule solvedCourseSchedule = solver.solve(unsolvedCourseSchedule); diff --git a/pom.xml b/pom.xml index 8b395d44f1..62c9a36a3c 100644 --- a/pom.xml +++ b/pom.xml @@ -342,7 +342,6 @@ couchbase custom-pmd - drools gradle-modules/gradle/maven-to-gradle @@ -610,7 +609,6 @@ core-java-modules couchbase custom-pmd - drools gradle-modules/gradle/maven-to-gradle @@ -927,6 +925,7 @@ ddd-contexts deeplearning4j docker-modules + drools apache-httpclient-2 kubernetes-modules/kubernetes-spring libraries-concurrency @@ -1136,6 +1135,7 @@ ddd-contexts deeplearning4j docker-modules + drools apache-httpclient-2 kubernetes-modules/kubernetes-spring libraries-concurrency From 4acdb03e61851d2edf8033394bb9e6d1d0da8d85 Mon Sep 17 00:00:00 2001 From: AttilaUhrin Date: Sat, 18 Feb 2023 04:04:25 +0100 Subject: [PATCH 481/592] [BAEL-6027] Add example for Awaitility and Thread.sleep comparison (#13450) * Add example for Awaitility and Thread.sleep comparison * Fix unit test method name and indentation. * Use property in pom.xml for awaitility dependency version. --------- Co-authored-by: Uhrin Attila --- .../core-java-concurrency-basic-3/pom.xml | 12 ++++++ .../baeldung/concurrent/RequestProcessor.java | 35 ++++++++++++++++ .../concurrent/RequestProcessorUnitTest.java | 41 +++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/RequestProcessor.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/RequestProcessorUnitTest.java diff --git a/core-java-modules/core-java-concurrency-basic-3/pom.xml b/core-java-modules/core-java-concurrency-basic-3/pom.xml index 7771d1200c..7289877550 100644 --- a/core-java-modules/core-java-concurrency-basic-3/pom.xml +++ b/core-java-modules/core-java-concurrency-basic-3/pom.xml @@ -24,4 +24,16 @@ + + 4.2.0 + + + + + org.awaitility + awaitility + ${awaitility.version} + test + + \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/RequestProcessor.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/RequestProcessor.java new file mode 100644 index 0000000000..9557a27f2a --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/RequestProcessor.java @@ -0,0 +1,35 @@ +package com.baeldung.concurrent; + +import java.util.HashMap; +import java.util.Map; +import java.util.Random; +import java.util.UUID; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +public class RequestProcessor { + + private Map requestStatuses = new HashMap<>(); + + public String processRequest() { + String requestId = UUID.randomUUID().toString(); + requestStatuses.put(requestId, "PROCESSING"); + + ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); + executorService.schedule((() -> { + requestStatuses.put(requestId, "DONE"); + }), getRandomNumberBetween(500, 2000), TimeUnit.MILLISECONDS); + + return requestId; + } + + public String getStatus(String requestId) { + return requestStatuses.get(requestId); + } + + private int getRandomNumberBetween(int min, int max) { + Random random = new Random(); + return random.nextInt(max - min) + min; + } +} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/RequestProcessorUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/RequestProcessorUnitTest.java new file mode 100644 index 0000000000..c437b08b34 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/RequestProcessorUnitTest.java @@ -0,0 +1,41 @@ +package com.baeldung.concurrent; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.not; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.concurrent.TimeUnit; + +import org.awaitility.Awaitility; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("Request processor") +public class RequestProcessorUnitTest { + + RequestProcessor requestProcessor = new RequestProcessor(); + + @Test + @DisplayName("Wait for completion using Thread.sleep") + void whenWaitingWithThreadSleep_thenStatusIsDone() throws InterruptedException { + String requestId = requestProcessor.processRequest(); + + Thread.sleep(2000); + + assertEquals("DONE", requestProcessor.getStatus(requestId)); + } + + @Test + @DisplayName("Wait for completion using Awaitility") + void whenWaitingWithAwaitility_thenStatusIsDone() { + String requestId = requestProcessor.processRequest(); + + Awaitility.await() + .atMost(2, TimeUnit.SECONDS) + .pollDelay(500, TimeUnit.MILLISECONDS) + .until(() -> requestProcessor.getStatus(requestId), not(equalTo("PROCESSING"))); + + assertEquals("DONE", requestProcessor.getStatus(requestId)); + } + +} From 92864107b99cb90d62ae98545f16be4abe4c477c Mon Sep 17 00:00:00 2001 From: sam-gardner <53271849+sam-gardner@users.noreply.github.com> Date: Sat, 18 Feb 2023 04:23:54 +0000 Subject: [PATCH 482/592] =?UTF-8?q?BAEL-6100-Add-example-code-for-integer-?= =?UTF-8?q?array-to-strings-using-streams=E2=80=A6=20(#13375)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * BAEL-6100-Add-example-code-for-integer-array-to-strings-using-streams-tutorial * BAEL-6100 remove wrongly added README update * BAEL-6100 Add interger array to single string example * BAEL-6100 Correct typo in test class name --- .../ArrayConversionUtils.java | 43 +++++++++++++++ .../IntArrayToStringUnitTest.java | 52 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/intarraytostrings/ArrayConversionUtils.java create mode 100644 core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/intarraytostrings/IntArrayToStringUnitTest.java diff --git a/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/intarraytostrings/ArrayConversionUtils.java b/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/intarraytostrings/ArrayConversionUtils.java new file mode 100644 index 0000000000..3bb58b43d2 --- /dev/null +++ b/core-java-modules/core-java-streams-4/src/main/java/com/baeldung/streams/intarraytostrings/ArrayConversionUtils.java @@ -0,0 +1,43 @@ +package com.baeldung.streams.intarraytostrings; + +import java.util.Arrays; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public class ArrayConversionUtils { + + public static void createStreamExample() { + int[] intArray = { 1, 2, 3, 4, 5 }; + IntStream intStream = Arrays.stream(intArray); + + Integer[] integerArray = { 1, 2, 3, 4, 5 }; + Stream integerStream = Arrays.stream(integerArray); + } + + public static String[] convertToStringArray(Integer[] input) { + return Arrays.stream(input) + .map(Object::toString) + .toArray(String[]::new); + } + + public static String[] convertToStringArray(int[] input) { + return Arrays.stream(input) + .mapToObj(Integer::toString) + .toArray(String[]::new); + } + + public static String[] convertToStringArrayWithBoxing(int[] input) { + return Arrays.stream(input) + .boxed() + .map(Object::toString) + .toArray(String[]::new); + } + + public static String convertToString(int[] input){ + return Arrays.stream(input) + .mapToObj(Integer::toString) + .collect(Collectors.joining(", ")); + } + +} diff --git a/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/intarraytostrings/IntArrayToStringUnitTest.java b/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/intarraytostrings/IntArrayToStringUnitTest.java new file mode 100644 index 0000000000..3f6fb0be8e --- /dev/null +++ b/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streams/intarraytostrings/IntArrayToStringUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.streams.intarraytostrings; + +import static com.baeldung.streams.intarraytostrings.ArrayConversionUtils.convertToString; +import static com.baeldung.streams.intarraytostrings.ArrayConversionUtils.convertToStringArray; +import static com.baeldung.streams.intarraytostrings.ArrayConversionUtils.convertToStringArrayWithBoxing; + +import org.junit.Assert; +import org.junit.Test; + +public class IntArrayToStringUnitTest { + + @Test + public void whenConvertingIntegers_thenHandleStreamOfIntegers() { + Integer[] integerNumbers = { 1, 2, 3, 4, 5 }; + String[] expectedOutput = { "1", "2", "3", "4", "5" }; + + String[] strings = convertToStringArray(integerNumbers); + + Assert.assertArrayEquals(expectedOutput, strings); + } + + @Test + public void whenConvertingInts_thenHandleIntStream() { + int[] intNumbers = { 1, 2, 3, 4, 5 }; + String[] expectedOutput = { "1", "2", "3", "4", "5" }; + + String[] strings = convertToStringArray(intNumbers); + + Assert.assertArrayEquals(expectedOutput, strings); + } + + @Test + public void givenAnIntArray_whenBoxingToInteger_thenHandleStreamOfIntegers() { + int[] intNumbers = { 1, 2, 3, 4, 5 }; + String[] expectedOutput = { "1", "2", "3", "4", "5" }; + + String[] strings = convertToStringArrayWithBoxing(intNumbers); + + Assert.assertArrayEquals(expectedOutput, strings); + } + + @Test + public void givenAnIntArray_whenUsingCollectorsJoining_thenReturnCommaSeparatedString(){ + int[] intNumbers = { 1, 2, 3, 4, 5 }; + String expectedOutput = "1, 2, 3, 4, 5"; + + String string = convertToString(intNumbers); + + Assert.assertEquals(expectedOutput, string); + } + +} From 6c24a5ad96fb10c16364a4730395f2282e4881b6 Mon Sep 17 00:00:00 2001 From: timis1 Date: Sat, 18 Feb 2023 13:16:48 +0200 Subject: [PATCH 483/592] JAVA-18149 Latest version chronicle.map --- libraries-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml index 3c822eea47..3f6f787f31 100644 --- a/libraries-2/pom.xml +++ b/libraries-2/pom.xml @@ -129,7 +129,7 @@ 4.8.153 7.1.0.Final 4.7.0 - 3.17.2 + 3.24ea1 4.4.0 2.7.8 1.11.0 From ba8a44b0caa5a021f8468315cd86cf20649d4230 Mon Sep 17 00:00:00 2001 From: Shaun Phillips <61982125+ShaPhi7@users.noreply.github.com> Date: Sat, 18 Feb 2023 12:09:04 +0000 Subject: [PATCH 484/592] BAEL-4487 remove padding that causes non-deterministic behaviour (#13425) --- .../com/baeldung/crypto/exception/BadPaddingExamples.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/BadPaddingExamples.java b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/BadPaddingExamples.java index 3fff4410e3..135510785f 100644 --- a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/BadPaddingExamples.java +++ b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/exception/BadPaddingExamples.java @@ -16,7 +16,7 @@ public class BadPaddingExamples { SecretKey encryptionKey = CryptoUtils.getKeyForText("BaeldungIsASuperCoolSite"); SecretKey differentKey = CryptoUtils.getKeyForText("ThisGivesUsAnAlternative"); - Cipher cipher = Cipher.getInstance("AES/ECB/ISO10126Padding"); + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, encryptionKey); byte[] cipherTextBytes = cipher.doFinal(plainTextBytes); @@ -28,12 +28,12 @@ public class BadPaddingExamples { public static byte[] encryptAndDecryptUsingDifferentAlgorithms(SecretKey key, IvParameterSpec ivParameterSpec, byte[] plainTextBytes) throws InvalidKeyException, GeneralSecurityException { - Cipher cipher = Cipher.getInstance("AES/CBC/ISO10126Padding"); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec); byte[] cipherTextBytes = cipher.doFinal(plainTextBytes); - cipher = Cipher.getInstance("AES/ECB/ISO10126Padding"); + cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, key); From 749a077478bfff27e37a25d14b873c374ae9eb88 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Sat, 18 Feb 2023 10:27:12 -0300 Subject: [PATCH 485/592] BAEL-6046 - MongoDB - Field Level Encryption (#13494) --- .../boot/csfle/config/MongoClientConfig.java | 7 ------- .../csfle/config/converter/BinaryConverter.java | 13 ------------- .../java/com/baeldung/boot/csfle/data/Citizen.java | 4 +++- .../baeldung/boot/csfle/data/EncryptedCitizen.java | 14 +++++++------- .../boot/csfle/service/CitizenService.java | 14 ++++++++++---- .../boot/csfle/CitizenServiceLiveTest.java | 8 +++++--- .../src/main/resources/application.properties | 7 ++++++- 7 files changed, 31 insertions(+), 36 deletions(-) delete mode 100644 persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/BinaryConverter.java diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/MongoClientConfig.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/MongoClientConfig.java index e63034a5b5..0dff1ec86d 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/MongoClientConfig.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/MongoClientConfig.java @@ -14,9 +14,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration; -import org.springframework.data.mongodb.core.convert.MongoCustomConversions; -import com.baeldung.boot.csfle.config.converter.BinaryConverter; import com.mongodb.AutoEncryptionSettings; import com.mongodb.ClientEncryptionSettings; import com.mongodb.ConnectionString; @@ -50,11 +48,6 @@ public class MongoClientConfig extends AbstractMongoClientConfiguration { return db; } - @Override - public MongoCustomConversions customConversions() { - return new MongoCustomConversions(Arrays.asList(new BinaryConverter())); - } - @Bean @Override public MongoClient mongoClient() { diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/BinaryConverter.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/BinaryConverter.java deleted file mode 100644 index 15231551fc..0000000000 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/config/converter/BinaryConverter.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.boot.csfle.config.converter; - -import org.bson.BsonBinary; -import org.bson.types.Binary; -import org.springframework.core.convert.converter.Converter; - -public class BinaryConverter implements Converter { - - @Override - public BsonBinary convert(Binary source) { - return new BsonBinary(source.getType(), source.getData()); - } -} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/Citizen.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/Citizen.java index 9d6496a17b..11e776123a 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/Citizen.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/Citizen.java @@ -13,7 +13,9 @@ public class Citizen { } public Citizen(EncryptedCitizen encryptedCitizen) { - this.name = encryptedCitizen.getName(); + if (encryptedCitizen != null) { + this.name = encryptedCitizen.getName(); + } } public String getName() { diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/EncryptedCitizen.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/EncryptedCitizen.java index 01c9245fbf..c7ca5566a9 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/EncryptedCitizen.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/data/EncryptedCitizen.java @@ -1,14 +1,14 @@ package com.baeldung.boot.csfle.data; -import org.bson.BsonBinary; +import org.bson.types.Binary; import org.springframework.data.mongodb.core.mapping.Document; @Document("citizens") public class EncryptedCitizen { private String name; - private BsonBinary email; - private BsonBinary birthYear; + private Binary email; + private Binary birthYear; public EncryptedCitizen() { } @@ -25,19 +25,19 @@ public class EncryptedCitizen { this.name = name; } - public BsonBinary getEmail() { + public Binary getEmail() { return email; } - public void setEmail(BsonBinary email) { + public void setEmail(Binary email) { this.email = email; } - public BsonBinary getBirthYear() { + public Binary getBirthYear() { return birthYear; } - public void setBirthYear(BsonBinary birthYear) { + public void setBirthYear(Binary birthYear) { this.birthYear = birthYear; } diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java index 91b5940b25..6b3c463d0d 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/csfle/service/CitizenService.java @@ -7,6 +7,7 @@ import org.bson.BsonBinary; import org.bson.BsonInt32; import org.bson.BsonString; import org.bson.BsonValue; +import org.bson.types.Binary; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; @@ -65,7 +66,7 @@ public class CitizenService { } } - public BsonBinary encrypt(Object value, String algorithm) { + public Binary encrypt(Object value, String algorithm) { if (value == null) return null; @@ -80,17 +81,22 @@ public class CitizenService { EncryptOptions options = new EncryptOptions(algorithm); options.keyId(encryptionConfig.getDataKeyId()); - return clientEncryption.encrypt(bsonValue, options); + + BsonBinary encryptedValue = clientEncryption.encrypt(bsonValue, options); + return new Binary(encryptedValue.getType(), encryptedValue.getData()); } - public BsonValue decryptProperty(BsonBinary value) { + public BsonValue decryptProperty(Binary value) { if (value == null) return null; - return clientEncryption.decrypt(value); + return clientEncryption.decrypt(new BsonBinary(value.getType(), value.getData())); } private Citizen decrypt(EncryptedCitizen encrypted) { + if (encrypted == null) + return null; + Citizen citizen = new Citizen(encrypted); BsonValue decryptedBirthYear = decryptProperty(encrypted.getBirthYear()); diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/csfle/CitizenServiceLiveTest.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/csfle/CitizenServiceLiveTest.java index 5d0a931bb9..471cb2883a 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/csfle/CitizenServiceLiveTest.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/csfle/CitizenServiceLiveTest.java @@ -1,8 +1,10 @@ package com.baeldung.boot.csfle; -import static org.junit.jupiter.api.Assertions.*; +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 org.bson.BsonBinary; +import org.bson.types.Binary; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -36,7 +38,7 @@ public class CitizenServiceLiveTest { citizen.setName("Foo"); citizen.setEmail("foo@citizen.com"); - BsonBinary encryptedEmail = service.encrypt(citizen.getEmail(), CitizenService.DETERMINISTIC_ALGORITHM); + Binary encryptedEmail = service.encrypt(citizen.getEmail(), CitizenService.DETERMINISTIC_ALGORITHM); EncryptedCitizen saved = service.save(citizen); assertEquals(encryptedEmail, saved.getEmail()); diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/resources/application.properties b/persistence-modules/spring-data-jpa-repo-2/src/main/resources/application.properties index 3ca0cc1242..db4837d8d2 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/resources/application.properties +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/resources/application.properties @@ -3,4 +3,9 @@ spring.datasource.username=sa spring.datasource.password=sa spring.jpa.properties.hibernate.globally_quoted_identifiers=true -logging.level.com.baeldung.spring.data.persistence.search=debug \ No newline at end of file +logging.level.com.baeldung.spring.data.persistence.search=debug + +spring.jpa.show-sql=true +logging.level.org.hibernate.SQL=DEBUG +logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE +spring.jpa.properties.hibernate.format_sql=true From e11c4e3dbc66f565c6e10e5401528d2497d5047c Mon Sep 17 00:00:00 2001 From: Bhaskar Ghosh Dastidar Date: Sat, 18 Feb 2023 22:27:14 +0530 Subject: [PATCH 486/592] [JAVA-6143] java copy from one hashmap to another (#13497) Co-authored-by: Bhaskar --- .../core-java-collections-maps-6/pom.xml | 20 ++++++ .../hashmapcopy/CopyingAHashMapToAnother.java | 47 +++++++++++++ .../CopyHashMapIntoAnotherUnitTest.java | 68 +++++++++++++++++++ core-java-modules/pom.xml | 1 + 4 files changed, 136 insertions(+) create mode 100644 core-java-modules/core-java-collections-maps-6/pom.xml create mode 100644 core-java-modules/core-java-collections-maps-6/src/main/java/com/baeldung/map/hashmapcopy/CopyingAHashMapToAnother.java create mode 100644 core-java-modules/core-java-collections-maps-6/src/test/java/com/baeldung/map/hashmapcopy/CopyHashMapIntoAnotherUnitTest.java diff --git a/core-java-modules/core-java-collections-maps-6/pom.xml b/core-java-modules/core-java-collections-maps-6/pom.xml new file mode 100644 index 0000000000..9910d08691 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-6/pom.xml @@ -0,0 +1,20 @@ + + + core-java-collections-maps-6 + 0.1.0-SNAPSHOT + core-java-collections-maps-6 + jar + + core-java-modules + com.baeldung.core-java-modules + 0.0.1-SNAPSHOT + + 4.0.0 + + + 5.2.5.RELEASE + + + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-6/src/main/java/com/baeldung/map/hashmapcopy/CopyingAHashMapToAnother.java b/core-java-modules/core-java-collections-maps-6/src/main/java/com/baeldung/map/hashmapcopy/CopyingAHashMapToAnother.java new file mode 100644 index 0000000000..77a6402a75 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-6/src/main/java/com/baeldung/map/hashmapcopy/CopyingAHashMapToAnother.java @@ -0,0 +1,47 @@ +package com.baeldung.map.hashmapcopy; + +import java.util.Map; + +import com.google.common.collect.MapDifference; +import com.google.common.collect.Maps; + +public class CopyingAHashMapToAnother { + public Map copyByIteration(Map sourceMap, Map targetMap) { + for (Map.Entry entry : sourceMap.entrySet()) { + if (!targetMap.containsKey(entry.getKey())) { + targetMap.put(entry.getKey(), entry.getValue()); + } + } + return targetMap; + } + + public Map copyUsingPutAll(Map sourceMap, Map targetMap) { + sourceMap.keySet() + .removeAll(targetMap.keySet()); + targetMap.putAll(sourceMap); + return targetMap; + } + + public Map copyUsingPutIfAbsent(Map sourceMap, Map targetMap) { + for (Map.Entry entry : sourceMap.entrySet()) { + targetMap.putIfAbsent(entry.getKey(), entry.getValue()); + } + return targetMap; + } + + public Map copyUsingPutIfAbsentForEach(Map sourceMap, Map targetMap) { + sourceMap.forEach(targetMap::putIfAbsent); + return targetMap; + } + + public Map copyUsingMapMerge(Map sourceMap, Map targetMap) { + sourceMap.forEach((key, value) -> targetMap.merge(key, value, (oldVal, newVal) -> oldVal)); + return targetMap; + } + + public Map copyUsingGuavaMapDifference(Map sourceMap, Map targetMap) { + MapDifference differenceMap = Maps.difference(sourceMap, targetMap); + targetMap.putAll(differenceMap.entriesOnlyOnLeft()); + return targetMap; + } +} diff --git a/core-java-modules/core-java-collections-maps-6/src/test/java/com/baeldung/map/hashmapcopy/CopyHashMapIntoAnotherUnitTest.java b/core-java-modules/core-java-collections-maps-6/src/test/java/com/baeldung/map/hashmapcopy/CopyHashMapIntoAnotherUnitTest.java new file mode 100644 index 0000000000..b11f470eb3 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-6/src/test/java/com/baeldung/map/hashmapcopy/CopyHashMapIntoAnotherUnitTest.java @@ -0,0 +1,68 @@ +package com.baeldung.map.hashmapcopy; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +import com.baeldung.map.hashmapcopy.CopyingAHashMapToAnother; + +public class CopyHashMapIntoAnotherUnitTest { + @Test + public void givenSourceAndTargetMapsWhenIteratedOverThenCopyingSuccess(){ + CopyingAHashMapToAnother obj = new CopyingAHashMapToAnother(); + Assert.assertEquals(generateExpectedResultMap(), obj.copyByIteration(generateSourceMap(), generateTargetMap())); + } + + @Test + public void givenSourceAndTargetMapsWhenUsedPutAllThenCopyingSuccess(){ + CopyingAHashMapToAnother obj = new CopyingAHashMapToAnother(); + Assert.assertEquals(generateExpectedResultMap(), obj.copyUsingPutAll(generateSourceMap(), generateTargetMap())); + } + + @Test + public void givenSourceAndTargetMapsWhenUsedPutIfAbsentThenCopyingSuccess(){ + CopyingAHashMapToAnother obj = new CopyingAHashMapToAnother(); + Assert.assertEquals(generateExpectedResultMap(), obj.copyUsingPutIfAbsent(generateSourceMap(), generateTargetMap())); + Assert.assertEquals(generateExpectedResultMap(), obj.copyUsingPutIfAbsentForEach(generateSourceMap(), generateTargetMap())); + } + + @Test + public void givenSourceAndTargetMapsWhenUsedMapMergeThenCopyingSuccess(){ + CopyingAHashMapToAnother obj = new CopyingAHashMapToAnother(); + Assert.assertEquals(generateExpectedResultMap(), obj.copyUsingMapMerge(generateSourceMap(), generateTargetMap())); + } + + @Test + public void givenSourceAndTargetMapsWhenMapDifferenceUsedThenCopyingSuccess(){ + CopyingAHashMapToAnother obj = new CopyingAHashMapToAnother(); + Assert.assertEquals(generateExpectedResultMap(), obj.copyUsingGuavaMapDifference(generateSourceMap(), generateTargetMap())); + } + + private Map generateSourceMap(){ + Map sourceMap = new HashMap<>(); + sourceMap.put("India", "Delhi"); + sourceMap.put("United States", "Washington D.C."); + sourceMap.put("United Kingdom", "London DC"); + return sourceMap; + } + + private Map generateTargetMap(){ + Map targetMap = new HashMap<>(); + targetMap.put("Zimbabwe", "Harare"); + targetMap.put("Norway", "Oslo"); + targetMap.put("United Kingdom", "London"); + return targetMap; + } + + private Map generateExpectedResultMap(){ + Map resultMap = new HashMap<>(); + resultMap.put("India", "Delhi"); + resultMap.put("United States", "Washington D.C."); + resultMap.put("United Kingdom", "London"); + resultMap.put("Zimbabwe", "Harare"); + resultMap.put("Norway", "Oslo"); + return resultMap; + } +} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 612e607a38..1033213cd1 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -132,6 +132,7 @@ core-java-regex-2 core-java-uuid pre-jpms + core-java-collections-maps-6 From 1d7737dc5f24a7cee041e183dac70bbbff943414 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 19 Feb 2023 08:02:49 +0800 Subject: [PATCH 487/592] Update README.md [skip ci] --- core-java-modules/core-java/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java/README.md b/core-java-modules/core-java/README.md index 0000962164..6d9bbe03c2 100644 --- a/core-java-modules/core-java/README.md +++ b/core-java-modules/core-java/README.md @@ -10,3 +10,4 @@ - [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) - [Illegal Character Compilation Error](https://www.baeldung.com/java-illegal-character-error) - [Lambda Expression vs. Anonymous Inner Class](https://www.baeldung.com/java-lambdas-vs-anonymous-class) +- [Difference Between Class.forName() and Class.forName().newInstance()](https://www.baeldung.com/java-class-forname-vs-class-forname-newinstance) From 6a3545dc5bbf98553c04d038bbb68c1ef9ada2b1 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 19 Feb 2023 13:21:39 +0200 Subject: [PATCH 488/592] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3c31b7fba1..697d96c4fa 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ The projects are broadly divided into 3 lists: first, second and heavy. Next, they are segregated further on the basis of the tests that we want to execute. -Additionally, there are 2 profiles dedicated for JDK9 and above builds. +Additionally, there are 2 profiles dedicated for JDK9 and above builds - *which require JDK 17*. We also have a parents profile to build only parent modules. From f9280015b768102977d1fbf31581c1309ae0bf3b Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 19 Feb 2023 13:22:44 +0200 Subject: [PATCH 489/592] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 697d96c4fa..7ed1e6990a 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ The projects are broadly divided into 3 lists: first, second and heavy. Next, they are segregated further on the basis of the tests that we want to execute. -Additionally, there are 2 profiles dedicated for JDK9 and above builds - *which require JDK 17*. +Additionally, there are 2 profiles dedicated for JDK9 and above builds - **which require JDK 17**. We also have a parents profile to build only parent modules. From 17c26f91c9d2a8128c58cfe2e64cc8f5391d9b07 Mon Sep 17 00:00:00 2001 From: Hamid Reza Sharifi Date: Sun, 19 Feb 2023 17:53:38 +0330 Subject: [PATCH 490/592] Bael 5190: Verify Digital Signatures in Java article (#13439) * #BAEL-5190: add keystore and certificate files * #BAEL-5190: add keystore address * #BAEL-5190: update hashing * #BAEL-5190: delete main classes * #BAEL-5190: move keystore files to test directory * #BAEL-5190: rename to DigitalSignatureUtils * #BAEL-5190: main source code * #BAEL-5190: main test source * #BAEL-5190: update for testing * #BAEL-5190: update keystore type * #BAEL-5190: remove p12 keystores * #BAEL-5190: add jks keystores --------- Co-authored-by: h_sharifi --- .../DigitalSignatureUtils.java | 86 ++++++++++++++++++ .../com/baeldung/digitalsignature/Utils.java | 33 ------- ...tureWithMessageDigestAndCipherSigning.java | 28 ------ ...reWithMessageDigestAndCipherVerifying.java | 33 ------- .../DigitalSignatureWithSignatureSigning.java | 27 ------ ...igitalSignatureWithSignatureVerifying.java | 28 ------ .../DigitalSignatureUnitTest.java | 76 ++++++++++++++++ .../digitalsignature/receiver_keystore.jks | Bin 0 -> 785 bytes .../digitalsignature/sender_certificate.cer | 17 ++++ .../digitalsignature/sender_keystore.jks | Bin 0 -> 2072 bytes 10 files changed, 179 insertions(+), 149 deletions(-) create mode 100644 libraries-security/src/main/java/com/baeldung/digitalsignature/DigitalSignatureUtils.java delete mode 100644 libraries-security/src/main/java/com/baeldung/digitalsignature/Utils.java delete mode 100644 libraries-security/src/main/java/com/baeldung/digitalsignature/level1/DigitalSignatureWithMessageDigestAndCipherSigning.java delete mode 100644 libraries-security/src/main/java/com/baeldung/digitalsignature/level1/DigitalSignatureWithMessageDigestAndCipherVerifying.java delete mode 100644 libraries-security/src/main/java/com/baeldung/digitalsignature/level2/DigitalSignatureWithSignatureSigning.java delete mode 100644 libraries-security/src/main/java/com/baeldung/digitalsignature/level2/DigitalSignatureWithSignatureVerifying.java create mode 100644 libraries-security/src/test/java/com/baeldung/digitalsignature/DigitalSignatureUnitTest.java create mode 100644 libraries-security/src/test/resources/digitalsignature/receiver_keystore.jks create mode 100644 libraries-security/src/test/resources/digitalsignature/sender_certificate.cer create mode 100644 libraries-security/src/test/resources/digitalsignature/sender_keystore.jks diff --git a/libraries-security/src/main/java/com/baeldung/digitalsignature/DigitalSignatureUtils.java b/libraries-security/src/main/java/com/baeldung/digitalsignature/DigitalSignatureUtils.java new file mode 100644 index 0000000000..cc0da187b9 --- /dev/null +++ b/libraries-security/src/main/java/com/baeldung/digitalsignature/DigitalSignatureUtils.java @@ -0,0 +1,86 @@ +package com.baeldung.digitalsignature; + +import org.bouncycastle.asn1.x509.AlgorithmIdentifier; +import org.bouncycastle.asn1.x509.DigestInfo; +import org.bouncycastle.operator.DefaultDigestAlgorithmIdentifierFinder; +import org.bouncycastle.operator.DigestAlgorithmIdentifierFinder; + +import javax.crypto.Cipher; +import java.io.FileInputStream; +import java.io.IOException; +import java.security.*; +import java.security.cert.Certificate; +import java.util.Arrays; + +public class DigitalSignatureUtils { + + public static PrivateKey getPrivateKey(String file, char[] password, String storeType, String alias) throws Exception { + KeyStore keyStore = KeyStore.getInstance(storeType); + keyStore.load(new FileInputStream(file), password); + return (PrivateKey) keyStore.getKey(alias, password); + } + + public static PublicKey getPublicKey(String file, char[] password, String storeType, String alias) throws Exception { + KeyStore keyStore = KeyStore.getInstance(storeType); + keyStore.load(new FileInputStream(file), password); + Certificate certificate = keyStore.getCertificate(alias); + return certificate.getPublicKey(); + } + + public static byte[] sign(byte[] message, String signingAlgorithm, PrivateKey signingKey) throws SecurityException { + try { + Signature signature = Signature.getInstance(signingAlgorithm); + signature.initSign(signingKey); + signature.update(message); + return signature.sign(); + } catch (GeneralSecurityException exp) { + throw new SecurityException("Error during signature generation", exp); + } + } + + public static boolean verify(byte[] messageBytes, String signingAlgorithm, PublicKey publicKey, byte[] signedData) { + try { + Signature signature = Signature.getInstance(signingAlgorithm); + signature.initVerify(publicKey); + signature.update(messageBytes); + return signature.verify(signedData); + } catch (GeneralSecurityException exp) { + throw new SecurityException("Error during verifying", exp); + } + } + + public static byte[] signWithMessageDigestAndCipher(byte[] messageBytes, String hashingAlgorithm, PrivateKey privateKey) { + try { + MessageDigest md = MessageDigest.getInstance(hashingAlgorithm); + byte[] messageHash = md.digest(messageBytes); + DigestAlgorithmIdentifierFinder hashAlgorithmFinder = new DefaultDigestAlgorithmIdentifierFinder(); + AlgorithmIdentifier hashingAlgorithmIdentifier = hashAlgorithmFinder.find(hashingAlgorithm); + DigestInfo digestInfo = new DigestInfo(hashingAlgorithmIdentifier, messageHash); + byte[] hashToEncrypt = digestInfo.getEncoded(); + + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.ENCRYPT_MODE, privateKey); + return cipher.doFinal(hashToEncrypt); + } catch (GeneralSecurityException | IOException exp) { + throw new SecurityException("Error during signature generation", exp); + } + } + + public static boolean verifyWithMessageDigestAndCipher(byte[] messageBytes, String hashingAlgorithm, PublicKey publicKey, byte[] encryptedMessageHash) { + try { + MessageDigest md = MessageDigest.getInstance(hashingAlgorithm); + byte[] newMessageHash = md.digest(messageBytes); + DigestAlgorithmIdentifierFinder hashAlgorithmFinder = new DefaultDigestAlgorithmIdentifierFinder(); + AlgorithmIdentifier hashingAlgorithmIdentifier = hashAlgorithmFinder.find(hashingAlgorithm); + DigestInfo digestInfo = new DigestInfo(hashingAlgorithmIdentifier, newMessageHash); + byte[] hashToEncrypt = digestInfo.getEncoded(); + + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, publicKey); + byte[] decryptedMessageHash = cipher.doFinal(encryptedMessageHash); + return Arrays.equals(decryptedMessageHash, hashToEncrypt); + } catch (GeneralSecurityException | IOException exp) { + throw new SecurityException("Error during verifying", exp); + } + } +} diff --git a/libraries-security/src/main/java/com/baeldung/digitalsignature/Utils.java b/libraries-security/src/main/java/com/baeldung/digitalsignature/Utils.java deleted file mode 100644 index 9f1e5808c3..0000000000 --- a/libraries-security/src/main/java/com/baeldung/digitalsignature/Utils.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.digitalsignature; - -import java.io.FileInputStream; -import java.security.KeyStore; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.security.cert.Certificate; - -public class Utils { - - private static final String STORE_TYPE = "PKCS12"; - private static final char[] PASSWORD = "changeit".toCharArray(); - private static final String SENDER_KEYSTORE = "sender_keystore.p12"; - private static final String SENDER_ALIAS = "senderKeyPair"; - - public static final String SIGNING_ALGORITHM = "SHA256withRSA"; - - private static final String RECEIVER_KEYSTORE = "receiver_keystore.p12"; - private static final String RECEIVER_ALIAS = "receiverKeyPair"; - - public static PrivateKey getPrivateKey() throws Exception { - KeyStore keyStore = KeyStore.getInstance(STORE_TYPE); - keyStore.load(new FileInputStream(SENDER_KEYSTORE), PASSWORD); - return (PrivateKey) keyStore.getKey(SENDER_ALIAS, PASSWORD); - } - - public static PublicKey getPublicKey() throws Exception { - KeyStore keyStore = KeyStore.getInstance(STORE_TYPE); - keyStore.load(new FileInputStream(RECEIVER_KEYSTORE), PASSWORD); - Certificate certificate = keyStore.getCertificate(RECEIVER_ALIAS); - return certificate.getPublicKey(); - } -} diff --git a/libraries-security/src/main/java/com/baeldung/digitalsignature/level1/DigitalSignatureWithMessageDigestAndCipherSigning.java b/libraries-security/src/main/java/com/baeldung/digitalsignature/level1/DigitalSignatureWithMessageDigestAndCipherSigning.java deleted file mode 100644 index 78d40dd365..0000000000 --- a/libraries-security/src/main/java/com/baeldung/digitalsignature/level1/DigitalSignatureWithMessageDigestAndCipherSigning.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.digitalsignature.level1; - -import com.baeldung.digitalsignature.Utils; - -import javax.crypto.Cipher; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.security.MessageDigest; -import java.security.PrivateKey; - -public class DigitalSignatureWithMessageDigestAndCipherSigning { - - public static void main(String[] args) throws Exception { - - PrivateKey privateKey = Utils.getPrivateKey(); - - byte[] messageBytes = Files.readAllBytes(Paths.get("src/test/resources/digitalsignature/message.txt")); - - MessageDigest md = MessageDigest.getInstance("SHA-256"); - byte[] messageHash = md.digest(messageBytes); - - Cipher cipher = Cipher.getInstance("RSA"); - cipher.init(Cipher.ENCRYPT_MODE, privateKey); - byte[] digitalSignature = cipher.doFinal(messageHash); - - Files.write(Paths.get("target/digital_signature_1"), digitalSignature); - } -} diff --git a/libraries-security/src/main/java/com/baeldung/digitalsignature/level1/DigitalSignatureWithMessageDigestAndCipherVerifying.java b/libraries-security/src/main/java/com/baeldung/digitalsignature/level1/DigitalSignatureWithMessageDigestAndCipherVerifying.java deleted file mode 100644 index 0b242a44fb..0000000000 --- a/libraries-security/src/main/java/com/baeldung/digitalsignature/level1/DigitalSignatureWithMessageDigestAndCipherVerifying.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.digitalsignature.level1; - -import com.baeldung.digitalsignature.Utils; - -import javax.crypto.Cipher; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.security.MessageDigest; -import java.security.PublicKey; -import java.util.Arrays; - -public class DigitalSignatureWithMessageDigestAndCipherVerifying { - - public static void main(String[] args) throws Exception { - - PublicKey publicKey = Utils.getPublicKey(); - - byte[] messageBytes = Files.readAllBytes(Paths.get("src/test/resources/digitalsignature/message.txt")); - - MessageDigest md = MessageDigest.getInstance("SHA-256"); - byte[] newMessageHash = md.digest(messageBytes); - - byte[] encryptedMessageHash = Files.readAllBytes(Paths.get("target/digital_signature_1")); - - Cipher cipher = Cipher.getInstance("RSA"); - cipher.init(Cipher.DECRYPT_MODE, publicKey); - byte[] decryptedMessageHash = cipher.doFinal(encryptedMessageHash); - - boolean isCorrect = Arrays.equals(decryptedMessageHash, newMessageHash); - System.out.println("Signature " + (isCorrect ? "correct" : "incorrect")); - } - -} diff --git a/libraries-security/src/main/java/com/baeldung/digitalsignature/level2/DigitalSignatureWithSignatureSigning.java b/libraries-security/src/main/java/com/baeldung/digitalsignature/level2/DigitalSignatureWithSignatureSigning.java deleted file mode 100644 index afc8fd1045..0000000000 --- a/libraries-security/src/main/java/com/baeldung/digitalsignature/level2/DigitalSignatureWithSignatureSigning.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.digitalsignature.level2; - -import com.baeldung.digitalsignature.Utils; - -import java.nio.file.Files; -import java.nio.file.Paths; -import java.security.PrivateKey; -import java.security.Signature; - -public class DigitalSignatureWithSignatureSigning { - - public static void main(String[] args) throws Exception { - - PrivateKey privateKey = Utils.getPrivateKey(); - - Signature signature = Signature.getInstance(Utils.SIGNING_ALGORITHM); - signature.initSign(privateKey); - - byte[] messageBytes = Files.readAllBytes(Paths.get("src/test/resources/digitalsignature/message.txt")); - - signature.update(messageBytes); - byte[] digitalSignature = signature.sign(); - - Files.write(Paths.get("target/digital_signature_2"), digitalSignature); - } - -} diff --git a/libraries-security/src/main/java/com/baeldung/digitalsignature/level2/DigitalSignatureWithSignatureVerifying.java b/libraries-security/src/main/java/com/baeldung/digitalsignature/level2/DigitalSignatureWithSignatureVerifying.java deleted file mode 100644 index ee34be989c..0000000000 --- a/libraries-security/src/main/java/com/baeldung/digitalsignature/level2/DigitalSignatureWithSignatureVerifying.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.digitalsignature.level2; - -import com.baeldung.digitalsignature.Utils; - -import java.nio.file.Files; -import java.nio.file.Paths; -import java.security.PublicKey; -import java.security.Signature; - -public class DigitalSignatureWithSignatureVerifying { - - public static void main(String[] args) throws Exception { - - PublicKey publicKey = Utils.getPublicKey(); - - byte[] sig = Files.readAllBytes(Paths.get("target/digital_signature_2")); - - Signature signature = Signature.getInstance(Utils.SIGNING_ALGORITHM); - signature.initVerify(publicKey); - - byte[] messageBytes = Files.readAllBytes(Paths.get("src/test/resources/digitalsignature/message.txt")); - - signature.update(messageBytes); - - boolean isCorrect = signature.verify(sig); - System.out.println("Signature " + (isCorrect ? "correct" : "incorrect")); - } -} diff --git a/libraries-security/src/test/java/com/baeldung/digitalsignature/DigitalSignatureUnitTest.java b/libraries-security/src/test/java/com/baeldung/digitalsignature/DigitalSignatureUnitTest.java new file mode 100644 index 0000000000..65058dca52 --- /dev/null +++ b/libraries-security/src/test/java/com/baeldung/digitalsignature/DigitalSignatureUnitTest.java @@ -0,0 +1,76 @@ +package com.baeldung.digitalsignature; + +import org.junit.Test; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.security.PrivateKey; +import java.security.PublicKey; + +import static org.junit.Assert.assertTrue; + +public class DigitalSignatureUnitTest { + + String messagePath = "src/test/resources/digitalsignature/message.txt"; + String senderKeyStore = "src/test/resources/digitalsignature/sender_keystore.jks"; + String receiverKeyStore = "src/test/resources/digitalsignature/receiver_keystore.jks"; + String storeType = "JKS"; + String senderAlias = "senderKeyPair"; + String receiverAlias = "receiverKeyPair"; + char[] password = "changeit".toCharArray(); + String signingAlgorithm = "SHA256withRSA"; + String hashingAlgorithm = "SHA-256"; + + @Test + public void givenMessageData_whenSignWithSignatureSigning_thenVerify() throws Exception { + PrivateKey privateKey = DigitalSignatureUtils.getPrivateKey(senderKeyStore, password, storeType, senderAlias); + byte[] messageBytes = Files.readAllBytes(Paths.get(messagePath)); + + byte[] digitalSignature = DigitalSignatureUtils.sign(messageBytes, signingAlgorithm, privateKey); + + PublicKey publicKey = DigitalSignatureUtils.getPublicKey(receiverKeyStore, password, storeType, receiverAlias); + boolean isCorrect = DigitalSignatureUtils.verify(messageBytes, signingAlgorithm, publicKey, digitalSignature); + + assertTrue(isCorrect); + } + + @Test + public void givenMessageData_whenSignWithMessageDigestAndCipher_thenVerify() throws Exception { + PrivateKey privateKey = DigitalSignatureUtils.getPrivateKey(senderKeyStore, password, storeType, senderAlias); + byte[] messageBytes = Files.readAllBytes(Paths.get(messagePath)); + + byte[] encryptedMessageHash = DigitalSignatureUtils.signWithMessageDigestAndCipher(messageBytes, hashingAlgorithm, privateKey); + + PublicKey publicKey = DigitalSignatureUtils.getPublicKey(receiverKeyStore, password, storeType, receiverAlias); + boolean isCorrect = DigitalSignatureUtils.verifyWithMessageDigestAndCipher(messageBytes, hashingAlgorithm, publicKey, encryptedMessageHash); + + assertTrue(isCorrect); + } + + @Test + public void givenMessageData_whenSignWithSignatureSigning_thenVerifyWithMessageDigestAndCipher() throws Exception { + PrivateKey privateKey = DigitalSignatureUtils.getPrivateKey(senderKeyStore, password, storeType, senderAlias); + byte[] messageBytes = Files.readAllBytes(Paths.get(messagePath)); + + byte[] digitalSignature = DigitalSignatureUtils.sign(messageBytes, signingAlgorithm, privateKey); + + PublicKey publicKey = DigitalSignatureUtils.getPublicKey(receiverKeyStore, password, storeType, receiverAlias); + boolean isCorrect = DigitalSignatureUtils.verifyWithMessageDigestAndCipher(messageBytes, hashingAlgorithm, publicKey, digitalSignature); + + assertTrue(isCorrect); + } + + @Test + public void givenMessageData_whenSignWithMessageDigestAndCipher_thenVerifyWithSignature() throws Exception { + PrivateKey privateKey = DigitalSignatureUtils.getPrivateKey(senderKeyStore, password, storeType, senderAlias); + byte[] messageBytes = Files.readAllBytes(Paths.get(messagePath)); + + byte[] encryptedMessageHash = DigitalSignatureUtils.signWithMessageDigestAndCipher(messageBytes, hashingAlgorithm, privateKey); + + PublicKey publicKey = DigitalSignatureUtils.getPublicKey(receiverKeyStore, password, storeType, receiverAlias); + boolean isCorrect = DigitalSignatureUtils.verify(messageBytes, signingAlgorithm, publicKey, encryptedMessageHash); + + assertTrue(isCorrect); + } + +} diff --git a/libraries-security/src/test/resources/digitalsignature/receiver_keystore.jks b/libraries-security/src/test/resources/digitalsignature/receiver_keystore.jks new file mode 100644 index 0000000000000000000000000000000000000000..184b5b8600adc83b8e40ccd9f91ba17045004a9b GIT binary patch literal 785 zcmezO_TO6u1_mY|W(3pxMXAZDnPsU(*{PKUiJ3(}@wN;f#ySSp2t88+OQ6z|22D&y z4VoC&E?{P2WMX2;3ftCXz{|#|)#lOmotKf3o0Y*p*ig`bpN%<`g;|)xDKRxCr8FLhAedPAsq7C0_d7+T*5}p^f>wqx1e}7~baHz@YW>|L>kD zbInrlHW4XSpI&&l6Zw+imPuO4SC#9F9zK+{?Fn;SXRdP0%C5>&`Fdr<>QB|laR;l#zCC zu54#wW@KPotY{!_APWp{Sw0pq77@p&4e1M1&4TY$IxjnX-eLE-<(F?D2O=VfiIljs!1(Pjg(an_ZuG_h*drj+Ae&J|2FTWM39vZtI)guF`nSx-7y_?_P$8 z_mc`IzlGbA40L9%pIx~=hV}csbjIxhoF%)r@8Rg1*uB>3$qS3k?$*g=o(l7nUY?5% zTYPW%;l+0vLjrgV&%duMPP+c}_~~|;;~(x$Jez%N!G!FY$#IU}U17nDA)>$Lf0T(z znDjS{&z)E8!2JBOtGn0fuNxQ11W$1pzRE z1pP1$1_~<%0R#am0uccL1pows1nH#M%}(`SxrW@K;Iqy^j*%zT*uBod0)-sit*PE# z{c3x!vMP18A?!HPeoD~c6&pfBp?jTnIMf1wP*qa#3%qJW8zNY5sw6Z$s^PwS^^^$Bui1y)!SMtGrQ=*u z1R^)5VPi>Gh30`MHVj%i4~d6EZARIgGITFF_b@v4tCfF(xIiQP50TnQxYL=0rVxjZ znJi!ht=&e;SG6@Q!+;0KcB`FXWy4Xc$Vii>Xye%>Kx(41D!XYQpq)Ab`Bg8F z)Y)wL=6m;ZNL)c3L&WL0J`~3g8_=!4NjA%(eR)iHp#GeD{=>E_C`uT}tb;0k&r|tW z@ZBL`LYG`ntkG~ShR(=`IC2)L8RsBte zlx$rdI~`f@E!;`^n@06nqf@JzpRB%KE^y$W?Ib~<1|?zoGk?G;i>nzMcF{T?@zz#m z$F!hO_dW-em9nN^+BAoitdSn-Q%C>Oud|UOya#E_#X6^Q=X@cp1hHR!F7J2Yai*m% zw>nNW(;?jSlRu1LnTz9#tGX?B|Hta+_Ws#1kI-jgPFyastr!XbeKe?WF`ZLHPVh|S zlIl_#mcBKku$is}nd&?D!6RqG55dm~Tw+LizO!0kob#yIxr3K(I<) z`C7KZKC0ilO%jGwG`S7xL)rdI&ijYfUz!V}@$%Kq`=#?&5fbsX)^QJ_Z{KZnu-))w zFk)v&LNQUHXL zinl@8Hnf`s*J+uC!rJg=^t`2aW_kfsGIjy?WJ&kP_=$+(y>TVO2*n}J7)7q(LMJLQ z_O%~yRJ1$@rm0smSjbAgQ(yrtbAZ%*j0Ws1T}Q!#9mpt>}25+}b- z$ftR_7j^eLNZA%KJU8yep8seu+YPV)D*6BWjFg?ukMGQPn@2^|#2r{as}orf`kqs8 z+8?x$Gauh@q+cM$)s1Sf6iPCKqHA3ni)}&ehklfrG-h=5B-f(h;T=7URza>eB*r>E zdPyVKd04CRdt+X~d(Nb`sqtiYb_M#Mrqs6r0|5X5qaiRKFdYU1RUHll76cSQTCiuJ zB{oyuc|)ed&p^A*r_hZ(wVn23YcRfvKha`ckZYM^UO`KWR#O2~75bm?99m$K{Z!Z+2th8BO6D2nI_^z*cl6 zA=~p>#*LO!R)3)ruCd&BC*>-`u6o;JI5t!QsG0Sl9ra@a7;^1r4|vSuSRf^!+Ktl3 z-^JUk2X-;%`V2wYo;eQpbgUCD2zsz2Lh;J_A9GPOm_iK;!OR@NDoZSZt9V-idlWB6 C3dLFg literal 0 HcmV?d00001 From ef6752a198460762e97c00b44384648d90a79bc4 Mon Sep 17 00:00:00 2001 From: Cesare Date: Sun, 19 Feb 2023 16:19:46 +0100 Subject: [PATCH 491/592] BAEL-6125 Migrate Application from Spring Boot 2 to Spring Boot 3 -fix test naming --- .../sample/boundary/TodosControllerApiIntegrationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/sample/boundary/TodosControllerApiIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/sample/boundary/TodosControllerApiIntegrationTest.java index d809c5f9c9..3a80bc8a6c 100644 --- a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/sample/boundary/TodosControllerApiIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/sample/boundary/TodosControllerApiIntegrationTest.java @@ -216,14 +216,14 @@ class TodosControllerApiIntegrationTest { } @Test - void testGetSlashMatchingNotExisting() throws Exception { + void whenThereIsNoSlashMatching_ThenHttpStatusIs404() throws Exception { mvc .perform(get(BASEURL + "/name/").contentType(DEFAULT_MEDIA_TYPE)) .andExpect(status().isNotFound()); } @Test - void testGetNameExists() throws Exception { + void whenThereIsNoSlashMatching_ThenHttpStatusIs200() throws Exception { mvc .perform(get(BASEURL + "/name").contentType(DEFAULT_MEDIA_TYPE)) .andExpect(status().isOk()); From 8f2e92dacb3be617ae1504b71c73424e35bb6c42 Mon Sep 17 00:00:00 2001 From: Palaniappan Arunachalam Date: Mon, 20 Feb 2023 09:43:42 +0530 Subject: [PATCH 492/592] BAEL-6154: Migrate from Java 8 to Java 17 + tests (#13474) --- .../java/com/baeldung/java8to17/Address.java | 40 +++++++++ .../java/com/baeldung/java8to17/Circle.java | 4 + .../java/com/baeldung/java8to17/Person.java | 30 +++++++ .../com/baeldung/java8to17/Rectangle.java | 4 + .../java/com/baeldung/java8to17/Shape.java | 5 ++ .../java/com/baeldung/java8to17/Student.java | 5 ++ .../java17/Java8to17ExampleUnitTest.java | 87 +++++++++++++++++++ 7 files changed, 175 insertions(+) create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Address.java create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Circle.java create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Person.java create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Rectangle.java create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Shape.java create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Student.java create mode 100644 core-java-modules/core-java-17/src/test/java/com/baeldung/java17/Java8to17ExampleUnitTest.java diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Address.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Address.java new file mode 100644 index 0000000000..b654ffe2c5 --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Address.java @@ -0,0 +1,40 @@ +package com.baeldung.java8to17; + +public class Address { + + private String street; + private String city; + private String pin; + + public Address(String street, String city, String pin) { + super(); + this.street = street; + this.city = city; + this.pin = pin; + } + + public String getStreet() { + return street; + } + + public void setStreet(String street) { + this.street = street; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getPin() { + return pin; + } + + public void setPin(String pin) { + this.pin = pin; + } + +} diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Circle.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Circle.java new file mode 100644 index 0000000000..1e346653cf --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Circle.java @@ -0,0 +1,4 @@ +package com.baeldung.java8to17; + +public record Circle(double radius) implements Shape { +} \ No newline at end of file diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Person.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Person.java new file mode 100644 index 0000000000..a6c9f50fc8 --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Person.java @@ -0,0 +1,30 @@ +package com.baeldung.java8to17; + +public class Person { + + private String name; + private Address address; + + public Person(String name, Address address) { + super(); + this.name = name; + this.address = address; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } + +} diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Rectangle.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Rectangle.java new file mode 100644 index 0000000000..79d2f0358b --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Rectangle.java @@ -0,0 +1,4 @@ +package com.baeldung.java8to17; + +public record Rectangle(double length, double width) implements Shape { +} \ No newline at end of file diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Shape.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Shape.java new file mode 100644 index 0000000000..60b5193468 --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Shape.java @@ -0,0 +1,5 @@ +package com.baeldung.java8to17; + +public interface Shape { + +} diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Student.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Student.java new file mode 100644 index 0000000000..056bc4b7d5 --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/java8to17/Student.java @@ -0,0 +1,5 @@ +package com.baeldung.java8to17; + +public record Student(int rollNo, String name) { + +} diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/java17/Java8to17ExampleUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/java17/Java8to17ExampleUnitTest.java new file mode 100644 index 0000000000..950fc70988 --- /dev/null +++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/java17/Java8to17ExampleUnitTest.java @@ -0,0 +1,87 @@ +package com.baeldung.java17; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertThrows; + +import java.util.Arrays; + +import org.junit.jupiter.api.Test; + +import com.baeldung.java8to17.Address; +import com.baeldung.java8to17.Circle; +import com.baeldung.java8to17.Person; +import com.baeldung.java8to17.Rectangle; +import com.baeldung.java8to17.Student; + +public class Java8to17ExampleUnitTest { + + @Test + void givenMultiLineText_whenUsingTextBlock_thenStringIsReturned() { + String value = """ + This is a + Multi-line + Text + """; + + assertThat(value).isEqualTo("This is a\nMulti-line\nText\n"); + } + + @Test + void givenString_whenUsingUtilFunctions_thenReturnsExpectedResult() { + assertThat(" ".isBlank()); + assertThat("Twinkle ".repeat(2)).isEqualTo("Twinkle Twinkle "); + assertThat("Format Line".indent(4)).isEqualTo(" Format Line\n"); + assertThat("Line 1 \n Line2".lines()).asList().size().isEqualTo(2); + assertThat(" Text with white spaces ".strip()).isEqualTo("Text with white spaces"); + assertThat("Car, Bus, Train".transform(s1 -> Arrays.asList(s1.split(","))).get(0)).isEqualTo("Car"); + } + + @Test + void givenDataModel_whenUsingRecordType_thenBehavesLikeDTO() { + Student student = new Student(10, "Priya"); + Student student2 = new Student(10, "Priya"); + + assertThat(student.rollNo()).isEqualTo(10); + assertThat(student.name()).isEqualTo("Priya"); + assertThat(student.equals(student2)); + assertThat(student.hashCode()).isEqualTo(student2.hashCode()); + } + + @Test + void givenObject_whenThrowingNPE_thenReturnsHelpfulMessage() { + Person student = new Person("Lakshmi", new Address("35, West Street", null, null)); + + Exception exception = assertThrows(NullPointerException.class, () -> { + student.getAddress().getCity().toLowerCase(); + }); + + assertThat(exception.getMessage()).isEqualTo( + "Cannot invoke \"String.toLowerCase()\" because the return value of \"com.baeldung.java8to17.Address.getCity()\" is null"); + } + + @Test + void givenGenericObject_whenUsingPatternMatching_thenReturnsTargetType() { + String city = null; + Object obj = new Address("35, West Street", "Chennai", "6000041"); + + if (obj instanceof Address address) { + city = address.getCity(); + } + + assertThat(city).isEqualTo("Chennai"); + } + + @Test + void givenGenericObject_whenUsingSwitchExpression_thenPatternMatchesRightObject() { + Object shape = new Rectangle(10, 20); + + double circumference = switch (shape) { + case Rectangle r -> 2 * r.length() + 2 * r.width(); + case Circle c -> 2 * c.radius() * Math.PI; + default -> throw new IllegalArgumentException("Unknown shape"); + }; + + assertThat(circumference).isEqualTo(60); + } + +} From 639de9687e1292ba28e56ef0ef783db7b2955cd5 Mon Sep 17 00:00:00 2001 From: Abhinav Pandey Date: Mon, 20 Feb 2023 13:52:52 +0530 Subject: [PATCH 493/592] BAEL-4971 - Object mapping with Cassandra (#13427) * BAEL-4971 - Object mapping with Cassandra * BAEL-4971 - Object mapping with Cassandra * BAEL-4971 - Object mapping with Cassandra - changing test name * BAEL-4971 - Object mapping with Cassandra - code formatting * BAEL-4971 - Object mapping with Cassandra - review incorporation --- .../spring-data-cassandra-2/pom.xml | 24 +++++ .../CassandraMapperApplication.java | 12 +++ .../org/baeldung/objectmapper/DaoMapper.java | 18 ++++ .../baeldung/objectmapper/dao/CounterDao.java | 16 ++++ .../baeldung/objectmapper/dao/UserDao.java | 38 ++++++++ .../objectmapper/dao/UserQueryProvider.java | 34 +++++++ .../baeldung/objectmapper/entity/Admin.java | 31 ++++++ .../baeldung/objectmapper/entity/Counter.java | 29 ++++++ .../baeldung/objectmapper/entity/User.java | 58 +++++++++++ .../baeldung/objectmapper/MapperLiveTest.java | 96 +++++++++++++++++++ 10 files changed, 356 insertions(+) create mode 100644 persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/CassandraMapperApplication.java create mode 100644 persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/DaoMapper.java create mode 100644 persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/dao/CounterDao.java create mode 100644 persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/dao/UserDao.java create mode 100644 persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/dao/UserQueryProvider.java create mode 100644 persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/entity/Admin.java create mode 100644 persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/entity/Counter.java create mode 100644 persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/entity/User.java create mode 100644 persistence-modules/spring-data-cassandra-2/src/test/java/org/baeldung/objectmapper/MapperLiveTest.java diff --git a/persistence-modules/spring-data-cassandra-2/pom.xml b/persistence-modules/spring-data-cassandra-2/pom.xml index 1e6412dc17..740c04d2a0 100644 --- a/persistence-modules/spring-data-cassandra-2/pom.xml +++ b/persistence-modules/spring-data-cassandra-2/pom.xml @@ -60,8 +60,32 @@ ${system.stubs.version} test + + com.datastax.oss + java-driver-mapper-runtime + 4.15.0 + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + + com.datastax.oss + java-driver-mapper-processor + 4.15.0 + + + + + + + 11 3.1.11 diff --git a/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/CassandraMapperApplication.java b/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/CassandraMapperApplication.java new file mode 100644 index 0000000000..da66ee1401 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/CassandraMapperApplication.java @@ -0,0 +1,12 @@ +package org.baeldung.objectmapper; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CassandraMapperApplication { + + public static void main(String[] args) { + SpringApplication.run(CassandraMapperApplication.class, args); + } +} diff --git a/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/DaoMapper.java b/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/DaoMapper.java new file mode 100644 index 0000000000..f7e937702d --- /dev/null +++ b/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/DaoMapper.java @@ -0,0 +1,18 @@ +package org.baeldung.objectmapper; + +import com.datastax.oss.driver.api.core.CqlIdentifier; +import com.datastax.oss.driver.api.mapper.annotations.DaoFactory; +import com.datastax.oss.driver.api.mapper.annotations.DaoKeyspace; +import com.datastax.oss.driver.api.mapper.annotations.Mapper; +import org.baeldung.objectmapper.dao.CounterDao; +import org.baeldung.objectmapper.dao.UserDao; + +@Mapper +public interface DaoMapper { + + @DaoFactory + UserDao getUserDao(@DaoKeyspace CqlIdentifier keyspace); + + @DaoFactory + CounterDao getUserCounterDao(@DaoKeyspace CqlIdentifier keyspace); +} \ No newline at end of file diff --git a/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/dao/CounterDao.java b/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/dao/CounterDao.java new file mode 100644 index 0000000000..71978ce116 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/dao/CounterDao.java @@ -0,0 +1,16 @@ +package org.baeldung.objectmapper.dao; + +import com.datastax.oss.driver.api.mapper.annotations.Dao; +import com.datastax.oss.driver.api.mapper.annotations.Increment; +import com.datastax.oss.driver.api.mapper.annotations.Select; +import org.baeldung.objectmapper.entity.Counter; + +@Dao +public interface CounterDao { + + @Increment(entityClass = Counter.class) + void incrementCounter(String id, long count); + + @Select + Counter getCounterById(String id); +} diff --git a/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/dao/UserDao.java b/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/dao/UserDao.java new file mode 100644 index 0000000000..9e06066c1e --- /dev/null +++ b/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/dao/UserDao.java @@ -0,0 +1,38 @@ +package org.baeldung.objectmapper.dao; + +import com.datastax.oss.driver.api.core.PagingIterable; +import com.datastax.oss.driver.api.core.cql.BoundStatement; +import com.datastax.oss.driver.api.core.cql.Row; +import com.datastax.oss.driver.api.mapper.annotations.*; +import org.baeldung.objectmapper.entity.User; + +@Dao +public interface UserDao { + + @Insert + void insertUser(User user); + + @Select + User getUserById(int id); + + @Select + PagingIterable getAllUsers(); + + @Update + void updateUser(User user); + + @Delete + void deleteUser(User user); + + @GetEntity + User getUser(Row row); + + @SetEntity + BoundStatement setUser(BoundStatement udtValue, User user); + + @Query(value = "select * from user_profile where user_age > :userAge ALLOW FILTERING") + PagingIterable getUsersOlderThanAge(int userAge); + + @QueryProvider(providerClass = UserQueryProvider.class, entityHelpers = User.class, providerMethod = "getUsersOlderThanAge") + PagingIterable getUsersOlderThan(String age); +} diff --git a/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/dao/UserQueryProvider.java b/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/dao/UserQueryProvider.java new file mode 100644 index 0000000000..10c56a9310 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/dao/UserQueryProvider.java @@ -0,0 +1,34 @@ +package org.baeldung.objectmapper.dao; + +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.PagingIterable; +import com.datastax.oss.driver.api.core.cql.PreparedStatement; +import com.datastax.oss.driver.api.core.cql.SimpleStatement; +import com.datastax.oss.driver.api.mapper.MapperContext; +import com.datastax.oss.driver.api.mapper.entity.EntityHelper; +import com.datastax.oss.driver.api.querybuilder.QueryBuilder; +import org.baeldung.objectmapper.entity.User; + +public class UserQueryProvider { + + private final CqlSession session; + private final EntityHelper userHelper; + + public UserQueryProvider(MapperContext context, EntityHelper userHelper) { + this.session = context.getSession(); + this.userHelper = userHelper; + } + + public PagingIterable getUsersOlderThanAge(String age) { + SimpleStatement statement = QueryBuilder.selectFrom("user_profile") + .all() + .whereColumn("user_age") + .isGreaterThan(QueryBuilder + .bindMarker(age)) + .build(); + PreparedStatement preparedSelectUser = session.prepare(statement); + return session + .execute(preparedSelectUser.getQuery()) + .map(result -> userHelper.get(result, true)); + } +} diff --git a/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/entity/Admin.java b/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/entity/Admin.java new file mode 100644 index 0000000000..afd6b74490 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/entity/Admin.java @@ -0,0 +1,31 @@ +package org.baeldung.objectmapper.entity; + +import com.datastax.oss.driver.api.mapper.annotations.CqlName; +import com.datastax.oss.driver.api.mapper.annotations.Entity; +import com.datastax.oss.driver.api.mapper.annotations.HierarchyScanStrategy; + +@Entity +@CqlName("admin_profile") +@HierarchyScanStrategy(highestAncestor = User.class, includeHighestAncestor = true) +public class Admin extends User { + private String role; + private String department; + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public String getDepartment() { + return department; + } + + public void setDepartment(String department) { + this.department = department; + } + +} + diff --git a/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/entity/Counter.java b/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/entity/Counter.java new file mode 100644 index 0000000000..88b49b561e --- /dev/null +++ b/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/entity/Counter.java @@ -0,0 +1,29 @@ +package org.baeldung.objectmapper.entity; + +import com.datastax.oss.driver.api.mapper.annotations.Entity; +import com.datastax.oss.driver.api.mapper.annotations.PartitionKey; + +@Entity +public class Counter { + + @PartitionKey + private String id; + private long count; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public long getCount() { + return count; + } + + public void setCount(long count) { + this.count = count; + } + +} diff --git a/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/entity/User.java b/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/entity/User.java new file mode 100644 index 0000000000..31612ffe73 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-2/src/main/java/org/baeldung/objectmapper/entity/User.java @@ -0,0 +1,58 @@ +package org.baeldung.objectmapper.entity; + +import com.datastax.oss.driver.api.mapper.annotations.*; + +@Entity +@CqlName("user_profile") +public class User { + @PartitionKey + private int id; + @CqlName("username") + private String userName; + @ClusteringColumn + private int userAge; + + @Computed("writetime(userName)") + private long writetime; + + public User() { + } + + public User(int id, String userName, int userAge) { + this.id = id; + this.userName = userName; + this.userAge = userAge; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public int getUserAge() { + return userAge; + } + + public void setUserAge(int userAge) { + this.userAge = userAge; + } + + public long getWritetime() { + return writetime; + } + + public void setWritetime(long writetime) { + this.writetime = writetime; + } +} \ No newline at end of file diff --git a/persistence-modules/spring-data-cassandra-2/src/test/java/org/baeldung/objectmapper/MapperLiveTest.java b/persistence-modules/spring-data-cassandra-2/src/test/java/org/baeldung/objectmapper/MapperLiveTest.java new file mode 100644 index 0000000000..b61663d622 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-2/src/test/java/org/baeldung/objectmapper/MapperLiveTest.java @@ -0,0 +1,96 @@ +package org.baeldung.objectmapper; + +import com.datastax.oss.driver.api.core.CqlIdentifier; +import com.datastax.oss.driver.api.core.CqlSession; +import org.baeldung.objectmapper.dao.CounterDao; +import org.baeldung.objectmapper.dao.UserDao; +import org.baeldung.objectmapper.entity.Counter; +import org.baeldung.objectmapper.entity.User; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.testcontainers.containers.CassandraContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +import java.util.List; + +@Testcontainers +@SpringBootTest +public class MapperLiveTest { + + private static final String KEYSPACE_NAME = "baeldung"; + + @Container + private static final CassandraContainer cassandra = (CassandraContainer) new CassandraContainer("cassandra:3.11.2") + .withExposedPorts(9042); + + static void setupCassandraConnectionProperties() { + System.setProperty("spring.data.cassandra.keyspace-name", KEYSPACE_NAME); + System.setProperty("spring.data.cassandra.contact-points", cassandra.getContainerIpAddress()); + System.setProperty("spring.data.cassandra.port", String.valueOf(cassandra.getMappedPort(9042))); + } + + static UserDao userDao; + static CounterDao counterDao; + + @BeforeAll + static void setup() { + setupCassandraConnectionProperties(); + CqlSession session = CqlSession.builder().build(); + + String createKeyspace = "CREATE KEYSPACE IF NOT EXISTS baeldung " + + "WITH replication = {'class':'SimpleStrategy', 'replication_factor':1};"; + String useKeyspace = "USE baeldung;"; + String createUserTable = "CREATE TABLE IF NOT EXISTS user_profile " + + "(id int, username text, user_age int, writetime bigint, PRIMARY KEY (id, user_age)) " + + "WITH CLUSTERING ORDER BY (user_age DESC);"; + String createAdminTable = "CREATE TABLE IF NOT EXISTS admin_profile " + + "(id int, username text, user_age int, role text, writetime bigint, department text, " + + "PRIMARY KEY (id, user_age)) " + + "WITH CLUSTERING ORDER BY (user_age DESC);"; + String createCounter = "CREATE TABLE IF NOT EXISTS counter " + + "(id text, count counter, PRIMARY KEY (id));"; + + session.execute(createKeyspace); + session.execute(useKeyspace); + session.execute(createUserTable); + session.execute(createAdminTable); + session.execute(createCounter); + + DaoMapper mapper = new DaoMapperBuilder(session).build(); + userDao = mapper.getUserDao(CqlIdentifier.fromCql("baeldung")); + counterDao = mapper.getUserCounterDao(CqlIdentifier.fromCql("baeldung")); + } + + @Test + void givenUser_whenInsert_thenRetrievedDuringGet() { + User user = new User(1, "JohnDoe", 31); + userDao.insertUser(user); + User retrievedUser = userDao.getUserById(1); + Assertions.assertEquals(retrievedUser.getUserName(), user.getUserName()); + } + + @Test + void givenCounter_whenIncrement_thenIncremented() { + Counter users = counterDao.getCounterById("users"); + long initialCount = users != null ? users.getCount(): 0; + + counterDao.incrementCounter("users", 1); + + users = counterDao.getCounterById("users"); + long finalCount = users != null ? users.getCount(): 0; + + Assertions.assertEquals(finalCount - initialCount, 1); + } + + @Test + void givenUser_whenGetUsersOlderThan_thenRetrieved() { + User user = new User(2, "JaneDoe", 20); + userDao.insertUser(user); + List retrievedUsers = userDao.getUsersOlderThanAge(30).all(); + Assertions.assertEquals(retrievedUsers.size(), 1); + } + +} \ No newline at end of file From 9523e4dcc8874a41e6ea645b161da57ff0ddc181 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Mon, 20 Feb 2023 16:07:13 +0200 Subject: [PATCH 494/592] [JAVA-18603] Upgraded junit-jupiter.version to 5.9.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8b395d44f1..f04f93e339 100644 --- a/pom.xml +++ b/pom.xml @@ -1344,7 +1344,7 @@ 2.13.3 1.4 1.8.1 - 5.8.1 + 5.9.2 1.3.2 0.3.1 2.5.2 From 09382f545e65b331782838c60b4bc579f49e325e Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Mon, 20 Feb 2023 18:18:26 +0200 Subject: [PATCH 495/592] JAVA-17818 Split or move spring-cloud-openfeign module (conti-2) (#13485) Co-authored-by: timis1 --- feign/README.md | 5 +++ feign/pom.xml | 19 ++++++++ .../com/baeldung/core/ExampleApplication.java | 16 +++++++ .../baeldung/core}/client/EmployeeClient.java | 5 ++- .../com/baeldung/core/client/UserClient.java | 13 ++++++ .../baeldung/core}/config/FeignConfig.java | 5 ++- .../core}/controller/EmployeeController.java | 12 ++--- .../client/ProductClient.java | 8 ++-- .../config/CustomErrorDecoder.java | 9 ++-- .../config/FeignConfig.java | 5 ++- .../controller/ProductController.java | 13 +++--- .../exception/ErrorResponse.java | 9 ++-- .../exception/ProductExceptionHandler.java | 3 +- .../exception/ProductNotFoundException.java | 2 +- .../ProductServiceNotAvailableException.java | 2 +- .../client/ProductClient.java | 8 ++-- .../config/FeignConfig.java | 5 ++- .../controller/ProductController.java | 13 +++--- .../defaulterrorhandling/model/Product.java | 2 +- .../core/exception/BadRequestException.java | 21 +++++++++ .../core/exception/NotFoundException.java | 18 ++++++++ .../fileupload/config/ExceptionMessage.java | 2 +- .../fileupload/config/FeignSupportConfig.java | 10 +---- .../config/RetreiveMessageErrorDecoder.java | 8 ++-- .../fileupload/controller/FileController.java | 4 +- .../fileupload/service/UploadClient.java | 4 +- .../fileupload/service/UploadResource.java | 2 +- .../fileupload/service/UploadService.java | 2 +- .../com/baeldung/core}/model/Employee.java | 2 +- .../src/main/resources/application.properties | 2 + .../src/main/resources/fileupload.txt | 0 feign/src/main/resources/logback.xml | 14 ------ feign/src/main/resources/logback_spring.xml | 45 +++++++++++++++++++ .../core}/OpenFeignFileUploadLiveTest.java | 6 +-- .../client/ProductClientUnitTest.java | 20 ++++++--- .../controller/ProductControllerUnitTest.java | 24 +++++----- .../client/ProductClientUnitTest.java | 23 ++++++---- .../controller/ProductControllerUnitTest.java | 20 +++++---- .../controller/TestControllerAdvice.java | 5 ++- .../spring-cloud-openfeign/README.md | 4 -- .../spring-cloud-openfeign/pom.xml | 6 --- .../cloud/openfeign/client/UserClient.java | 13 ------ 42 files changed, 269 insertions(+), 140 deletions(-) create mode 100644 feign/src/main/java/com/baeldung/core/ExampleApplication.java rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/client/EmployeeClient.java (73%) create mode 100644 feign/src/main/java/com/baeldung/core/client/UserClient.java rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/config/FeignConfig.java (79%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/controller/EmployeeController.java (81%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/customizederrorhandling/client/ProductClient.java (70%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/customizederrorhandling/config/CustomErrorDecoder.java (65%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/customizederrorhandling/config/FeignConfig.java (81%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/customizederrorhandling/controller/ProductController.java (52%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/customizederrorhandling/exception/ErrorResponse.java (94%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/customizederrorhandling/exception/ProductExceptionHandler.java (92%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/customizederrorhandling/exception/ProductNotFoundException.java (68%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/customizederrorhandling/exception/ProductServiceNotAvailableException.java (70%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/defaulterrorhandling/client/ProductClient.java (70%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/defaulterrorhandling/config/FeignConfig.java (74%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/defaulterrorhandling/controller/ProductController.java (52%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/defaulterrorhandling/model/Product.java (82%) create mode 100644 feign/src/main/java/com/baeldung/core/exception/BadRequestException.java create mode 100644 feign/src/main/java/com/baeldung/core/exception/NotFoundException.java rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/fileupload/config/ExceptionMessage.java (95%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/fileupload/config/FeignSupportConfig.java (57%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/fileupload/config/RetreiveMessageErrorDecoder.java (82%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/fileupload/controller/FileController.java (88%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/fileupload/service/UploadClient.java (85%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/fileupload/service/UploadResource.java (85%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/fileupload/service/UploadService.java (94%) rename {spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign => feign/src/main/java/com/baeldung/core}/model/Employee.java (81%) rename {spring-cloud-modules/spring-cloud-openfeign => feign}/src/main/resources/fileupload.txt (100%) delete mode 100644 feign/src/main/resources/logback.xml create mode 100644 feign/src/main/resources/logback_spring.xml rename {spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign => feign/src/test/java/com/baeldung/core}/OpenFeignFileUploadLiveTest.java (93%) rename {spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign => feign/src/test/java/com/baeldung/core}/customizederrorhandling/client/ProductClientUnitTest.java (69%) rename {spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign => feign/src/test/java/com/baeldung/core}/customizederrorhandling/controller/ProductControllerUnitTest.java (88%) rename {spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign => feign/src/test/java/com/baeldung/core}/defaulterrorhandling/client/ProductClientUnitTest.java (81%) rename {spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign => feign/src/test/java/com/baeldung/core}/defaulterrorhandling/controller/ProductControllerUnitTest.java (85%) rename {spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign => feign/src/test/java/com/baeldung/core}/defaulterrorhandling/controller/TestControllerAdvice.java (88%) delete mode 100644 spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/UserClient.java diff --git a/feign/README.md b/feign/README.md index 2dea14ca52..8079c46e9e 100644 --- a/feign/README.md +++ b/feign/README.md @@ -7,3 +7,8 @@ This module contains articles about Feign - [Intro to Feign](https://www.baeldung.com/intro-to-feign) - [Retrying Feign Calls](https://www.baeldung.com/feign-retry) - [Setting Request Headers Using Feign](https://www.baeldung.com/java-feign-request-headers) +- [File Upload With Open Feign](https://www.baeldung.com/java-feign-file-upload) +- [Feign Logging Configuration](https://www.baeldung.com/java-feign-logging) +- [Retrieve Original Message From Feign ErrorDecoder](https://www.baeldung.com/feign-retrieve-original-message) +- [RequestLine with Feign Client](https://www.baeldung.com/feign-requestline) +- [Propagating Exceptions With OpenFeign and Spring](https://www.baeldung.com/spring-openfeign-propagate-exception) \ No newline at end of file diff --git a/feign/pom.xml b/feign/pom.xml index 3ac816fc1d..7338cf7508 100644 --- a/feign/pom.xml +++ b/feign/pom.xml @@ -64,6 +64,22 @@ spring-boot-starter-test test + + io.github.openfeign.form + feign-form-spring + ${feign.form.spring.version} + + + org.springframework.cloud + spring-cloud-starter-openfeign + ${spring.cloud.openfeign.version} + + + com.github.tomakehurst + wiremock-jre8 + ${wire.mock.version} + test + @@ -118,6 +134,9 @@ 11.8 1.6.3 + 3.8.0 + 3.1.2 + 2.33.2 \ No newline at end of file diff --git a/feign/src/main/java/com/baeldung/core/ExampleApplication.java b/feign/src/main/java/com/baeldung/core/ExampleApplication.java new file mode 100644 index 0000000000..391e808ede --- /dev/null +++ b/feign/src/main/java/com/baeldung/core/ExampleApplication.java @@ -0,0 +1,16 @@ +package com.baeldung.core; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; + +@SpringBootApplication +@EnableFeignClients +public class ExampleApplication { + + public static void main(String[] args) { + SpringApplication.run(ExampleApplication.class, args); + } + +} + diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/EmployeeClient.java b/feign/src/main/java/com/baeldung/core/client/EmployeeClient.java similarity index 73% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/EmployeeClient.java rename to feign/src/main/java/com/baeldung/core/client/EmployeeClient.java index 569401bdcf..0ff8637a94 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/EmployeeClient.java +++ b/feign/src/main/java/com/baeldung/core/client/EmployeeClient.java @@ -1,6 +1,7 @@ -package com.baeldung.cloud.openfeign.client; +package com.baeldung.core.client; + +import com.baeldung.core.model.Employee; -import com.baeldung.cloud.openfeign.model.Employee; import feign.Headers; import feign.Param; import feign.RequestLine; diff --git a/feign/src/main/java/com/baeldung/core/client/UserClient.java b/feign/src/main/java/com/baeldung/core/client/UserClient.java new file mode 100644 index 0000000000..a16f924ad5 --- /dev/null +++ b/feign/src/main/java/com/baeldung/core/client/UserClient.java @@ -0,0 +1,13 @@ +package com.baeldung.core.client; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; + +import com.baeldung.core.config.FeignConfig; + +@FeignClient(name = "user-client", url="https://jsonplaceholder.typicode.com", configuration = FeignConfig.class) +public interface UserClient { + + @GetMapping(value = "/users") + String getUsers(); +} \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/config/FeignConfig.java b/feign/src/main/java/com/baeldung/core/config/FeignConfig.java similarity index 79% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/config/FeignConfig.java rename to feign/src/main/java/com/baeldung/core/config/FeignConfig.java index d51e97b9e4..43da2fce0e 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/config/FeignConfig.java +++ b/feign/src/main/java/com/baeldung/core/config/FeignConfig.java @@ -1,7 +1,8 @@ -package com.baeldung.cloud.openfeign.config; +package com.baeldung.core.config; + +import org.springframework.context.annotation.Bean; import feign.Logger; -import org.springframework.context.annotation.Bean; public class FeignConfig { diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/controller/EmployeeController.java b/feign/src/main/java/com/baeldung/core/controller/EmployeeController.java similarity index 81% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/controller/EmployeeController.java rename to feign/src/main/java/com/baeldung/core/controller/EmployeeController.java index 65897ad48e..7f7d39240e 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/controller/EmployeeController.java +++ b/feign/src/main/java/com/baeldung/core/controller/EmployeeController.java @@ -1,13 +1,15 @@ -package com.baeldung.cloud.openfeign.controller; +package com.baeldung.core.controller; -import com.baeldung.cloud.openfeign.client.EmployeeClient; -import com.baeldung.cloud.openfeign.model.Employee; -import feign.Feign; -import feign.form.spring.SpringFormEncoder; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.baeldung.core.client.EmployeeClient; +import com.baeldung.core.model.Employee; + +import feign.Feign; +import feign.form.spring.SpringFormEncoder; + @RestController public class EmployeeController { diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/client/ProductClient.java b/feign/src/main/java/com/baeldung/core/customizederrorhandling/client/ProductClient.java similarity index 70% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/client/ProductClient.java rename to feign/src/main/java/com/baeldung/core/customizederrorhandling/client/ProductClient.java index 8a6c5d5846..113051722b 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/client/ProductClient.java +++ b/feign/src/main/java/com/baeldung/core/customizederrorhandling/client/ProductClient.java @@ -1,13 +1,13 @@ -package com.baeldung.cloud.openfeign.customizederrorhandling.client; - -import com.baeldung.cloud.openfeign.customizederrorhandling.config.FeignConfig; -import com.baeldung.cloud.openfeign.defaulterrorhandling.model.Product; +package com.baeldung.core.customizederrorhandling.client; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import com.baeldung.core.customizederrorhandling.config.FeignConfig; +import com.baeldung.core.defaulterrorhandling.model.Product; + @FeignClient(name = "product-client-2", url = "http://localhost:8081/product/", configuration = FeignConfig.class) public interface ProductClient { diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/config/CustomErrorDecoder.java b/feign/src/main/java/com/baeldung/core/customizederrorhandling/config/CustomErrorDecoder.java similarity index 65% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/config/CustomErrorDecoder.java rename to feign/src/main/java/com/baeldung/core/customizederrorhandling/config/CustomErrorDecoder.java index 3750e6288d..5466b61b3a 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/config/CustomErrorDecoder.java +++ b/feign/src/main/java/com/baeldung/core/customizederrorhandling/config/CustomErrorDecoder.java @@ -1,8 +1,9 @@ -package com.baeldung.cloud.openfeign.customizederrorhandling.config; +package com.baeldung.core.customizederrorhandling.config; + +import com.baeldung.core.customizederrorhandling.exception.ProductNotFoundException; +import com.baeldung.core.customizederrorhandling.exception.ProductServiceNotAvailableException; +import com.baeldung.core.exception.BadRequestException; -import com.baeldung.cloud.openfeign.exception.BadRequestException; -import com.baeldung.cloud.openfeign.customizederrorhandling.exception.ProductNotFoundException; -import com.baeldung.cloud.openfeign.customizederrorhandling.exception.ProductServiceNotAvailableException; import feign.Response; import feign.codec.ErrorDecoder; diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/config/FeignConfig.java b/feign/src/main/java/com/baeldung/core/customizederrorhandling/config/FeignConfig.java similarity index 81% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/config/FeignConfig.java rename to feign/src/main/java/com/baeldung/core/customizederrorhandling/config/FeignConfig.java index 5cddd521f1..980b8b5b38 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/config/FeignConfig.java +++ b/feign/src/main/java/com/baeldung/core/customizederrorhandling/config/FeignConfig.java @@ -1,8 +1,9 @@ -package com.baeldung.cloud.openfeign.customizederrorhandling.config; +package com.baeldung.core.customizederrorhandling.config; + +import org.springframework.context.annotation.Bean; import feign.Logger; import feign.codec.ErrorDecoder; -import org.springframework.context.annotation.Bean; public class FeignConfig { diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/controller/ProductController.java b/feign/src/main/java/com/baeldung/core/customizederrorhandling/controller/ProductController.java similarity index 52% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/controller/ProductController.java rename to feign/src/main/java/com/baeldung/core/customizederrorhandling/controller/ProductController.java index 9b7a5aea1d..6d6f784e66 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/controller/ProductController.java +++ b/feign/src/main/java/com/baeldung/core/customizederrorhandling/controller/ProductController.java @@ -1,12 +1,13 @@ -package com.baeldung.cloud.openfeign.customizederrorhandling.controller; +package com.baeldung.core.customizederrorhandling.controller; -import com.baeldung.cloud.openfeign.customizederrorhandling.client.ProductClient; - - -import com.baeldung.cloud.openfeign.defaulterrorhandling.model.Product; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.baeldung.core.customizederrorhandling.client.ProductClient; +import com.baeldung.core.defaulterrorhandling.model.Product; @RestController("product_controller2") @RequestMapping(value = "myapp2") diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/exception/ErrorResponse.java b/feign/src/main/java/com/baeldung/core/customizederrorhandling/exception/ErrorResponse.java similarity index 94% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/exception/ErrorResponse.java rename to feign/src/main/java/com/baeldung/core/customizederrorhandling/exception/ErrorResponse.java index c72e3db68b..6e739e5e40 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/exception/ErrorResponse.java +++ b/feign/src/main/java/com/baeldung/core/customizederrorhandling/exception/ErrorResponse.java @@ -1,10 +1,11 @@ -package com.baeldung.cloud.openfeign.customizederrorhandling.exception; +package com.baeldung.core.customizederrorhandling.exception; + +import java.util.Date; + +import org.springframework.http.HttpStatus; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; -import org.springframework.http.HttpStatus; - -import java.util.Date; public class ErrorResponse { diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/exception/ProductExceptionHandler.java b/feign/src/main/java/com/baeldung/core/customizederrorhandling/exception/ProductExceptionHandler.java similarity index 92% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/exception/ProductExceptionHandler.java rename to feign/src/main/java/com/baeldung/core/customizederrorhandling/exception/ProductExceptionHandler.java index 2ed709bc34..c83d917570 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/exception/ProductExceptionHandler.java +++ b/feign/src/main/java/com/baeldung/core/customizederrorhandling/exception/ProductExceptionHandler.java @@ -1,6 +1,5 @@ -package com.baeldung.cloud.openfeign.customizederrorhandling.exception; +package com.baeldung.core.customizederrorhandling.exception; -import com.baeldung.cloud.openfeign.exception.BadRequestException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/exception/ProductNotFoundException.java b/feign/src/main/java/com/baeldung/core/customizederrorhandling/exception/ProductNotFoundException.java similarity index 68% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/exception/ProductNotFoundException.java rename to feign/src/main/java/com/baeldung/core/customizederrorhandling/exception/ProductNotFoundException.java index 337cb89f7b..fa993ce700 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/exception/ProductNotFoundException.java +++ b/feign/src/main/java/com/baeldung/core/customizederrorhandling/exception/ProductNotFoundException.java @@ -1,4 +1,4 @@ -package com.baeldung.cloud.openfeign.customizederrorhandling.exception; +package com.baeldung.core.customizederrorhandling.exception; public class ProductNotFoundException extends RuntimeException { diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/exception/ProductServiceNotAvailableException.java b/feign/src/main/java/com/baeldung/core/customizederrorhandling/exception/ProductServiceNotAvailableException.java similarity index 70% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/exception/ProductServiceNotAvailableException.java rename to feign/src/main/java/com/baeldung/core/customizederrorhandling/exception/ProductServiceNotAvailableException.java index ce30f8c310..887d2cd91d 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/customizederrorhandling/exception/ProductServiceNotAvailableException.java +++ b/feign/src/main/java/com/baeldung/core/customizederrorhandling/exception/ProductServiceNotAvailableException.java @@ -1,4 +1,4 @@ -package com.baeldung.cloud.openfeign.customizederrorhandling.exception; +package com.baeldung.core.customizederrorhandling.exception; public class ProductServiceNotAvailableException extends RuntimeException { diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/defaulterrorhandling/client/ProductClient.java b/feign/src/main/java/com/baeldung/core/defaulterrorhandling/client/ProductClient.java similarity index 70% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/defaulterrorhandling/client/ProductClient.java rename to feign/src/main/java/com/baeldung/core/defaulterrorhandling/client/ProductClient.java index 2cef3d4238..4eb435331d 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/defaulterrorhandling/client/ProductClient.java +++ b/feign/src/main/java/com/baeldung/core/defaulterrorhandling/client/ProductClient.java @@ -1,13 +1,13 @@ -package com.baeldung.cloud.openfeign.defaulterrorhandling.client; - -import com.baeldung.cloud.openfeign.defaulterrorhandling.config.FeignConfig; -import com.baeldung.cloud.openfeign.defaulterrorhandling.model.Product; +package com.baeldung.core.defaulterrorhandling.client; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import com.baeldung.core.defaulterrorhandling.config.FeignConfig; +import com.baeldung.core.defaulterrorhandling.model.Product; + @FeignClient(name = "product-client", url = "http://localhost:8084/product/", configuration = FeignConfig.class) public interface ProductClient { diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/defaulterrorhandling/config/FeignConfig.java b/feign/src/main/java/com/baeldung/core/defaulterrorhandling/config/FeignConfig.java similarity index 74% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/defaulterrorhandling/config/FeignConfig.java rename to feign/src/main/java/com/baeldung/core/defaulterrorhandling/config/FeignConfig.java index f2329ebe0b..cef8cbb6d9 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/defaulterrorhandling/config/FeignConfig.java +++ b/feign/src/main/java/com/baeldung/core/defaulterrorhandling/config/FeignConfig.java @@ -1,7 +1,8 @@ -package com.baeldung.cloud.openfeign.defaulterrorhandling.config; +package com.baeldung.core.defaulterrorhandling.config; + +import org.springframework.context.annotation.Bean; import feign.Logger; -import org.springframework.context.annotation.Bean; public class FeignConfig { diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/defaulterrorhandling/controller/ProductController.java b/feign/src/main/java/com/baeldung/core/defaulterrorhandling/controller/ProductController.java similarity index 52% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/defaulterrorhandling/controller/ProductController.java rename to feign/src/main/java/com/baeldung/core/defaulterrorhandling/controller/ProductController.java index df352f8d52..80f571f29a 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/defaulterrorhandling/controller/ProductController.java +++ b/feign/src/main/java/com/baeldung/core/defaulterrorhandling/controller/ProductController.java @@ -1,10 +1,13 @@ -package com.baeldung.cloud.openfeign.defaulterrorhandling.controller; +package com.baeldung.core.defaulterrorhandling.controller; -import com.baeldung.cloud.openfeign.defaulterrorhandling.client.ProductClient; - -import com.baeldung.cloud.openfeign.defaulterrorhandling.model.Product; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.core.defaulterrorhandling.client.ProductClient; +import com.baeldung.core.defaulterrorhandling.model.Product; @RestController("product_controller1") @RequestMapping(value ="myapp1") diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/defaulterrorhandling/model/Product.java b/feign/src/main/java/com/baeldung/core/defaulterrorhandling/model/Product.java similarity index 82% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/defaulterrorhandling/model/Product.java rename to feign/src/main/java/com/baeldung/core/defaulterrorhandling/model/Product.java index 25a1662c99..35d860332e 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/defaulterrorhandling/model/Product.java +++ b/feign/src/main/java/com/baeldung/core/defaulterrorhandling/model/Product.java @@ -1,4 +1,4 @@ -package com.baeldung.cloud.openfeign.defaulterrorhandling.model; +package com.baeldung.core.defaulterrorhandling.model; public class Product { diff --git a/feign/src/main/java/com/baeldung/core/exception/BadRequestException.java b/feign/src/main/java/com/baeldung/core/exception/BadRequestException.java new file mode 100644 index 0000000000..4553bb5576 --- /dev/null +++ b/feign/src/main/java/com/baeldung/core/exception/BadRequestException.java @@ -0,0 +1,21 @@ +package com.baeldung.core.exception; + +public class BadRequestException extends Exception { + + public BadRequestException() { + } + + public BadRequestException(String message) { + super(message); + } + + public BadRequestException(Throwable cause) { + super(cause); + } + + @Override + public String toString() { + return "BadRequestException: "+getMessage(); + } + +} diff --git a/feign/src/main/java/com/baeldung/core/exception/NotFoundException.java b/feign/src/main/java/com/baeldung/core/exception/NotFoundException.java new file mode 100644 index 0000000000..07f4e0862f --- /dev/null +++ b/feign/src/main/java/com/baeldung/core/exception/NotFoundException.java @@ -0,0 +1,18 @@ +package com.baeldung.core.exception; + +public class NotFoundException extends Exception { + + public NotFoundException(String message) { + super(message); + } + + public NotFoundException(Throwable cause) { + super(cause); + } + + @Override + public String toString() { + return "NotFoundException: " + getMessage(); + } + +} diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/ExceptionMessage.java b/feign/src/main/java/com/baeldung/core/fileupload/config/ExceptionMessage.java similarity index 95% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/ExceptionMessage.java rename to feign/src/main/java/com/baeldung/core/fileupload/config/ExceptionMessage.java index 45a555b2ea..8301705ca6 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/ExceptionMessage.java +++ b/feign/src/main/java/com/baeldung/core/fileupload/config/ExceptionMessage.java @@ -1,4 +1,4 @@ -package com.baeldung.cloud.openfeign.fileupload.config; +package com.baeldung.core.fileupload.config; public class ExceptionMessage { private String timestamp; diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java b/feign/src/main/java/com/baeldung/core/fileupload/config/FeignSupportConfig.java similarity index 57% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java rename to feign/src/main/java/com/baeldung/core/fileupload/config/FeignSupportConfig.java index 802077a3d7..c8c9eb1acc 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java +++ b/feign/src/main/java/com/baeldung/core/fileupload/config/FeignSupportConfig.java @@ -1,6 +1,5 @@ -package com.baeldung.cloud.openfeign.fileupload.config; +package com.baeldung.core.fileupload.config; -import org.springframework.beans.factory.ObjectFactory; import org.springframework.boot.autoconfigure.http.HttpMessageConverters; import org.springframework.cloud.openfeign.support.SpringEncoder; import org.springframework.context.annotation.Bean; @@ -13,12 +12,7 @@ import feign.form.spring.SpringFormEncoder; public class FeignSupportConfig { @Bean public Encoder multipartFormEncoder() { - return new SpringFormEncoder(new SpringEncoder(new ObjectFactory() { - @Override - public HttpMessageConverters getObject() { - return new HttpMessageConverters(new RestTemplate().getMessageConverters()); - } - })); + return new SpringFormEncoder(new SpringEncoder(() -> new HttpMessageConverters(new RestTemplate().getMessageConverters()))); } @Bean diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/RetreiveMessageErrorDecoder.java b/feign/src/main/java/com/baeldung/core/fileupload/config/RetreiveMessageErrorDecoder.java similarity index 82% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/RetreiveMessageErrorDecoder.java rename to feign/src/main/java/com/baeldung/core/fileupload/config/RetreiveMessageErrorDecoder.java index 09bf8bf54b..fc2c8da0ed 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/RetreiveMessageErrorDecoder.java +++ b/feign/src/main/java/com/baeldung/core/fileupload/config/RetreiveMessageErrorDecoder.java @@ -1,10 +1,10 @@ -package com.baeldung.cloud.openfeign.fileupload.config; +package com.baeldung.core.fileupload.config; import java.io.IOException; import java.io.InputStream; -import com.baeldung.cloud.openfeign.exception.BadRequestException; -import com.baeldung.cloud.openfeign.exception.NotFoundException; +import com.baeldung.core.exception.BadRequestException; +import com.baeldung.core.exception.NotFoundException; import com.fasterxml.jackson.databind.ObjectMapper; import feign.Response; @@ -15,7 +15,7 @@ public class RetreiveMessageErrorDecoder implements ErrorDecoder { @Override public Exception decode(String methodKey, Response response) { - ExceptionMessage message = null; + ExceptionMessage message; try (InputStream bodyIs = response.body() .asInputStream()) { ObjectMapper mapper = new ObjectMapper(); diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/controller/FileController.java b/feign/src/main/java/com/baeldung/core/fileupload/controller/FileController.java similarity index 88% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/controller/FileController.java rename to feign/src/main/java/com/baeldung/core/fileupload/controller/FileController.java index 1ddbfcea81..7ba4746979 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/controller/FileController.java +++ b/feign/src/main/java/com/baeldung/core/fileupload/controller/FileController.java @@ -1,4 +1,4 @@ -package com.baeldung.cloud.openfeign.fileupload.controller; +package com.baeldung.core.fileupload.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; @@ -6,7 +6,7 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import com.baeldung.cloud.openfeign.fileupload.service.UploadService; +import com.baeldung.core.fileupload.service.UploadService; @RestController public class FileController { diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadClient.java b/feign/src/main/java/com/baeldung/core/fileupload/service/UploadClient.java similarity index 85% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadClient.java rename to feign/src/main/java/com/baeldung/core/fileupload/service/UploadClient.java index 8f3ef7e421..37b059d642 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadClient.java +++ b/feign/src/main/java/com/baeldung/core/fileupload/service/UploadClient.java @@ -1,4 +1,4 @@ -package com.baeldung.cloud.openfeign.fileupload.service; +package com.baeldung.core.fileupload.service; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; @@ -6,7 +6,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile; -import com.baeldung.cloud.openfeign.fileupload.config.FeignSupportConfig; +import com.baeldung.core.fileupload.config.FeignSupportConfig; @FeignClient(name = "file", url = "http://localhost:8081", configuration = FeignSupportConfig.class) public interface UploadClient { diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadResource.java b/feign/src/main/java/com/baeldung/core/fileupload/service/UploadResource.java similarity index 85% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadResource.java rename to feign/src/main/java/com/baeldung/core/fileupload/service/UploadResource.java index 26e658a7f0..9d3d173cd4 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadResource.java +++ b/feign/src/main/java/com/baeldung/core/fileupload/service/UploadResource.java @@ -1,4 +1,4 @@ -package com.baeldung.cloud.openfeign.fileupload.service; +package com.baeldung.core.fileupload.service; import org.springframework.web.multipart.MultipartFile; diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java b/feign/src/main/java/com/baeldung/core/fileupload/service/UploadService.java similarity index 94% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java rename to feign/src/main/java/com/baeldung/core/fileupload/service/UploadService.java index c0d1962a71..5176ddf0fa 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java +++ b/feign/src/main/java/com/baeldung/core/fileupload/service/UploadService.java @@ -1,4 +1,4 @@ -package com.baeldung.cloud.openfeign.fileupload.service; +package com.baeldung.core.fileupload.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/model/Employee.java b/feign/src/main/java/com/baeldung/core/model/Employee.java similarity index 81% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/model/Employee.java rename to feign/src/main/java/com/baeldung/core/model/Employee.java index 7b8ed1232b..7b0c9e1933 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/model/Employee.java +++ b/feign/src/main/java/com/baeldung/core/model/Employee.java @@ -1,4 +1,4 @@ -package com.baeldung.cloud.openfeign.model; +package com.baeldung.core.model; public class Employee { diff --git a/feign/src/main/resources/application.properties b/feign/src/main/resources/application.properties index a57c6e36a3..e48d5fd65a 100644 --- a/feign/src/main/resources/application.properties +++ b/feign/src/main/resources/application.properties @@ -5,3 +5,5 @@ ws.port.type.name=UsersPort ws.target.namespace=http://www.baeldung.com/springbootsoap/feignclient ws.location.uri=http://localhost:${server.port}/ws/users/ debug=false + +logging.level.com.baeldung.core=DEBUG \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/resources/fileupload.txt b/feign/src/main/resources/fileupload.txt similarity index 100% rename from spring-cloud-modules/spring-cloud-openfeign/src/main/resources/fileupload.txt rename to feign/src/main/resources/fileupload.txt diff --git a/feign/src/main/resources/logback.xml b/feign/src/main/resources/logback.xml deleted file mode 100644 index e5e962c8e0..0000000000 --- a/feign/src/main/resources/logback.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - - \ No newline at end of file diff --git a/feign/src/main/resources/logback_spring.xml b/feign/src/main/resources/logback_spring.xml new file mode 100644 index 0000000000..2a307a5b27 --- /dev/null +++ b/feign/src/main/resources/logback_spring.xml @@ -0,0 +1,45 @@ + + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + ${LOGS}/spring-boot-logger.log + + %d %p %C{1.} [%t] %m%n + + + + + ${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log + + + 10MB + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenFeignFileUploadLiveTest.java b/feign/src/test/java/com/baeldung/core/OpenFeignFileUploadLiveTest.java similarity index 93% rename from spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenFeignFileUploadLiveTest.java rename to feign/src/test/java/com/baeldung/core/OpenFeignFileUploadLiveTest.java index f558e07491..f9dc8b13ed 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenFeignFileUploadLiveTest.java +++ b/feign/src/test/java/com/baeldung/core/OpenFeignFileUploadLiveTest.java @@ -1,4 +1,4 @@ -package com.baeldung.cloud.openfeign; +package com.baeldung.core; import java.io.File; import java.io.FileInputStream; @@ -14,10 +14,10 @@ import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.multipart.MultipartFile; -import com.baeldung.cloud.openfeign.fileupload.service.UploadService; +import com.baeldung.core.fileupload.service.UploadService; @RunWith(SpringRunner.class) -@SpringBootTest +@SpringBootTest(classes = ExampleApplication.class) public class OpenFeignFileUploadLiveTest { @Autowired diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/customizederrorhandling/client/ProductClientUnitTest.java b/feign/src/test/java/com/baeldung/core/customizederrorhandling/client/ProductClientUnitTest.java similarity index 69% rename from spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/customizederrorhandling/client/ProductClientUnitTest.java rename to feign/src/test/java/com/baeldung/core/customizederrorhandling/client/ProductClientUnitTest.java index 7cf2a12692..ed5f18eb3f 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/customizederrorhandling/client/ProductClientUnitTest.java +++ b/feign/src/test/java/com/baeldung/core/customizederrorhandling/client/ProductClientUnitTest.java @@ -1,8 +1,12 @@ -package com.baeldung.cloud.openfeign.customizederrorhandling.client; +package com.baeldung.core.customizederrorhandling.client; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.configureFor; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static org.junit.Assert.assertThrows; -import com.baeldung.cloud.openfeign.customizederrorhandling.exception.ProductNotFoundException; -import com.baeldung.cloud.openfeign.customizederrorhandling.exception.ProductServiceNotAvailableException; -import com.github.tomakehurst.wiremock.WireMockServer; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -11,11 +15,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import static com.github.tomakehurst.wiremock.client.WireMock.*; -import static org.junit.Assert.assertThrows; +import com.baeldung.core.ExampleApplication; +import com.baeldung.core.customizederrorhandling.exception.ProductNotFoundException; +import com.baeldung.core.customizederrorhandling.exception.ProductServiceNotAvailableException; +import com.github.tomakehurst.wiremock.WireMockServer; @RunWith(SpringRunner.class) -@SpringBootTest +@SpringBootTest(classes = ExampleApplication.class) public class ProductClientUnitTest { @Autowired diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/customizederrorhandling/controller/ProductControllerUnitTest.java b/feign/src/test/java/com/baeldung/core/customizederrorhandling/controller/ProductControllerUnitTest.java similarity index 88% rename from spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/customizederrorhandling/controller/ProductControllerUnitTest.java rename to feign/src/test/java/com/baeldung/core/customizederrorhandling/controller/ProductControllerUnitTest.java index cc9d029e07..04fd68d3e4 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/customizederrorhandling/controller/ProductControllerUnitTest.java +++ b/feign/src/test/java/com/baeldung/core/customizederrorhandling/controller/ProductControllerUnitTest.java @@ -1,10 +1,13 @@ -package com.baeldung.cloud.openfeign.customizederrorhandling.controller; +package com.baeldung.core.customizederrorhandling.controller; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.configureFor; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static org.junit.Assert.assertEquals; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import com.baeldung.cloud.openfeign.customizederrorhandling.client.ProductClient; -import com.baeldung.cloud.openfeign.customizederrorhandling.exception.ErrorResponse; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.tomakehurst.wiremock.WireMockServer; -import com.github.tomakehurst.wiremock.client.WireMock; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -18,10 +21,11 @@ import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; -import static com.github.tomakehurst.wiremock.client.WireMock.*; -import static org.junit.Assert.assertEquals; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import com.baeldung.core.customizederrorhandling.client.ProductClient; +import com.baeldung.core.customizederrorhandling.exception.ErrorResponse; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.client.WireMock; @RunWith(SpringRunner.class) diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/defaulterrorhandling/client/ProductClientUnitTest.java b/feign/src/test/java/com/baeldung/core/defaulterrorhandling/client/ProductClientUnitTest.java similarity index 81% rename from spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/defaulterrorhandling/client/ProductClientUnitTest.java rename to feign/src/test/java/com/baeldung/core/defaulterrorhandling/client/ProductClientUnitTest.java index 4dda2bbe15..8a9fa94074 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/defaulterrorhandling/client/ProductClientUnitTest.java +++ b/feign/src/test/java/com/baeldung/core/defaulterrorhandling/client/ProductClientUnitTest.java @@ -1,8 +1,13 @@ -package com.baeldung.cloud.openfeign.defaulterrorhandling.client; +package com.baeldung.core.defaulterrorhandling.client; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.configureFor; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; -import com.baeldung.cloud.openfeign.defaulterrorhandling.model.Product; -import com.github.tomakehurst.wiremock.WireMockServer; -import feign.FeignException; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -12,12 +17,14 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.HttpStatus; import org.springframework.test.context.junit4.SpringRunner; -import static com.github.tomakehurst.wiremock.client.WireMock.*; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThrows; +import com.baeldung.core.ExampleApplication; +import com.baeldung.core.defaulterrorhandling.model.Product; +import com.github.tomakehurst.wiremock.WireMockServer; + +import feign.FeignException; @RunWith(SpringRunner.class) -@SpringBootTest +@SpringBootTest(classes = ExampleApplication.class) public class ProductClientUnitTest { @Autowired diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/defaulterrorhandling/controller/ProductControllerUnitTest.java b/feign/src/test/java/com/baeldung/core/defaulterrorhandling/controller/ProductControllerUnitTest.java similarity index 85% rename from spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/defaulterrorhandling/controller/ProductControllerUnitTest.java rename to feign/src/test/java/com/baeldung/core/defaulterrorhandling/controller/ProductControllerUnitTest.java index f6ec7c3310..798ee9035c 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/defaulterrorhandling/controller/ProductControllerUnitTest.java +++ b/feign/src/test/java/com/baeldung/core/defaulterrorhandling/controller/ProductControllerUnitTest.java @@ -1,8 +1,13 @@ -package com.baeldung.cloud.openfeign.defaulterrorhandling.controller; +package com.baeldung.core.defaulterrorhandling.controller; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.configureFor; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import com.baeldung.cloud.openfeign.defaulterrorhandling.client.ProductClient; -import com.github.tomakehurst.wiremock.WireMockServer; -import com.github.tomakehurst.wiremock.client.WireMock; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -16,10 +21,9 @@ import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import static com.github.tomakehurst.wiremock.client.WireMock.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; +import com.baeldung.core.defaulterrorhandling.client.ProductClient; +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.client.WireMock; @RunWith(SpringRunner.class) @WebMvcTest(ProductController.class) diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/defaulterrorhandling/controller/TestControllerAdvice.java b/feign/src/test/java/com/baeldung/core/defaulterrorhandling/controller/TestControllerAdvice.java similarity index 88% rename from spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/defaulterrorhandling/controller/TestControllerAdvice.java rename to feign/src/test/java/com/baeldung/core/defaulterrorhandling/controller/TestControllerAdvice.java index 0c7ed86b7c..dfd82ed07d 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/defaulterrorhandling/controller/TestControllerAdvice.java +++ b/feign/src/test/java/com/baeldung/core/defaulterrorhandling/controller/TestControllerAdvice.java @@ -1,11 +1,12 @@ -package com.baeldung.cloud.openfeign.defaulterrorhandling.controller; +package com.baeldung.core.defaulterrorhandling.controller; -import feign.FeignException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import feign.FeignException; + @RestControllerAdvice public class TestControllerAdvice { diff --git a/spring-cloud-modules/spring-cloud-openfeign/README.md b/spring-cloud-modules/spring-cloud-openfeign/README.md index 421fa0284f..c291e60aa6 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/README.md +++ b/spring-cloud-modules/spring-cloud-openfeign/README.md @@ -2,9 +2,5 @@ - [Introduction to Spring Cloud OpenFeign](https://www.baeldung.com/spring-cloud-openfeign) - [Differences Between Netflix Feign and OpenFeign](https://www.baeldung.com/netflix-feign-vs-openfeign) -- [File Upload With Open Feign](https://www.baeldung.com/java-feign-file-upload) -- [Feign Logging Configuration](https://www.baeldung.com/java-feign-logging) - [Provide an OAuth2 Token to a Feign Client](https://www.baeldung.com/spring-cloud-feign-oauth-token) -- [Retrieve Original Message From Feign ErrorDecoder](https://www.baeldung.com/feign-retrieve-original-message) -- [RequestLine with Feign Client](https://www.baeldung.com/feign-requestline) - [Propagating Exceptions With OpenFeign and Spring](https://www.baeldung.com/spring-openfeign-propagate-exception) diff --git a/spring-cloud-modules/spring-cloud-openfeign/pom.xml b/spring-cloud-modules/spring-cloud-openfeign/pom.xml index 570cb6a082..88ad38517b 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/pom.xml +++ b/spring-cloud-modules/spring-cloud-openfeign/pom.xml @@ -61,12 +61,6 @@ spring-boot-starter-test test - - com.github.tomakehurst - wiremock-jre8 - 2.33.2 - test - diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/UserClient.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/UserClient.java deleted file mode 100644 index 9416bd30f0..0000000000 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/client/UserClient.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.cloud.openfeign.client; - -import com.baeldung.cloud.openfeign.config.FeignConfig; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; - -@FeignClient(name = "user-client", url="https://jsonplaceholder.typicode.com", configuration = FeignConfig.class) -public interface UserClient { - - @RequestMapping(value = "/users", method = RequestMethod.GET) - String getUsers(); -} \ No newline at end of file From 4d03829a984e96c13c6a0f8e055ec1dbf06c6897 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Mon, 20 Feb 2023 22:33:43 +0530 Subject: [PATCH 496/592] JAVA-18103 Update Code as per review comments --- .../disablingkeycloak/KeycloakSecurityConfig.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java b/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java index f5837ba2a5..f024c461a7 100644 --- a/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java +++ b/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java @@ -3,8 +3,6 @@ package com.baeldung.disablingkeycloak; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 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.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer; @@ -33,10 +31,4 @@ public class KeycloakSecurityConfig { http.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt); return http.build(); } - - @Bean - public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception { - return http.getSharedObject(AuthenticationManagerBuilder.class) - .build(); - } } From 92ce5ae35d4a37cfb66ef8c960557181aaf02134 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Mon, 20 Feb 2023 23:13:48 +0530 Subject: [PATCH 497/592] JAVA-18103 Rename method name --- .../com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java b/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java index f024c461a7..b41b64077c 100644 --- a/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java +++ b/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/KeycloakSecurityConfig.java @@ -22,7 +22,7 @@ public class KeycloakSecurityConfig { } @Bean - public SecurityFilterChain filterChain1(HttpSecurity http) throws Exception { + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.csrf() .disable() .authorizeHttpRequests(auth -> auth.anyRequest() From a04d35a6d81c211a9db20c431b723df4a4cd4ff3 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Mon, 20 Feb 2023 20:06:57 +0200 Subject: [PATCH 498/592] JAVA-2420 Merge spring-apache-camel and spring-boot-camel modules (#13409) * JAVA-2420 Merge spring-apache-camel and spring-boot-camel modules * JAVA-2420 Migrate spring-boot-camel to spring-apache camel * JAVA-2420 Update README.md file * JAVA-2420 Remove spring-boot-camel --------- Co-authored-by: timis1 --- messaging-modules/pom.xml | 1 - .../spring-apache-camel/.gitignore | 3 +- .../spring-apache-camel/README.md | 10 ++- messaging-modules/spring-apache-camel/pom.xml | 60 +++++++++++++- .../file/ContentBasedFileRouter.java | 2 +- .../file/DeadLetterChannelFileRouter.java | 2 +- .../{ => apache}/file/FileProcessor.java | 2 +- .../camel/{ => apache}/file/FileRouter.java | 2 +- .../file/MessageTranslatorFileRouter.java | 2 +- .../file/MulticastFileRouter.java | 2 +- .../{ => apache}/file/SplitterFileRouter.java | 2 +- .../cfg/ContentBasedFileRouterConfig.java | 4 +- .../camel/{ => apache}/jackson/Fruit.java | 2 +- .../camel/{ => apache}/jackson/FruitList.java | 2 +- .../baeldung/camel/{ => apache}/main/App.java | 2 +- .../{ => apache}/processor/FileProcessor.java | 2 +- .../com/baeldung/camel/boot}/Application.java | 4 +- .../baeldung/camel/boot}/ExampleServices.java | 2 +- .../java/com/baeldung/camel/boot}/MyBean.java | 2 +- .../boot/testing/GreetingsFileRouter.java | 2 +- .../GreetingsFileSpringApplication.java | 2 +- .../conditional/ConditionalBeanRouter.java | 2 +- .../conditional/ConditionalBodyRouter.java | 2 +- .../conditional/ConditionalHeaderRouter.java | 2 +- .../ConditionalRoutingSpringApplication.java | 2 +- .../camel/boot}/conditional/FruitBean.java | 2 +- .../ExceptionHandlingSpringApplication.java | 2 +- .../ExceptionHandlingWithDoTryRoute.java | 2 +- ...ptionHandlingWithExceptionClauseRoute.java | 2 +- .../exception/ExceptionLoggingProcessor.java | 2 +- .../exception/ExceptionThrowingRoute.java | 2 +- ...galArgumentExceptionThrowingProcessor.java | 2 +- .../src/main/resources/application.properties | 0 .../src/main/resources/application.yml | 0 ...mel-context-ContentBasedFileRouterTest.xml | 2 +- ...el-context-DeadLetterChannelFileRouter.xml | 2 +- ...ontext-MessageTranslatorFileRouterTest.xml | 2 +- .../camel-context-MulticastFileRouterTest.xml | 2 +- .../camel-context-SplitterFileRouter.xml | 2 +- .../src/main/resources/camel-context-test.xml | 4 +- .../src/main/resources/camel-context.xml | 2 +- .../baeldung/SpringContextTest.java | 4 +- .../FruitArrayJacksonUnmarshalUnitTest.java | 4 +- .../FruitListJacksonUnmarshalUnitTest.java | 5 +- ...ContentBasedFileRouterIntegrationTest.java | 2 +- .../FileProcessorIntegrationTest.java | 2 +- .../apache/camel/main/AppIntegrationTest.java | 2 +- .../java/com/boot}/SpringContextTest.java | 4 +- .../testing/GreetingsFileRouterUnitTest.java | 11 ++- .../ConditionalBeanRouterUnitTest.java | 11 ++- .../ConditionalBodyRouterUnitTest.java | 11 ++- .../ConditionalHeaderRouterUnitTest.java | 11 ++- ...ceptionHandlingWithDoTryRouteUnitTest.java | 11 ++- ...dlingWithExceptionClauseRouteUnitTest.java | 11 ++- .../ExceptionThrowingRouteUnitTest.java | 10 ++- ...entExceptionThrowingProcessorUnitTest.java | 4 +- pom.xml | 4 +- .../spring-boot-camel/.gitignore | 1 - .../spring-boot-camel/README.md | 30 ------- spring-boot-modules/spring-boot-camel/pom.xml | 80 ------------------- .../src/main/resources/logback.xml | 17 ---- 61 files changed, 185 insertions(+), 200 deletions(-) rename messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/{ => apache}/file/ContentBasedFileRouter.java (94%) rename messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/{ => apache}/file/DeadLetterChannelFileRouter.java (94%) rename messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/{ => apache}/file/FileProcessor.java (93%) rename messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/{ => apache}/file/FileRouter.java (91%) rename messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/{ => apache}/file/MessageTranslatorFileRouter.java (92%) rename messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/{ => apache}/file/MulticastFileRouter.java (95%) rename messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/{ => apache}/file/SplitterFileRouter.java (93%) rename messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/{ => apache}/file/cfg/ContentBasedFileRouterConfig.java (84%) rename messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/{ => apache}/jackson/Fruit.java (87%) rename messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/{ => apache}/jackson/FruitList.java (84%) rename messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/{ => apache}/main/App.java (91%) rename messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/{ => apache}/processor/FileProcessor.java (89%) rename {spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel => messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot}/Application.java (97%) rename {spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel => messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot}/ExampleServices.java (90%) rename {spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel => messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot}/MyBean.java (90%) rename {spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel => messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot}/boot/testing/GreetingsFileRouter.java (89%) rename {spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel => messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot}/boot/testing/GreetingsFileSpringApplication.java (87%) rename {spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel => messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot}/conditional/ConditionalBeanRouter.java (93%) rename {spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel => messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot}/conditional/ConditionalBodyRouter.java (93%) rename {spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel => messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot}/conditional/ConditionalHeaderRouter.java (93%) rename {spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel => messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot}/conditional/ConditionalRoutingSpringApplication.java (88%) rename {spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel => messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot}/conditional/FruitBean.java (84%) rename {spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel => messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot}/exception/ExceptionHandlingSpringApplication.java (88%) rename {spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel => messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot}/exception/ExceptionHandlingWithDoTryRoute.java (94%) rename {spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel => messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot}/exception/ExceptionHandlingWithExceptionClauseRoute.java (94%) rename {spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel => messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot}/exception/ExceptionLoggingProcessor.java (94%) rename {spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel => messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot}/exception/ExceptionThrowingRoute.java (95%) rename {spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel => messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot}/exception/IllegalArgumentExceptionThrowingProcessor.java (93%) rename {spring-boot-modules/spring-boot-camel => messaging-modules/spring-apache-camel}/src/main/resources/application.properties (100%) rename {spring-boot-modules/spring-boot-camel => messaging-modules/spring-apache-camel}/src/main/resources/application.yml (100%) rename messaging-modules/spring-apache-camel/src/test/java/com/{ => apache}/baeldung/SpringContextTest.java (67%) rename messaging-modules/spring-apache-camel/src/test/java/com/{ => apache}/baeldung/camel/jackson/FruitArrayJacksonUnmarshalUnitTest.java (95%) rename messaging-modules/spring-apache-camel/src/test/java/com/{ => apache}/baeldung/camel/jackson/FruitListJacksonUnmarshalUnitTest.java (93%) rename {spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung => messaging-modules/spring-apache-camel/src/test/java/com/boot}/SpringContextTest.java (85%) rename {spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung => messaging-modules/spring-apache-camel/src/test/java/com/boot}/camel/boot/testing/GreetingsFileRouterUnitTest.java (71%) rename {spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung => messaging-modules/spring-apache-camel/src/test/java/com/boot}/camel/conditional/ConditionalBeanRouterUnitTest.java (70%) rename {spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung => messaging-modules/spring-apache-camel/src/test/java/com/boot}/camel/conditional/ConditionalBodyRouterUnitTest.java (70%) rename {spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung => messaging-modules/spring-apache-camel/src/test/java/com/boot}/camel/conditional/ConditionalHeaderRouterUnitTest.java (70%) rename {spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung => messaging-modules/spring-apache-camel/src/test/java/com/boot}/camel/exception/ExceptionHandlingWithDoTryRouteUnitTest.java (70%) rename {spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung => messaging-modules/spring-apache-camel/src/test/java/com/boot}/camel/exception/ExceptionHandlingWithExceptionClauseRouteUnitTest.java (70%) rename {spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung => messaging-modules/spring-apache-camel/src/test/java/com/boot}/camel/exception/ExceptionThrowingRouteUnitTest.java (78%) rename {spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung => messaging-modules/spring-apache-camel/src/test/java/com/boot}/camel/exception/IllegalArgumentExceptionThrowingProcessorUnitTest.java (76%) delete mode 100644 spring-boot-modules/spring-boot-camel/.gitignore delete mode 100644 spring-boot-modules/spring-boot-camel/README.md delete mode 100644 spring-boot-modules/spring-boot-camel/pom.xml delete mode 100644 spring-boot-modules/spring-boot-camel/src/main/resources/logback.xml diff --git a/messaging-modules/pom.xml b/messaging-modules/pom.xml index f843b0fe11..8bda46f5cd 100644 --- a/messaging-modules/pom.xml +++ b/messaging-modules/pom.xml @@ -18,7 +18,6 @@ jgroups rabbitmq spring-amqp - spring-apache-camel spring-jms diff --git a/messaging-modules/spring-apache-camel/.gitignore b/messaging-modules/spring-apache-camel/.gitignore index eac473ac50..f137d908d6 100644 --- a/messaging-modules/spring-apache-camel/.gitignore +++ b/messaging-modules/spring-apache-camel/.gitignore @@ -1 +1,2 @@ -/src/test/destination-folder/* \ No newline at end of file +/src/test/destination-folder/* +/output/ \ No newline at end of file diff --git a/messaging-modules/spring-apache-camel/README.md b/messaging-modules/spring-apache-camel/README.md index 6a16e1da05..535c61cbef 100644 --- a/messaging-modules/spring-apache-camel/README.md +++ b/messaging-modules/spring-apache-camel/README.md @@ -4,17 +4,19 @@ This module contains articles about Spring with Apache Camel ### Relevant Articles -- [Apache Camel](http://camel.apache.org/) -- [Enterprise Integration Patterns](http://www.enterpriseintegrationpatterns.com/patterns/messaging/toc.html) - [Introduction To Apache Camel](http://www.baeldung.com/apache-camel-intro) - [Integration Patterns With Apache Camel](http://www.baeldung.com/camel-integration-patterns) - [Using Apache Camel with Spring](http://www.baeldung.com/spring-apache-camel-tutorial) - [Unmarshalling a JSON Array Using camel-jackson](https://www.baeldung.com/java-camel-jackson-json-array) +- [Apache Camel with Spring Boot](https://www.baeldung.com/apache-camel-spring-boot) +- [Apache Camel Routes Testing in Spring Boot](https://www.baeldung.com/spring-boot-apache-camel-routes-testing) +- [Apache Camel Conditional Routing](https://www.baeldung.com/spring-apache-camel-conditional-routing) +- [Apache Camel Exception Handling](https://www.baeldung.com/java-apache-camel-exception-handling) ### Framework Versions: -- Spring 4.2.4 -- Apache Camel 2.16.1 +- Spring 5.3.25 +- Apache Camel 3.14.7 ### Build and Run Application diff --git a/messaging-modules/spring-apache-camel/pom.xml b/messaging-modules/spring-apache-camel/pom.xml index 9f2e74dc36..ec7557666c 100644 --- a/messaging-modules/spring-apache-camel/pom.xml +++ b/messaging-modules/spring-apache-camel/pom.xml @@ -58,11 +58,67 @@ ${env.camel.version} test + + org.apache.camel.springboot + camel-servlet-starter + ${camel.version} + + + org.apache.camel.springboot + camel-jackson-starter + ${camel.version} + + + org.apache.camel.springboot + camel-swagger-java-starter + ${camel.version} + + + org.apache.camel.springboot + camel-spring-boot-starter + ${camel.version} + + + org.springframework.boot + spring-boot-starter-web + + + org.apache.camel + camel-test-spring-junit5 + ${camel.version} + test + - 2.18.1 - 4.3.4.RELEASE + 3.14.7 + 5.3.25 + 3.15.0 + + + spring-boot + + spring-boot:run + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + com.baeldung.camel.boot.boot.testing.GreetingsFileSpringApplication + + + + + + + + + \ No newline at end of file diff --git a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/ContentBasedFileRouter.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/ContentBasedFileRouter.java similarity index 94% rename from messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/ContentBasedFileRouter.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/ContentBasedFileRouter.java index 9106e996c3..2a3f7e5c7b 100644 --- a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/ContentBasedFileRouter.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/ContentBasedFileRouter.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.file; +package com.baeldung.camel.apache.file; import org.apache.camel.builder.RouteBuilder; diff --git a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/DeadLetterChannelFileRouter.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/DeadLetterChannelFileRouter.java similarity index 94% rename from messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/DeadLetterChannelFileRouter.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/DeadLetterChannelFileRouter.java index fdcad99f02..37a81af458 100644 --- a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/DeadLetterChannelFileRouter.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/DeadLetterChannelFileRouter.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.file; +package com.baeldung.camel.apache.file; import org.apache.camel.LoggingLevel; import org.apache.camel.builder.RouteBuilder; diff --git a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileProcessor.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/FileProcessor.java similarity index 93% rename from messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileProcessor.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/FileProcessor.java index 1ea2cad188..ce4d92e8ab 100644 --- a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileProcessor.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/FileProcessor.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.file; +package com.baeldung.camel.apache.file; import java.text.SimpleDateFormat; import java.util.Date; diff --git a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileRouter.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/FileRouter.java similarity index 91% rename from messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileRouter.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/FileRouter.java index 5216c9a595..760f37677b 100644 --- a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/FileRouter.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/FileRouter.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.file; +package com.baeldung.camel.apache.file; import org.apache.camel.builder.RouteBuilder; diff --git a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/MessageTranslatorFileRouter.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/MessageTranslatorFileRouter.java similarity index 92% rename from messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/MessageTranslatorFileRouter.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/MessageTranslatorFileRouter.java index b99de99dac..5e65c24c40 100644 --- a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/MessageTranslatorFileRouter.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/MessageTranslatorFileRouter.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.file; +package com.baeldung.camel.apache.file; import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; diff --git a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/MulticastFileRouter.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/MulticastFileRouter.java similarity index 95% rename from messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/MulticastFileRouter.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/MulticastFileRouter.java index 75a6e81d45..6f6aad177d 100644 --- a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/MulticastFileRouter.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/MulticastFileRouter.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.file; +package com.baeldung.camel.apache.file; import org.apache.camel.builder.RouteBuilder; diff --git a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/SplitterFileRouter.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/SplitterFileRouter.java similarity index 93% rename from messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/SplitterFileRouter.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/SplitterFileRouter.java index 551f9c9685..471dfa7a46 100644 --- a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/SplitterFileRouter.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/SplitterFileRouter.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.file; +package com.baeldung.camel.apache.file; import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; diff --git a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/cfg/ContentBasedFileRouterConfig.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/cfg/ContentBasedFileRouterConfig.java similarity index 84% rename from messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/cfg/ContentBasedFileRouterConfig.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/cfg/ContentBasedFileRouterConfig.java index ceb68dfa3b..2b24cf2a51 100644 --- a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/file/cfg/ContentBasedFileRouterConfig.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/file/cfg/ContentBasedFileRouterConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.file.cfg; +package com.baeldung.camel.apache.file.cfg; import java.util.Arrays; import java.util.List; @@ -8,7 +8,7 @@ import org.apache.camel.spring.javaconfig.CamelConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.baeldung.camel.file.ContentBasedFileRouter; +import com.baeldung.camel.apache.file.ContentBasedFileRouter; @Configuration public class ContentBasedFileRouterConfig extends CamelConfiguration { diff --git a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/jackson/Fruit.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/jackson/Fruit.java similarity index 87% rename from messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/jackson/Fruit.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/jackson/Fruit.java index 1932131ddd..d46eb0afd5 100644 --- a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/jackson/Fruit.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/jackson/Fruit.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.jackson; +package com.baeldung.camel.apache.jackson; public class Fruit { diff --git a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/jackson/FruitList.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/jackson/FruitList.java similarity index 84% rename from messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/jackson/FruitList.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/jackson/FruitList.java index 02f2b6feb0..f8678c6a1e 100644 --- a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/jackson/FruitList.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/jackson/FruitList.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.jackson; +package com.baeldung.camel.apache.jackson; import java.util.List; diff --git a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/main/App.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/main/App.java similarity index 91% rename from messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/main/App.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/main/App.java index ac0605a215..6071db0580 100644 --- a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/main/App.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/main/App.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.main; +package com.baeldung.camel.apache.main; import org.springframework.context.support.ClassPathXmlApplicationContext; diff --git a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/processor/FileProcessor.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/processor/FileProcessor.java similarity index 89% rename from messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/processor/FileProcessor.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/processor/FileProcessor.java index 971dd206cd..5ca61a382a 100644 --- a/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/processor/FileProcessor.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/apache/processor/FileProcessor.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.processor; +package com.baeldung.camel.apache.processor; import org.apache.camel.Exchange; import org.apache.camel.Processor; diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/Application.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/Application.java similarity index 97% rename from spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/Application.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/Application.java index 48294e9c56..797ad57202 100644 --- a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/Application.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/Application.java @@ -1,4 +1,4 @@ -package com.baeldung.camel; +package com.baeldung.camel.boot; import javax.ws.rs.core.MediaType; @@ -22,7 +22,7 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.stereotype.Component; @SpringBootApplication(exclude = { WebSocketServletAutoConfiguration.class, AopAutoConfiguration.class, OAuth2ResourceServerAutoConfiguration.class, EmbeddedWebServerFactoryCustomizerAutoConfiguration.class }) -@ComponentScan(basePackages = "com.baeldung.camel") +@ComponentScan(basePackages = "com.baeldung.camel.boot") public class Application { @Value("${server.port}") diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/ExampleServices.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/ExampleServices.java similarity index 90% rename from spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/ExampleServices.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/ExampleServices.java index ec8f368e68..6fe5a1ed32 100644 --- a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/ExampleServices.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/ExampleServices.java @@ -1,4 +1,4 @@ -package com.baeldung.camel; +package com.baeldung.camel.boot; /** * a Mock class to show how some other layer diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/MyBean.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/MyBean.java similarity index 90% rename from spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/MyBean.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/MyBean.java index 5368e40c93..759fb06459 100644 --- a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/MyBean.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/MyBean.java @@ -1,4 +1,4 @@ -package com.baeldung.camel; +package com.baeldung.camel.boot; public class MyBean { private Integer id; diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/boot/testing/GreetingsFileRouter.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/boot/testing/GreetingsFileRouter.java similarity index 89% rename from spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/boot/testing/GreetingsFileRouter.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/boot/testing/GreetingsFileRouter.java index 670af5e08c..381a0a61a5 100644 --- a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/boot/testing/GreetingsFileRouter.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/boot/testing/GreetingsFileRouter.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.boot.testing; +package com.baeldung.camel.boot.boot.testing; import org.apache.camel.builder.RouteBuilder; import org.springframework.stereotype.Component; diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/boot/testing/GreetingsFileSpringApplication.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/boot/testing/GreetingsFileSpringApplication.java similarity index 87% rename from spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/boot/testing/GreetingsFileSpringApplication.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/boot/testing/GreetingsFileSpringApplication.java index a4e862e65d..1d20d1977a 100644 --- a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/boot/testing/GreetingsFileSpringApplication.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/boot/testing/GreetingsFileSpringApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.boot.testing; +package com.baeldung.camel.boot.boot.testing; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalBeanRouter.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/conditional/ConditionalBeanRouter.java similarity index 93% rename from spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalBeanRouter.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/conditional/ConditionalBeanRouter.java index 8a03f6ef18..a747ba1f66 100644 --- a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalBeanRouter.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/conditional/ConditionalBeanRouter.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.conditional; +package com.baeldung.camel.boot.conditional; import org.apache.camel.builder.RouteBuilder; import org.springframework.stereotype.Component; diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalBodyRouter.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/conditional/ConditionalBodyRouter.java similarity index 93% rename from spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalBodyRouter.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/conditional/ConditionalBodyRouter.java index 99d23c747b..ea4f77cb9a 100644 --- a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalBodyRouter.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/conditional/ConditionalBodyRouter.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.conditional; +package com.baeldung.camel.boot.conditional; import org.apache.camel.builder.RouteBuilder; import org.springframework.stereotype.Component; diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalHeaderRouter.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/conditional/ConditionalHeaderRouter.java similarity index 93% rename from spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalHeaderRouter.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/conditional/ConditionalHeaderRouter.java index e723f97ef1..93371b06b6 100644 --- a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalHeaderRouter.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/conditional/ConditionalHeaderRouter.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.conditional; +package com.baeldung.camel.boot.conditional; import org.apache.camel.builder.RouteBuilder; import org.springframework.stereotype.Component; diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalRoutingSpringApplication.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/conditional/ConditionalRoutingSpringApplication.java similarity index 88% rename from spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalRoutingSpringApplication.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/conditional/ConditionalRoutingSpringApplication.java index f20d23068a..f11b4302c7 100644 --- a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/ConditionalRoutingSpringApplication.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/conditional/ConditionalRoutingSpringApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.conditional; +package com.baeldung.camel.boot.conditional; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/FruitBean.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/conditional/FruitBean.java similarity index 84% rename from spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/FruitBean.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/conditional/FruitBean.java index 080e3393b6..a3481361bd 100644 --- a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/conditional/FruitBean.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/conditional/FruitBean.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.conditional; +package com.baeldung.camel.boot.conditional; import org.apache.camel.Exchange; diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingSpringApplication.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/ExceptionHandlingSpringApplication.java similarity index 88% rename from spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingSpringApplication.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/ExceptionHandlingSpringApplication.java index df4550d9d5..bfa08a5c7a 100644 --- a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingSpringApplication.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/ExceptionHandlingSpringApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.exception; +package com.baeldung.camel.boot.exception; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingWithDoTryRoute.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/ExceptionHandlingWithDoTryRoute.java similarity index 94% rename from spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingWithDoTryRoute.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/ExceptionHandlingWithDoTryRoute.java index ce3cfc129b..d4c365d25c 100644 --- a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingWithDoTryRoute.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/ExceptionHandlingWithDoTryRoute.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.exception; +package com.baeldung.camel.boot.exception; import java.io.IOException; diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingWithExceptionClauseRoute.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/ExceptionHandlingWithExceptionClauseRoute.java similarity index 94% rename from spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingWithExceptionClauseRoute.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/ExceptionHandlingWithExceptionClauseRoute.java index 3a438e2402..e2ee3252de 100644 --- a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingWithExceptionClauseRoute.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/ExceptionHandlingWithExceptionClauseRoute.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.exception; +package com.baeldung.camel.boot.exception; import org.apache.camel.builder.RouteBuilder; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionLoggingProcessor.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/ExceptionLoggingProcessor.java similarity index 94% rename from spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionLoggingProcessor.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/ExceptionLoggingProcessor.java index 84e4072888..66add64441 100644 --- a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionLoggingProcessor.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/ExceptionLoggingProcessor.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.exception; +package com.baeldung.camel.boot.exception; import java.util.Map; diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionThrowingRoute.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/ExceptionThrowingRoute.java similarity index 95% rename from spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionThrowingRoute.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/ExceptionThrowingRoute.java index 752aabaf1a..bf4d464c23 100644 --- a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionThrowingRoute.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/ExceptionThrowingRoute.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.exception; +package com.baeldung.camel.boot.exception; import org.apache.camel.Exchange; import org.apache.camel.Processor; diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/IllegalArgumentExceptionThrowingProcessor.java b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/IllegalArgumentExceptionThrowingProcessor.java similarity index 93% rename from spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/IllegalArgumentExceptionThrowingProcessor.java rename to messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/IllegalArgumentExceptionThrowingProcessor.java index 461a4e6553..db229418d2 100644 --- a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/IllegalArgumentExceptionThrowingProcessor.java +++ b/messaging-modules/spring-apache-camel/src/main/java/com/baeldung/camel/boot/exception/IllegalArgumentExceptionThrowingProcessor.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.exception; +package com.baeldung.camel.boot.exception; import org.apache.camel.Exchange; import org.apache.camel.Processor; diff --git a/spring-boot-modules/spring-boot-camel/src/main/resources/application.properties b/messaging-modules/spring-apache-camel/src/main/resources/application.properties similarity index 100% rename from spring-boot-modules/spring-boot-camel/src/main/resources/application.properties rename to messaging-modules/spring-apache-camel/src/main/resources/application.properties diff --git a/spring-boot-modules/spring-boot-camel/src/main/resources/application.yml b/messaging-modules/spring-apache-camel/src/main/resources/application.yml similarity index 100% rename from spring-boot-modules/spring-boot-camel/src/main/resources/application.yml rename to messaging-modules/spring-apache-camel/src/main/resources/application.yml diff --git a/messaging-modules/spring-apache-camel/src/main/resources/camel-context-ContentBasedFileRouterTest.xml b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-ContentBasedFileRouterTest.xml index d6d3e62f1c..e93b9fb144 100644 --- a/messaging-modules/spring-apache-camel/src/main/resources/camel-context-ContentBasedFileRouterTest.xml +++ b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-ContentBasedFileRouterTest.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - + diff --git a/messaging-modules/spring-apache-camel/src/main/resources/camel-context-DeadLetterChannelFileRouter.xml b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-DeadLetterChannelFileRouter.xml index ef61174b32..b9db0a189f 100644 --- a/messaging-modules/spring-apache-camel/src/main/resources/camel-context-DeadLetterChannelFileRouter.xml +++ b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-DeadLetterChannelFileRouter.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - + diff --git a/messaging-modules/spring-apache-camel/src/main/resources/camel-context-MessageTranslatorFileRouterTest.xml b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-MessageTranslatorFileRouterTest.xml index 7ab988ca8a..fcb9e2b8be 100644 --- a/messaging-modules/spring-apache-camel/src/main/resources/camel-context-MessageTranslatorFileRouterTest.xml +++ b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-MessageTranslatorFileRouterTest.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - + diff --git a/messaging-modules/spring-apache-camel/src/main/resources/camel-context-MulticastFileRouterTest.xml b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-MulticastFileRouterTest.xml index 6f7e7cbb60..73adecbc98 100644 --- a/messaging-modules/spring-apache-camel/src/main/resources/camel-context-MulticastFileRouterTest.xml +++ b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-MulticastFileRouterTest.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - + diff --git a/messaging-modules/spring-apache-camel/src/main/resources/camel-context-SplitterFileRouter.xml b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-SplitterFileRouter.xml index 9d4a890cc6..a2ebe76e63 100644 --- a/messaging-modules/spring-apache-camel/src/main/resources/camel-context-SplitterFileRouter.xml +++ b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-SplitterFileRouter.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - + diff --git a/messaging-modules/spring-apache-camel/src/main/resources/camel-context-test.xml b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-test.xml index e6435db9e5..f306574868 100644 --- a/messaging-modules/spring-apache-camel/src/main/resources/camel-context-test.xml +++ b/messaging-modules/spring-apache-camel/src/main/resources/camel-context-test.xml @@ -4,8 +4,8 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - - + + diff --git a/messaging-modules/spring-apache-camel/src/main/resources/camel-context.xml b/messaging-modules/spring-apache-camel/src/main/resources/camel-context.xml index 63ef406fdf..721ccab95c 100644 --- a/messaging-modules/spring-apache-camel/src/main/resources/camel-context.xml +++ b/messaging-modules/spring-apache-camel/src/main/resources/camel-context.xml @@ -35,5 +35,5 @@ - + \ No newline at end of file diff --git a/messaging-modules/spring-apache-camel/src/test/java/com/baeldung/SpringContextTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/apache/baeldung/SpringContextTest.java similarity index 67% rename from messaging-modules/spring-apache-camel/src/test/java/com/baeldung/SpringContextTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/apache/baeldung/SpringContextTest.java index 14e7de2095..56969da1d7 100644 --- a/messaging-modules/spring-apache-camel/src/test/java/com/baeldung/SpringContextTest.java +++ b/messaging-modules/spring-apache-camel/src/test/java/com/apache/baeldung/SpringContextTest.java @@ -1,8 +1,8 @@ -package com.baeldung; +package com.apache.baeldung; import org.junit.Test; -import com.baeldung.camel.main.App; +import com.baeldung.camel.apache.main.App; public class SpringContextTest { diff --git a/messaging-modules/spring-apache-camel/src/test/java/com/baeldung/camel/jackson/FruitArrayJacksonUnmarshalUnitTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/apache/baeldung/camel/jackson/FruitArrayJacksonUnmarshalUnitTest.java similarity index 95% rename from messaging-modules/spring-apache-camel/src/test/java/com/baeldung/camel/jackson/FruitArrayJacksonUnmarshalUnitTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/apache/baeldung/camel/jackson/FruitArrayJacksonUnmarshalUnitTest.java index 4810d7370e..bc0025b263 100644 --- a/messaging-modules/spring-apache-camel/src/test/java/com/baeldung/camel/jackson/FruitArrayJacksonUnmarshalUnitTest.java +++ b/messaging-modules/spring-apache-camel/src/test/java/com/apache/baeldung/camel/jackson/FruitArrayJacksonUnmarshalUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.jackson; +package com.apache.baeldung.camel.jackson; import java.io.IOException; import java.net.URISyntaxException; @@ -13,6 +13,8 @@ import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.junit4.CamelTestSupport; import org.junit.Test; +import com.baeldung.camel.apache.jackson.Fruit; + public class FruitArrayJacksonUnmarshalUnitTest extends CamelTestSupport { @Test diff --git a/messaging-modules/spring-apache-camel/src/test/java/com/baeldung/camel/jackson/FruitListJacksonUnmarshalUnitTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/apache/baeldung/camel/jackson/FruitListJacksonUnmarshalUnitTest.java similarity index 93% rename from messaging-modules/spring-apache-camel/src/test/java/com/baeldung/camel/jackson/FruitListJacksonUnmarshalUnitTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/apache/baeldung/camel/jackson/FruitListJacksonUnmarshalUnitTest.java index b5647f02f9..2d15ebf46b 100644 --- a/messaging-modules/spring-apache-camel/src/test/java/com/baeldung/camel/jackson/FruitListJacksonUnmarshalUnitTest.java +++ b/messaging-modules/spring-apache-camel/src/test/java/com/apache/baeldung/camel/jackson/FruitListJacksonUnmarshalUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.camel.jackson; +package com.apache.baeldung.camel.jackson; import java.io.IOException; import java.net.URISyntaxException; @@ -13,6 +13,9 @@ import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.junit4.CamelTestSupport; import org.junit.Test; +import com.baeldung.camel.apache.jackson.Fruit; +import com.baeldung.camel.apache.jackson.FruitList; + public class FruitListJacksonUnmarshalUnitTest extends CamelTestSupport { @Test diff --git a/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/ContentBasedFileRouterIntegrationTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/ContentBasedFileRouterIntegrationTest.java index 23f5787e4e..1fc3ee7515 100644 --- a/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/ContentBasedFileRouterIntegrationTest.java +++ b/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/ContentBasedFileRouterIntegrationTest.java @@ -11,7 +11,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; -import com.baeldung.camel.file.cfg.ContentBasedFileRouterConfig; +import com.baeldung.camel.apache.file.cfg.ContentBasedFileRouterConfig; @RunWith(JUnit4.class) public class ContentBasedFileRouterIntegrationTest { diff --git a/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorIntegrationTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorIntegrationTest.java index 1d88e8aeb4..bc5de17537 100644 --- a/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorIntegrationTest.java +++ b/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/file/processor/FileProcessorIntegrationTest.java @@ -9,7 +9,7 @@ import org.junit.Before; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; -import com.baeldung.camel.file.FileProcessor; +import com.baeldung.camel.apache.file.FileProcessor; public class FileProcessorIntegrationTest { diff --git a/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/main/AppIntegrationTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/main/AppIntegrationTest.java index b33e6a3b29..cef387dc14 100644 --- a/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/main/AppIntegrationTest.java +++ b/messaging-modules/spring-apache-camel/src/test/java/com/apache/camel/main/AppIntegrationTest.java @@ -1,6 +1,6 @@ package com.apache.camel.main; -import com.baeldung.camel.main.App; +import com.baeldung.camel.apache.main.App; import junit.framework.TestCase; import org.apache.camel.util.FileUtil; import org.junit.After; diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/SpringContextTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/boot/SpringContextTest.java similarity index 85% rename from spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/SpringContextTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/boot/SpringContextTest.java index ce743e0f77..527877f47e 100644 --- a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/SpringContextTest.java +++ b/messaging-modules/spring-apache-camel/src/test/java/com/boot/SpringContextTest.java @@ -1,11 +1,11 @@ -package com.baeldung; +package com.boot; 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.camel.Application; +import com.baeldung.camel.boot.Application; @RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/boot/testing/GreetingsFileRouterUnitTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/boot/testing/GreetingsFileRouterUnitTest.java similarity index 71% rename from spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/boot/testing/GreetingsFileRouterUnitTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/boot/testing/GreetingsFileRouterUnitTest.java index baeb1fd39c..0f4d71f23b 100644 --- a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/boot/testing/GreetingsFileRouterUnitTest.java +++ b/messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/boot/testing/GreetingsFileRouterUnitTest.java @@ -1,4 +1,6 @@ -package com.baeldung.camel.boot.testing; +package com.boot.camel.boot.testing; + +import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD; import org.apache.camel.EndpointInject; import org.apache.camel.ProducerTemplate; @@ -8,10 +10,14 @@ import org.apache.camel.test.spring.junit5.MockEndpoints; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; -@SpringBootTest +import com.baeldung.camel.boot.Application; + +@SpringBootTest(classes = Application.class) @CamelSpringBootTest @MockEndpoints("file:output") +@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) class GreetingsFileRouterUnitTest { @Autowired @@ -21,6 +27,7 @@ class GreetingsFileRouterUnitTest { private MockEndpoint mock; @Test + @DirtiesContext void whenSendBody_thenGreetingReceivedSuccessfully() throws InterruptedException { mock.expectedBodiesReceived("Hello Baeldung Readers!"); diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalBeanRouterUnitTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/conditional/ConditionalBeanRouterUnitTest.java similarity index 70% rename from spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalBeanRouterUnitTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/conditional/ConditionalBeanRouterUnitTest.java index bba1f21392..46a5bb5eb9 100644 --- a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalBeanRouterUnitTest.java +++ b/messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/conditional/ConditionalBeanRouterUnitTest.java @@ -1,4 +1,6 @@ -package com.baeldung.camel.conditional; +package com.boot.camel.conditional; + +import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD; import org.apache.camel.EndpointInject; import org.apache.camel.ProducerTemplate; @@ -7,9 +9,13 @@ import org.apache.camel.test.spring.junit5.CamelSpringBootTest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; -@SpringBootTest +import com.baeldung.camel.boot.Application; + +@SpringBootTest(classes = Application.class) @CamelSpringBootTest +@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) class ConditionalBeanRouterUnitTest { @Autowired @@ -19,6 +25,7 @@ class ConditionalBeanRouterUnitTest { private MockEndpoint mock; @Test + @DirtiesContext void whenSendBodyWithFruit_thenFavouriteHeaderReceivedSuccessfully() throws InterruptedException { mock.expectedHeaderReceived("favourite", "Apples"); diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalBodyRouterUnitTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/conditional/ConditionalBodyRouterUnitTest.java similarity index 70% rename from spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalBodyRouterUnitTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/conditional/ConditionalBodyRouterUnitTest.java index 22c12a741f..745b9993ee 100644 --- a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalBodyRouterUnitTest.java +++ b/messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/conditional/ConditionalBodyRouterUnitTest.java @@ -1,4 +1,6 @@ -package com.baeldung.camel.conditional; +package com.boot.camel.conditional; + +import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD; import org.apache.camel.EndpointInject; import org.apache.camel.ProducerTemplate; @@ -7,9 +9,13 @@ import org.apache.camel.test.spring.junit5.CamelSpringBootTest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; -@SpringBootTest +import com.baeldung.camel.boot.Application; + +@SpringBootTest(classes = Application.class) @CamelSpringBootTest +@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) class ConditionalBodyRouterUnitTest { @Autowired @@ -19,6 +25,7 @@ class ConditionalBodyRouterUnitTest { private MockEndpoint mock; @Test + @DirtiesContext void whenSendBodyWithBaeldung_thenGoodbyeMessageReceivedSuccessfully() throws InterruptedException { mock.expectedBodiesReceived("Goodbye, Baeldung!"); diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalHeaderRouterUnitTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/conditional/ConditionalHeaderRouterUnitTest.java similarity index 70% rename from spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalHeaderRouterUnitTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/conditional/ConditionalHeaderRouterUnitTest.java index 63fbf6682a..b2803f5682 100644 --- a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/conditional/ConditionalHeaderRouterUnitTest.java +++ b/messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/conditional/ConditionalHeaderRouterUnitTest.java @@ -1,4 +1,6 @@ -package com.baeldung.camel.conditional; +package com.boot.camel.conditional; + +import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD; import org.apache.camel.EndpointInject; import org.apache.camel.ProducerTemplate; @@ -7,9 +9,13 @@ import org.apache.camel.test.spring.junit5.CamelSpringBootTest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; -@SpringBootTest +import com.baeldung.camel.boot.Application; + +@SpringBootTest(classes = Application.class) @CamelSpringBootTest +@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) class ConditionalHeaderRouterUnitTest { @Autowired @@ -19,6 +25,7 @@ class ConditionalHeaderRouterUnitTest { private MockEndpoint mock; @Test + @DirtiesContext void whenSendBodyWithFruit_thenFavouriteHeaderReceivedSuccessfully() throws InterruptedException { mock.expectedHeaderReceived("favourite", "Banana"); diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionHandlingWithDoTryRouteUnitTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/exception/ExceptionHandlingWithDoTryRouteUnitTest.java similarity index 70% rename from spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionHandlingWithDoTryRouteUnitTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/exception/ExceptionHandlingWithDoTryRouteUnitTest.java index 23d3b1a392..68deb46883 100644 --- a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionHandlingWithDoTryRouteUnitTest.java +++ b/messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/exception/ExceptionHandlingWithDoTryRouteUnitTest.java @@ -1,4 +1,6 @@ -package com.baeldung.camel.exception; +package com.boot.camel.exception; + +import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD; import org.apache.camel.EndpointInject; import org.apache.camel.ProducerTemplate; @@ -7,9 +9,13 @@ import org.apache.camel.test.spring.junit5.CamelSpringBootTest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; -@SpringBootTest +import com.baeldung.camel.boot.Application; + +@SpringBootTest(classes = Application.class) @CamelSpringBootTest +@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) class ExceptionHandlingWithDoTryRouteUnitTest { @Autowired @@ -19,6 +25,7 @@ class ExceptionHandlingWithDoTryRouteUnitTest { private MockEndpoint mock; @Test + @DirtiesContext void whenSendHeaders_thenExceptionRaisedAndHandledSuccessfully() throws Exception { mock.expectedMessageCount(1); diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionHandlingWithExceptionClauseRouteUnitTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/exception/ExceptionHandlingWithExceptionClauseRouteUnitTest.java similarity index 70% rename from spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionHandlingWithExceptionClauseRouteUnitTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/exception/ExceptionHandlingWithExceptionClauseRouteUnitTest.java index 28d672bd64..25052f2c10 100644 --- a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionHandlingWithExceptionClauseRouteUnitTest.java +++ b/messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/exception/ExceptionHandlingWithExceptionClauseRouteUnitTest.java @@ -1,4 +1,6 @@ -package com.baeldung.camel.exception; +package com.boot.camel.exception; + +import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD; import org.apache.camel.EndpointInject; import org.apache.camel.ProducerTemplate; @@ -7,9 +9,13 @@ import org.apache.camel.test.spring.junit5.CamelSpringBootTest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; -@SpringBootTest +import com.baeldung.camel.boot.Application; + +@SpringBootTest(classes = Application.class) @CamelSpringBootTest +@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) class ExceptionHandlingWithExceptionClauseRouteUnitTest { @Autowired @@ -19,6 +25,7 @@ class ExceptionHandlingWithExceptionClauseRouteUnitTest { private MockEndpoint mock; @Test + @DirtiesContext void whenSendHeaders_thenExceptionRaisedAndHandledSuccessfully() throws Exception { mock.expectedMessageCount(1); diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionThrowingRouteUnitTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/exception/ExceptionThrowingRouteUnitTest.java similarity index 78% rename from spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionThrowingRouteUnitTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/exception/ExceptionThrowingRouteUnitTest.java index 6e6944fce8..a547e84a0b 100644 --- a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionThrowingRouteUnitTest.java +++ b/messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/exception/ExceptionThrowingRouteUnitTest.java @@ -1,7 +1,8 @@ -package com.baeldung.camel.exception; +package com.boot.camel.exception; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; @@ -11,15 +12,20 @@ import org.apache.camel.test.spring.junit5.CamelSpringBootTest; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; -@SpringBootTest +import com.baeldung.camel.boot.Application; + +@SpringBootTest(classes = Application.class) @CamelSpringBootTest +@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) class ExceptionThrowingRouteUnitTest { @Autowired private ProducerTemplate template; @Test + @DirtiesContext void whenSendBody_thenExceptionRaisedSuccessfully() { CamelContext context = template.getCamelContext(); Exchange exchange = context.getEndpoint("direct:start-exception") diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/IllegalArgumentExceptionThrowingProcessorUnitTest.java b/messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/exception/IllegalArgumentExceptionThrowingProcessorUnitTest.java similarity index 76% rename from spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/IllegalArgumentExceptionThrowingProcessorUnitTest.java rename to messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/exception/IllegalArgumentExceptionThrowingProcessorUnitTest.java index a95abdfd27..9d15f70547 100644 --- a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/IllegalArgumentExceptionThrowingProcessorUnitTest.java +++ b/messaging-modules/spring-apache-camel/src/test/java/com/boot/camel/exception/IllegalArgumentExceptionThrowingProcessorUnitTest.java @@ -1,9 +1,11 @@ -package com.baeldung.camel.exception; +package com.boot.camel.exception; import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; +import com.baeldung.camel.boot.exception.IllegalArgumentExceptionThrowingProcessor; + class IllegalArgumentExceptionThrowingProcessorUnitTest { @Test diff --git a/pom.xml b/pom.xml index 8b395d44f1..d9519fa219 100644 --- a/pom.xml +++ b/pom.xml @@ -939,7 +939,6 @@ quarkus-modules/quarkus-vs-springboot quarkus-modules/quarkus-jandex spring-boot-modules/spring-boot-cassandre - spring-boot-modules/spring-boot-camel spring-boot-modules/spring-boot-3 spring-boot-modules/spring-boot-3-native spring-boot-modules/spring-boot-3-observation @@ -1055,6 +1054,7 @@ tensorflow-java xstream webrtc + messaging-modules/spring-apache-camel @@ -1148,7 +1148,6 @@ quarkus-modules/quarkus-vs-springboot quarkus-modules/quarkus-jandex spring-boot-modules/spring-boot-cassandre - spring-boot-modules/spring-boot-camel spring-boot-modules/spring-boot-3 spring-boot-modules/spring-boot-3-native spring-boot-modules/spring-boot-3-observation @@ -1267,6 +1266,7 @@ tensorflow-java xstream webrtc + messaging-modules/spring-apache-camel diff --git a/spring-boot-modules/spring-boot-camel/.gitignore b/spring-boot-modules/spring-boot-camel/.gitignore deleted file mode 100644 index 16be8f2193..0000000000 --- a/spring-boot-modules/spring-boot-camel/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/output/ diff --git a/spring-boot-modules/spring-boot-camel/README.md b/spring-boot-modules/spring-boot-camel/README.md deleted file mode 100644 index d797f1a0b5..0000000000 --- a/spring-boot-modules/spring-boot-camel/README.md +++ /dev/null @@ -1,30 +0,0 @@ -## Spring Boot Camel - -This module contains articles about Spring Boot with Apache Camel - -### Example for the Article on Camel API with SpringBoot - -To start, run: - -`mvn spring-boot:run` - -Then, make a POST http request to: - -`http://localhost:8080/camel/api/bean` - -Include the HEADER: Content-Type: application/json, - -and a BODY Payload like: - -`{"id": 1,"name": "World"}` - -We will get a return code of 201 and the response: `Hello, World` - if the transform() method from Application class is uncommented and the process() method is commented - -or return code of 201 and the response: `{"id": 10,"name": "Hello, World"}` - if the transform() method from Application class is commented and the process() method is uncommented - -## Relevant articles: - -- [Apache Camel with Spring Boot](https://www.baeldung.com/apache-camel-spring-boot) -- [Apache Camel Routes Testing in Spring Boot](https://www.baeldung.com/spring-boot-apache-camel-routes-testing) -- [Apache Camel Conditional Routing](https://www.baeldung.com/spring-apache-camel-conditional-routing) -- [Apache Camel Exception Handling](https://www.baeldung.com/java-apache-camel-exception-handling) diff --git a/spring-boot-modules/spring-boot-camel/pom.xml b/spring-boot-modules/spring-boot-camel/pom.xml deleted file mode 100644 index ecf7143808..0000000000 --- a/spring-boot-modules/spring-boot-camel/pom.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - 4.0.0 - com.example - spring-boot-camel - 0.0.1-SNAPSHOT - spring-boot-camel - - - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT - - - - - org.apache.camel.springboot - camel-servlet-starter - ${camel.version} - - - org.apache.camel.springboot - camel-jackson-starter - ${camel.version} - - - org.apache.camel.springboot - camel-swagger-java-starter - ${camel.version} - - - org.apache.camel.springboot - camel-spring-boot-starter - ${camel.version} - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-test - test - - - org.apache.camel - camel-test-spring-junit5 - ${camel.version} - test - - - - - spring-boot:run - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - com.baeldung.camel.boot.testing.GreetingsFileSpringApplication - - - - - - - - - 11 - 3.15.0 - - - \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-camel/src/main/resources/logback.xml b/spring-boot-modules/spring-boot-camel/src/main/resources/logback.xml deleted file mode 100644 index d0b4334f5a..0000000000 --- a/spring-boot-modules/spring-boot-camel/src/main/resources/logback.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - From 95026e6b88ca79b2a1f54dcd6c9da98d0527848d Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Mon, 20 Feb 2023 20:15:47 +0200 Subject: [PATCH 499/592] =?UTF-8?q?JAVA-14723=20Convert=20spring-mvc-basic?= =?UTF-8?q?s-4=20to=20Spring=20Boot=20project=20and=20upd=E2=80=A6=20(#133?= =?UTF-8?q?99)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * JAVA-14723 Convert spring-mvc-basics-4 to Spring Boot project and update articles * JAVA-14723 Refactoring and remove unused files * JAVA-14723 remove the WEB-INF and migrate jsp to html * JAVA-14723 Add back the removed test and rename the test into: ArticleViewerControllerWithRequiredAttributeIntegrationTest --------- Co-authored-by: timis1 --- .../spring-mvc-basics-4/pom.xml | 26 +++--- .../java/com/baeldung/config/WebConfig.java | 87 ++++++++++++++++++ ...BasedApplicationAndServletInitializer.java | 37 -------- ...nnotationsBasedApplicationInitializer.java | 16 ---- .../config/ApplicationInitializer.java | 41 --------- .../contexts/config/NormalWebAppConfig.java | 25 ------ .../config/RootApplicationConfig.java | 19 ---- ...BasedApplicationAndServletInitializer.java | 33 ------- .../contexts/config/SecureWebAppConfig.java | 25 ------ .../contexts/normal/HelloWorldController.java | 17 ++-- .../secure/HelloWorldSecureController.java | 11 +-- .../config/StudentControllerConfig.java | 28 ------ .../baeldung/controller/config/WebConfig.java | 28 ------ .../controller/GreetingsController.java | 34 ++----- .../controller/PassParametersController.java | 6 +- .../controller/controller/RestController.java | 10 +-- .../baeldung/controller/student/Student.java | 11 ++- .../jsonparams/config/JsonParamsConfig.java | 36 -------- .../jsonparams/config/JsonParamsInit.java | 29 ------ .../controller/ProductController.java | 10 +-- .../propertyeditor/ProductEditor.java | 2 +- .../ArticleViewerController.java | 23 ----- ...ViewerWithRequiredAttributeController.java | 2 +- .../SpringListValidationApplication.java | 2 +- .../templates/secure/view/welcome.html | 11 +++ .../templates}/view/viewPage.html | 2 +- .../templates/view/welcome.html} | 5 +- .../src/main/resources/templates/welcome.html | 10 +++ .../src/main/resources/test-mvc.xml | 24 ----- .../src/main/webapp/WEB-INF/greeting.xml | 11 --- .../src/main/webapp/WEB-INF/index.jsp | 5 -- .../webapp/WEB-INF/normal-webapp-servlet.xml | 16 ---- .../webapp/WEB-INF/rootApplicationContext.xml | 14 --- .../webapp/WEB-INF/secure-webapp-servlet.xml | 16 ---- .../webapp/WEB-INF/secure/view/welcome.jsp | 11 --- .../src/main/webapp/WEB-INF/view/sample.jsp | 7 -- .../webapp/WEB-INF/view/scopesExample.jsp | 10 --- .../src/main/webapp/WEB-INF/web-old.xml | 88 ------------------- .../src/main/webapp/WEB-INF/welcome.jsp | 12 --- .../src/main/webapp/index.jsp | 5 -- .../ControllerAnnotationIntegrationTest.java | 18 ++-- .../controller/ControllerIntegrationTest.java | 11 ++- .../GreetingsControllerUnitTest.java | 15 ++-- ...ssParametersControllerIntegrationTest.java | 12 +-- .../jsonparams/JsonParamsIntegrationTest.java | 21 +++-- ...rticleViewerControllerIntegrationTest.java | 54 ------------ ...ollerWithOptionalParamIntegrationTest.java | 13 ++- ...rWithRequiredAttributeIntegrationTest.java | 29 +++--- ...icleViewerWithMapParamIntegrationTest.java | 13 ++- ...WithTwoSeparateMethodsIntegrationTest.java | 13 ++- .../MovieControllerIntegrationTest.java | 8 +- .../src/test/resources/test-mvc.xml | 24 ----- 52 files changed, 238 insertions(+), 798 deletions(-) create mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/config/WebConfig.java delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationAndServletInitializer.java delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationInitializer.java delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/ApplicationInitializer.java delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/NormalWebAppConfig.java delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/RootApplicationConfig.java delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/SecureAnnotationsBasedApplicationAndServletInitializer.java delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/SecureWebAppConfig.java delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/config/StudentControllerConfig.java delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/config/WebConfig.java delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/jsonparams/config/JsonParamsConfig.java delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/jsonparams/config/JsonParamsInit.java delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/optionalpathvars/ArticleViewerController.java create mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/resources/templates/secure/view/welcome.html rename spring-web-modules/spring-mvc-basics-4/src/main/{webapp/WEB-INF => resources/templates}/view/viewPage.html (58%) rename spring-web-modules/spring-mvc-basics-4/src/main/{webapp/WEB-INF/view/welcome.jsp => resources/templates/view/welcome.html} (57%) create mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/resources/templates/welcome.html delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/resources/test-mvc.xml delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/greeting.xml delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/index.jsp delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/normal-webapp-servlet.xml delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/rootApplicationContext.xml delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/secure-webapp-servlet.xml delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/secure/view/welcome.jsp delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/view/sample.jsp delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/view/scopesExample.jsp delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/web-old.xml delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/welcome.jsp delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/main/webapp/index.jsp delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerIntegrationTest.java delete mode 100644 spring-web-modules/spring-mvc-basics-4/src/test/resources/test-mvc.xml diff --git a/spring-web-modules/spring-mvc-basics-4/pom.xml b/spring-web-modules/spring-mvc-basics-4/pom.xml index 376e13ed72..455e4e488c 100644 --- a/spring-web-modules/spring-mvc-basics-4/pom.xml +++ b/spring-web-modules/spring-mvc-basics-4/pom.xml @@ -15,26 +15,26 @@ - - com.fasterxml.jackson.core - jackson-databind - - - org.springframework - spring-web - org.springframework.boot spring-boot-starter-validation - javax.servlet - javax.servlet-api - provided + org.springframework.boot + spring-boot-starter-web + 3.0.2 - org.springframework - spring-webmvc + org.apache.tomcat.embed + tomcat-embed-jasper + + + javax.servlet + jstl + + + org.springframework.boot + spring-boot-starter-thymeleaf diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/config/WebConfig.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/config/WebConfig.java new file mode 100644 index 0000000000..9901915b03 --- /dev/null +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/config/WebConfig.java @@ -0,0 +1,87 @@ +package com.baeldung.config; + +import org.springframework.boot.web.server.WebServerFactoryCustomizer; +import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.view.InternalResourceViewResolver; +import org.springframework.web.servlet.view.JstlView; +import org.thymeleaf.spring5.SpringTemplateEngine; +import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver; +import org.thymeleaf.spring5.view.ThymeleafViewResolver; +import org.thymeleaf.templatemode.TemplateMode; +import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; +import org.thymeleaf.templateresolver.ITemplateResolver; + +import com.baeldung.contexts.Greeting; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * Web Configuration for the entire app + */ +@Configuration +@EnableWebMvc +public class WebConfig { + + @Bean + public WebServerFactoryCustomizer enableDefaultServlet() { + return factory -> factory.setRegisterDefaultServlet(true); + } + + @Bean + public Greeting greeting() { + Greeting greeting = new Greeting(); + greeting.setMessage("Hello World !!"); + return greeting; + } + + @Bean + public ObjectMapper objectMapper() { + return new ObjectMapper(); + } + + // Thymeleaf configuration + @Bean + public ViewResolver thymeleafViewResolver() { + + ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); + + viewResolver.setTemplateEngine(thymeleafTemplateEngine()); + viewResolver.setCharacterEncoding("UTF-8"); + viewResolver.setOrder(0); + + return viewResolver; + } + + // Thymeleaf template engine with Spring integration + @Bean + public SpringTemplateEngine thymeleafTemplateEngine() { + + SpringTemplateEngine templateEngine = new SpringTemplateEngine(); + templateEngine.setTemplateResolver(thymeleafTemplateResolver()); + templateEngine.setEnableSpringELCompiler(true); + + return templateEngine; + } + + @Bean + public SpringResourceTemplateResolver springResourceTemplateResolver() { + return new SpringResourceTemplateResolver(); + } + + @Bean + public ITemplateResolver thymeleafTemplateResolver() { + + ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); + + templateResolver.setPrefix("/templates/"); + templateResolver.setCacheable(false); + templateResolver.setSuffix(".html"); + templateResolver.setTemplateMode(TemplateMode.HTML); + templateResolver.setCharacterEncoding("UTF-8"); + + return templateResolver; + } +} diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationAndServletInitializer.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationAndServletInitializer.java deleted file mode 100644 index 1dffad637a..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationAndServletInitializer.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.baeldung.contexts.config; - -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; - -public class AnnotationsBasedApplicationAndServletInitializer //extends AbstractDispatcherServletInitializer -{ - - //uncomment to run the multiple contexts example - //@Override - protected WebApplicationContext createRootApplicationContext() { - //If this is not the only class declaring a root context, we return null because it would clash - //with other classes, as there can only be a single root context. - - //AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); - //rootContext.register(RootApplicationConfig.class); - //return rootContext; - return null; - } - - //@Override - protected WebApplicationContext createServletApplicationContext() { - AnnotationConfigWebApplicationContext normalWebAppContext = new AnnotationConfigWebApplicationContext(); - normalWebAppContext.register(NormalWebAppConfig.class); - return normalWebAppContext; - } - - //@Override - protected String[] getServletMappings() { - return new String[] { "/api/*" }; - } - - //@Override - protected String getServletName() { - return "normal-dispatcher"; - } -} diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationInitializer.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationInitializer.java deleted file mode 100644 index ffa80d58bf..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationInitializer.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.contexts.config; - -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; - -public class AnnotationsBasedApplicationInitializer //extends AbstractContextLoaderInitializer -{ - //uncomment to run the multiple contexts example - // @Override - protected WebApplicationContext createRootApplicationContext() { - AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); - rootContext.register(RootApplicationConfig.class); - return rootContext; - } - -} \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/ApplicationInitializer.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/ApplicationInitializer.java deleted file mode 100644 index 15a2631cbb..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/ApplicationInitializer.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.contexts.config; - -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRegistration; - -import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.ClassPathXmlApplicationContext; -import org.springframework.web.WebApplicationInitializer; -import org.springframework.web.context.ContextLoaderListener; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.springframework.web.context.support.XmlWebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; - -public class ApplicationInitializer //implements WebApplicationInitializer -{ - //uncomment to run the multiple contexts example - //@Override - public void onStartup(ServletContext servletContext) throws ServletException { - //Here, we can define a root context and register servlets, among other things. - //However, since we've later defined other classes to do the same and they would clash, - //we leave this commented out. - - //Root XML Context - //XmlWebApplicationContext rootContext = new XmlWebApplicationContext(); - //rootContext.setConfigLocations("/WEB-INF/rootApplicationContext.xml"); - //Annotations Context - //AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); - //rootContext.register(RootApplicationConfig.class); - //Registration - //servletContext.addListener(new ContextLoaderListener(rootContext)); - - //Dispatcher Servlet - //XmlWebApplicationContext normalWebAppContext = new XmlWebApplicationContext(); - //normalWebAppContext.setConfigLocation("/WEB-INF/normal-webapp-servlet.xml"); - //ServletRegistration.Dynamic normal = servletContext.addServlet("normal-webapp", new DispatcherServlet(normalWebAppContext)); - //normal.setLoadOnStartup(1); - //normal.addMapping("/api/*"); - } - -} diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/NormalWebAppConfig.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/NormalWebAppConfig.java deleted file mode 100644 index 3da3d3beb1..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/NormalWebAppConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.contexts.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.view.InternalResourceViewResolver; -import org.springframework.web.servlet.view.JstlView; - -@Configuration -@EnableWebMvc -@ComponentScan(basePackages = { "com.baeldung.contexts.normal" }) -public class NormalWebAppConfig implements WebMvcConfigurer { - - @Bean - public ViewResolver viewResolver() { - InternalResourceViewResolver resolver = new InternalResourceViewResolver(); - resolver.setPrefix("/WEB-INF/view/"); - resolver.setSuffix(".jsp"); - resolver.setViewClass(JstlView.class); - return resolver; - } -} diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/RootApplicationConfig.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/RootApplicationConfig.java deleted file mode 100644 index 59821076d2..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/RootApplicationConfig.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.contexts.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -import com.baeldung.contexts.Greeting; - -@Configuration -@ComponentScan(basePackages = { "com.baeldung.contexts.services" }) -public class RootApplicationConfig { - - @Bean - public Greeting greeting() { - Greeting greeting = new Greeting(); - greeting.setMessage("Hello World !!"); - return greeting; - } -} diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/SecureAnnotationsBasedApplicationAndServletInitializer.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/SecureAnnotationsBasedApplicationAndServletInitializer.java deleted file mode 100644 index 580e86d2b5..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/SecureAnnotationsBasedApplicationAndServletInitializer.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.contexts.config; - -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; - -public class SecureAnnotationsBasedApplicationAndServletInitializer// extends AbstractDispatcherServletInitializer -{ - - //uncomment to run the multiple contexts example - //@Override - protected WebApplicationContext createRootApplicationContext() { - return null; - } - - //@Override - protected WebApplicationContext createServletApplicationContext() { - AnnotationConfigWebApplicationContext secureWebAppContext = new AnnotationConfigWebApplicationContext(); - secureWebAppContext.register(SecureWebAppConfig.class); - return secureWebAppContext; - } - - //@Override - protected String[] getServletMappings() { - return new String[] { "/s/api/*" }; - } - - - //@Override - protected String getServletName() { - return "secure-dispatcher"; - } - -} diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/SecureWebAppConfig.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/SecureWebAppConfig.java deleted file mode 100644 index acc1e3092b..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/config/SecureWebAppConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.contexts.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.view.InternalResourceViewResolver; -import org.springframework.web.servlet.view.JstlView; - -@Configuration -@EnableWebMvc -@ComponentScan(basePackages = { "com.baeldung.contexts.secure" }) -public class SecureWebAppConfig implements WebMvcConfigurer { - - @Bean - public ViewResolver viewResolver() { - InternalResourceViewResolver resolver = new InternalResourceViewResolver(); - resolver.setPrefix("/WEB-INF/secure/view/"); - resolver.setSuffix(".jsp"); - resolver.setViewClass(JstlView.class); - return resolver; - } -} diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/normal/HelloWorldController.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/normal/HelloWorldController.java index 8b58c51eb3..46d1769349 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/normal/HelloWorldController.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/normal/HelloWorldController.java @@ -3,9 +3,9 @@ package com.baeldung.contexts.normal; import java.util.Arrays; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.context.ContextLoader; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.servlet.ModelAndView; @@ -19,21 +19,22 @@ public class HelloWorldController { @Autowired private GreeterService greeterService; + + @Autowired + private ApplicationContext applicationContext; private void processContext() { - WebApplicationContext rootContext = ContextLoader.getCurrentWebApplicationContext(); - - System.out.println("root context : " + rootContext); - System.out.println("root context Beans: " + Arrays.asList(rootContext.getBeanDefinitionNames())); + System.out.println("root context : " + applicationContext); + System.out.println("root context Beans: " + Arrays.asList(applicationContext.getBeanDefinitionNames())); System.out.println("context : " + webApplicationContext); System.out.println("context Beans: " + Arrays.asList(webApplicationContext.getBeanDefinitionNames())); } - @RequestMapping(path = "/welcome") + @GetMapping(path = "/welcome") public ModelAndView helloWorld() { processContext(); String message = "
    " + "

    Normal " + greeterService.greet() + "

    "; - return new ModelAndView("welcome", "message", message); + return new ModelAndView("/view/welcome", "message", message); } } diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/secure/HelloWorldSecureController.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/secure/HelloWorldSecureController.java index 4ebf2d55e0..84d7808000 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/secure/HelloWorldSecureController.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/secure/HelloWorldSecureController.java @@ -6,8 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.context.ContextLoader; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.servlet.ModelAndView; @@ -31,19 +30,15 @@ public class HelloWorldSecureController { ApplicationContext context = contextUtilService.getApplicationContext(); System.out.println("application context : " + context); System.out.println("application context Beans: " + Arrays.asList(context.getBeanDefinitionNames())); - - WebApplicationContext rootContext = ContextLoader.getCurrentWebApplicationContext(); - System.out.println("context : " + rootContext); - System.out.println("context Beans: " + Arrays.asList(rootContext.getBeanDefinitionNames())); System.out.println("context : " + webApplicationContext); System.out.println("context Beans: " + Arrays.asList(webApplicationContext.getBeanDefinitionNames())); } - @RequestMapping(path = "/welcome") + @GetMapping(path = "/welcome_secure") public ModelAndView helloWorld() { processContext(); String message = "
    " + "

    Secure " + greeterService.greet() + "

    "; - return new ModelAndView("welcome", "message", message); + return new ModelAndView("/secure/view/welcome", "message", message); } } diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/config/StudentControllerConfig.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/config/StudentControllerConfig.java deleted file mode 100644 index b84094132d..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/config/StudentControllerConfig.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.controller.config; - -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRegistration; - -import org.springframework.web.context.ContextLoaderListener; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; - -public class StudentControllerConfig //implements WebApplicationInitializer -{ - - //uncomment to run the student controller example - //@Override - public void onStartup(ServletContext sc) throws ServletException { - AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext(); - root.register(WebConfig.class); - root.setServletContext(sc); - sc.addListener(new ContextLoaderListener(root)); - - DispatcherServlet dv = new DispatcherServlet(root); - - ServletRegistration.Dynamic appServlet = sc.addServlet("test-mvc", dv); - appServlet.setLoadOnStartup(1); - appServlet.addMapping("/test/*"); - } -} diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/config/WebConfig.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/config/WebConfig.java deleted file mode 100644 index 364f042ac7..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/config/WebConfig.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.controller.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.view.InternalResourceViewResolver; - -@Configuration -@EnableWebMvc -@ComponentScan(basePackages = { "com.baeldung.controller", "com.baeldung.optionalpathvars" }) -public class WebConfig implements WebMvcConfigurer { - @Override - public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { - configurer.enable(); - } - - @Bean - public ViewResolver viewResolver() { - InternalResourceViewResolver bean = new InternalResourceViewResolver(); - bean.setPrefix("/WEB-INF/"); - bean.setSuffix(".jsp"); - return bean; - } -} \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/GreetingsController.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/GreetingsController.java index fbf78b8a0e..1568b94050 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/GreetingsController.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/GreetingsController.java @@ -7,42 +7,26 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; -@Controller +@RestController public class GreetingsController { - @RequestMapping( - value = "/greetings-with-response-body", - method = RequestMethod.GET, - produces="application/json" - ) - @ResponseBody + @GetMapping(value = "/greetings-with-response-body", produces="application/json") public String getGreetingWhileReturnTypeIsString() { - return "{\"test\": \"Hello using @ResponseBody\"}"; + return "{\"test\": \"Hello\"}"; } - @RequestMapping( - value = "/greetings-with-response-entity", - method = RequestMethod.GET, - produces = "application/json" - ) + @GetMapping(value = "/greetings-with-response-entity", produces = "application/json") public ResponseEntity getGreetingWithResponseEntity() { final HttpHeaders httpHeaders= new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON); - return new ResponseEntity("{\"test\": \"Hello with ResponseEntity\"}", httpHeaders, HttpStatus.OK); + return new ResponseEntity<>("{\"test\": \"Hello with ResponseEntity\"}", httpHeaders, HttpStatus.OK); } - @RequestMapping( - value = "/greetings-with-map-return-type", - method = RequestMethod.GET, - produces = "application/json" - ) - @ResponseBody + @GetMapping(value = "/greetings-with-map-return-type", produces = "application/json") public Map getGreetingWhileReturnTypeIsMap() { - HashMap map = new HashMap(); + HashMap map = new HashMap<>(); map.put("test", "Hello from map"); return map; } diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/PassParametersController.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/PassParametersController.java index d8330333cb..46b7003f3e 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/PassParametersController.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/PassParametersController.java @@ -18,19 +18,19 @@ public class PassParametersController { @GetMapping("/showViewPage") public String passParametersWithModel(Model model) { model.addAttribute("message", "Baeldung"); - return "viewPage"; + return "view/viewPage"; } @GetMapping("/printViewPage") public String passParametersWithModelMap(ModelMap map) { map.addAttribute("welcomeMessage", "welcome"); map.addAttribute("message", "Baeldung"); - return "viewPage"; + return "view/viewPage"; } @GetMapping("/goToViewPage") public ModelAndView passParametersWithModelAndView() { - ModelAndView modelAndView = new ModelAndView("viewPage"); + ModelAndView modelAndView = new ModelAndView("view/viewPage"); modelAndView.addObject("message", "Baeldung"); return modelAndView; } diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/RestController.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/RestController.java index a529faeed3..eead000621 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/RestController.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/RestController.java @@ -1,17 +1,15 @@ package com.baeldung.controller.controller; -import com.baeldung.controller.student.Student; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.ResponseBody; -@Controller +import com.baeldung.controller.student.Student; + +@org.springframework.web.bind.annotation.RestController public class RestController { @GetMapping(value = "/student/{studentId}") - public @ResponseBody - Student getTestData(@PathVariable Integer studentId) { + public Student getTestData(@PathVariable Integer studentId) { Student student = new Student(); student.setName("Peter"); student.setId(studentId); diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/student/Student.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/student/Student.java index 8a82dd5553..5c2b991312 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/student/Student.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/controller/student/Student.java @@ -27,7 +27,14 @@ public class Student { } @Override - public boolean equals(Object obj) { - return this.name.equals(((Student) obj).getName()); + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Student)) { + return false; + } + Student student = (Student) o; + return getName().equals(student.getName()); } } \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/jsonparams/config/JsonParamsConfig.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/jsonparams/config/JsonParamsConfig.java deleted file mode 100644 index f2049554ab..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/jsonparams/config/JsonParamsConfig.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.jsonparams.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.view.InternalResourceViewResolver; - -import com.fasterxml.jackson.databind.ObjectMapper; - -@Configuration -@EnableWebMvc -@ComponentScan(basePackages = { "com.baeldung.jsonparams" }) -public class JsonParamsConfig implements WebMvcConfigurer { - @Override - public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { - configurer.enable(); - } - - @Bean - public ViewResolver viewResolver() { - InternalResourceViewResolver bean = new InternalResourceViewResolver(); - bean.setPrefix("/WEB-INF/"); - bean.setSuffix(".jsp"); - return bean; - } - - @Bean - public ObjectMapper objectMapper() { - return new ObjectMapper(); - } - -} diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/jsonparams/config/JsonParamsInit.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/jsonparams/config/JsonParamsInit.java deleted file mode 100644 index 6db2a92350..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/jsonparams/config/JsonParamsInit.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.jsonparams.config; - -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRegistration; - -import org.springframework.web.context.ContextLoaderListener; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; - -public class JsonParamsInit // implements WebApplicationInitializer -{ - - //uncomment to run the product controller example - //@Override - public void onStartup(ServletContext sc) throws ServletException { - AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext(); - root.register(JsonParamsConfig.class); - root.setServletContext(sc); - sc.addListener(new ContextLoaderListener(root)); - - DispatcherServlet dv = new DispatcherServlet(root); - - ServletRegistration.Dynamic appServlet = sc.addServlet("jsonparams-mvc", dv); - appServlet.setLoadOnStartup(1); - appServlet.addMapping("/"); - } - -} diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/jsonparams/controller/ProductController.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/jsonparams/controller/ProductController.java index e4e2ce085d..915731581e 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/jsonparams/controller/ProductController.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/jsonparams/controller/ProductController.java @@ -1,7 +1,6 @@ package com.baeldung.jsonparams.controller; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.InitBinder; @@ -9,7 +8,7 @@ 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.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; import com.baeldung.jsonparams.model.Product; import com.baeldung.jsonparams.propertyeditor.ProductEditor; @@ -17,7 +16,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; -@Controller +@RestController @RequestMapping("/products") public class ProductController { @@ -34,21 +33,18 @@ public class ProductController { } @PostMapping("/create") - @ResponseBody public Product createProduct(@RequestBody Product product) { // custom logic return product; } @GetMapping("/get") - @ResponseBody - public Product getProduct(@RequestParam String product) throws JsonMappingException, JsonProcessingException { + public Product getProduct(@RequestParam String product) throws JsonProcessingException { final Product prod = objectMapper.readValue(product, Product.class); return prod; } @GetMapping("/get2") - @ResponseBody public Product get2Product(@RequestParam Product product) { // custom logic return product; diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/jsonparams/propertyeditor/ProductEditor.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/jsonparams/propertyeditor/ProductEditor.java index 11766118cd..41d97bed84 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/jsonparams/propertyeditor/ProductEditor.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/jsonparams/propertyeditor/ProductEditor.java @@ -18,7 +18,7 @@ public class ProductEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { - if (StringUtils.isEmpty(text)) { + if (!StringUtils.hasText(text)) { setValue(null); } else { Product prod = new Product(); diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/optionalpathvars/ArticleViewerController.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/optionalpathvars/ArticleViewerController.java deleted file mode 100644 index 1876798bd6..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/optionalpathvars/ArticleViewerController.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.optionalpathvars; - -import static com.baeldung.optionalpathvars.Article.DEFAULT_ARTICLE; - -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class ArticleViewerController { - - @RequestMapping(value = {"/article", "/article/{id}"}) - public Article getArticle(@PathVariable(name = "id") Integer articleId) { - - if (articleId != null) { - return new Article(articleId); - } else { - return DEFAULT_ARTICLE; - } - - } - -} \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/optionalpathvars/ArticleViewerWithRequiredAttributeController.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/optionalpathvars/ArticleViewerWithRequiredAttributeController.java index 7548747f05..786a56c130 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/optionalpathvars/ArticleViewerWithRequiredAttributeController.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/optionalpathvars/ArticleViewerWithRequiredAttributeController.java @@ -4,7 +4,7 @@ import static com.baeldung.optionalpathvars.Article.DEFAULT_ARTICLE; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController;; +import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "/requiredAttribute") diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/SpringListValidationApplication.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/SpringListValidationApplication.java index f16d5f877f..3d518c467c 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/SpringListValidationApplication.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/SpringListValidationApplication.java @@ -5,7 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -@ComponentScan(basePackages = "com.baeldung.validation.listvalidation") +@ComponentScan(basePackages = "com.baeldung") @Configuration @SpringBootApplication public class SpringListValidationApplication { diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/resources/templates/secure/view/welcome.html b/spring-web-modules/spring-mvc-basics-4/src/main/resources/templates/secure/view/welcome.html new file mode 100644 index 0000000000..fac7234f15 --- /dev/null +++ b/spring-web-modules/spring-mvc-basics-4/src/main/resources/templates/secure/view/welcome.html @@ -0,0 +1,11 @@ + + + + Spring Web Contexts + + +
    +
    Secure Web Application : +
    + + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/view/viewPage.html b/spring-web-modules/spring-mvc-basics-4/src/main/resources/templates/view/viewPage.html similarity index 58% rename from spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/view/viewPage.html rename to spring-web-modules/spring-mvc-basics-4/src/main/resources/templates/view/viewPage.html index 71f766407e..b520d0dd51 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/view/viewPage.html +++ b/spring-web-modules/spring-mvc-basics-4/src/main/resources/templates/view/viewPage.html @@ -4,6 +4,6 @@ Title -
    Web Application. Passed parameter : th:text="${message}"
    +
    Web Application. Passed parameter :
    diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/view/welcome.jsp b/spring-web-modules/spring-mvc-basics-4/src/main/resources/templates/view/welcome.html similarity index 57% rename from spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/view/welcome.jsp rename to spring-web-modules/spring-mvc-basics-4/src/main/resources/templates/view/welcome.html index 4eda3c58e2..291f3b8919 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/view/welcome.jsp +++ b/spring-web-modules/spring-mvc-basics-4/src/main/resources/templates/view/welcome.html @@ -1,11 +1,12 @@ - + + Spring Web Contexts
    - Normal Web Application : ${message} + Normal Web Application :
    \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/resources/templates/welcome.html b/spring-web-modules/spring-mvc-basics-4/src/main/resources/templates/welcome.html new file mode 100644 index 0000000000..c5b88e135e --- /dev/null +++ b/spring-web-modules/spring-mvc-basics-4/src/main/resources/templates/welcome.html @@ -0,0 +1,10 @@ + + + + + Insert title here + + +Data returned is + + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/resources/test-mvc.xml b/spring-web-modules/spring-mvc-basics-4/src/main/resources/test-mvc.xml deleted file mode 100644 index 44c300dfc6..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/resources/test-mvc.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - /WEB-INF/ - - - .jsp - - - \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/greeting.xml b/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/greeting.xml deleted file mode 100644 index 1ad5484d80..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/greeting.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/index.jsp b/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/index.jsp deleted file mode 100644 index c38169bb95..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/index.jsp +++ /dev/null @@ -1,5 +0,0 @@ - - -

    Hello World!

    - - diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/normal-webapp-servlet.xml b/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/normal-webapp-servlet.xml deleted file mode 100644 index 8addbe3cf3..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/normal-webapp-servlet.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/rootApplicationContext.xml b/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/rootApplicationContext.xml deleted file mode 100644 index 12e5d8f161..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/rootApplicationContext.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/secure-webapp-servlet.xml b/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/secure-webapp-servlet.xml deleted file mode 100644 index 86797ad081..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/secure-webapp-servlet.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/secure/view/welcome.jsp b/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/secure/view/welcome.jsp deleted file mode 100644 index 49ca0f8e87..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/secure/view/welcome.jsp +++ /dev/null @@ -1,11 +0,0 @@ - - - Spring Web Contexts - - -
    -
    - Secure Web Application : ${message} -
    - - \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/view/sample.jsp b/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/view/sample.jsp deleted file mode 100644 index 4c64bf97f2..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/view/sample.jsp +++ /dev/null @@ -1,7 +0,0 @@ - - - - -

    This is the body of the sample view

    - - \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/view/scopesExample.jsp b/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/view/scopesExample.jsp deleted file mode 100644 index e9abcf194c..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/view/scopesExample.jsp +++ /dev/null @@ -1,10 +0,0 @@ - - - - -

    Bean Scopes Examples

    -
    Previous Message: ${previousMessage } -
    Current Message: ${currentMessage } -
    - - \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/web-old.xml b/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/web-old.xml deleted file mode 100644 index 1344362d19..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/web-old.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - normal-webapp-annotations - - org.springframework.web.servlet.DispatcherServlet - - - contextClass - org.springframework.web.context.support.AnnotationConfigWebApplicationContext - - - contextConfigLocation - com.baeldung.contexts.config.NormalWebAppConfig - - 1 - - - normal-webapp-annotations - /api-ann/* - - - - /WEB-INF/index.jsp - - diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/welcome.jsp b/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/welcome.jsp deleted file mode 100644 index c34223b411..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/WEB-INF/welcome.jsp +++ /dev/null @@ -1,12 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" - pageEncoding="UTF-8" %> - - - - - Insert title here - - -Data returned is ${data} - - \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/index.jsp b/spring-web-modules/spring-mvc-basics-4/src/main/webapp/index.jsp deleted file mode 100644 index c38169bb95..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/main/webapp/index.jsp +++ /dev/null @@ -1,5 +0,0 @@ - - -

    Hello World!

    - - diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerAnnotationIntegrationTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerAnnotationIntegrationTest.java index f378357548..7fd8f0c97f 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerAnnotationIntegrationTest.java +++ b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerAnnotationIntegrationTest.java @@ -1,26 +1,24 @@ package com.baeldung.controller; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.baeldung.controller.config.WebConfig; -import com.baeldung.controller.student.Student; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.AnnotationConfigWebContextLoader; -import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.servlet.ModelAndView; -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextConfiguration(classes = { WebConfig.class }, loader = AnnotationConfigWebContextLoader.class) +import com.baeldung.controller.student.Student; +import com.baeldung.validation.listvalidation.SpringListValidationApplication; +import com.fasterxml.jackson.databind.ObjectMapper; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = SpringListValidationApplication.class) public class ControllerAnnotationIntegrationTest { private MockMvc mockMvc; diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerIntegrationTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerIntegrationTest.java index 7e5cf1532e..a7e6bd6c4b 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerIntegrationTest.java +++ b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerIntegrationTest.java @@ -5,9 +5,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; @@ -15,11 +14,11 @@ import org.springframework.web.context.WebApplicationContext; import org.springframework.web.servlet.ModelAndView; import com.baeldung.controller.student.Student; +import com.baeldung.validation.listvalidation.SpringListValidationApplication; import com.fasterxml.jackson.databind.ObjectMapper; -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextConfiguration({ "classpath:test-mvc.xml" }) +@RunWith(SpringRunner.class) +@SpringBootTest(classes = SpringListValidationApplication.class) public class ControllerIntegrationTest { private MockMvc mockMvc; diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/GreetingsControllerUnitTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/GreetingsControllerUnitTest.java index ee9a8da8d4..4917d68ef4 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/GreetingsControllerUnitTest.java +++ b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/GreetingsControllerUnitTest.java @@ -1,24 +1,21 @@ package com.baeldung.controller; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.baeldung.controller.controller.GreetingsController; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.AnnotationConfigWebContextLoader; -import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextConfiguration(classes = { GreetingsController.class }, loader = AnnotationConfigWebContextLoader.class) +import com.baeldung.validation.listvalidation.SpringListValidationApplication; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = SpringListValidationApplication.class) public class GreetingsControllerUnitTest { private MockMvc mockMvc; diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/PassParametersControllerIntegrationTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/PassParametersControllerIntegrationTest.java index aa8148c1ef..c1311acba0 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/PassParametersControllerIntegrationTest.java +++ b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/PassParametersControllerIntegrationTest.java @@ -5,24 +5,24 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.servlet.ModelAndView; +import com.baeldung.validation.listvalidation.SpringListValidationApplication; + /** * This is the test class for {@link com.baeldung.controller.controller.PassParametersController} class. * 09/09/2017 * * @author Ahmet Cetin */ -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextConfiguration({"classpath:test-mvc.xml"}) +@RunWith(SpringRunner.class) +@SpringBootTest(classes = SpringListValidationApplication.class) public class PassParametersControllerIntegrationTest { private MockMvc mockMvc; diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/jsonparams/JsonParamsIntegrationTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/jsonparams/JsonParamsIntegrationTest.java index bceadc4896..9d414ed4ca 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/jsonparams/JsonParamsIntegrationTest.java +++ b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/jsonparams/JsonParamsIntegrationTest.java @@ -1,26 +1,25 @@ package com.baeldung.jsonparams; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import org.junit.Before; 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.http.MediaType; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.AnnotationConfigWebContextLoader; -import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import com.baeldung.validation.listvalidation.SpringListValidationApplication; -import com.baeldung.jsonparams.config.JsonParamsConfig; - -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextConfiguration(classes = { JsonParamsConfig.class }, loader = AnnotationConfigWebContextLoader.class) +@RunWith(SpringRunner.class) +@SpringBootTest(classes = SpringListValidationApplication.class) public class JsonParamsIntegrationTest { private MockMvc mockMvc; diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerIntegrationTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerIntegrationTest.java deleted file mode 100644 index 0e2313c2ac..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerIntegrationTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.baeldung.optionalpathvars; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; -import com.baeldung.controller.config.WebConfig; - -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextConfiguration(classes = { WebConfig.class }) -public class ArticleViewerControllerIntegrationTest { - - @Autowired - private WebApplicationContext wac; - - private MockMvc mockMvc; - - @Before - public void setup() throws Exception { - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); - } - - @Test - public void whenIdPathVariableIsPassed_thenResponseOK() throws Exception { - - int articleId = 5; - - this.mockMvc - .perform(MockMvcRequestBuilders.get("/article/{id}", articleId)) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.jsonPath("$.id").value(articleId)); - - } - - @Test - public void whenIdPathVariableIsNotPassed_thenResponse500() throws Exception { - - this.mockMvc - .perform(MockMvcRequestBuilders.get("/article")) - .andExpect(MockMvcResultMatchers.status().isInternalServerError()); - - } - - -} \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithOptionalParamIntegrationTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithOptionalParamIntegrationTest.java index 094995ba67..2685946b4c 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithOptionalParamIntegrationTest.java +++ b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithOptionalParamIntegrationTest.java @@ -4,19 +4,18 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.controller.config.WebConfig; -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextConfiguration(classes = { WebConfig.class }) +import com.baeldung.validation.listvalidation.SpringListValidationApplication; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = SpringListValidationApplication.class) public class ArticleViewerControllerWithOptionalParamIntegrationTest { @Autowired diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithRequiredAttributeIntegrationTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithRequiredAttributeIntegrationTest.java index a4b12c7163..6e087a1640 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithRequiredAttributeIntegrationTest.java +++ b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithRequiredAttributeIntegrationTest.java @@ -12,42 +12,39 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.controller.config.WebConfig; +import com.baeldung.validation.listvalidation.SpringListValidationApplication; @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration -@ContextConfiguration(classes = { WebConfig.class }) +@ContextConfiguration(classes = { SpringListValidationApplication.class }) public class ArticleViewerControllerWithRequiredAttributeIntegrationTest { @Autowired private WebApplicationContext wac; - + private MockMvc mockMvc; @Before - public void setup() throws Exception { + public void setup() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); } @Test - public void givenRequiredAttributeIsFalse_whenIdPathVariableIsPassed_thenResponseOK() throws Exception { - - int articleId = 154; + public void whenIdPathVariableIsPassed_thenResponseOK() throws Exception { + int articleId = 5; this.mockMvc - .perform(MockMvcRequestBuilders.get("/requiredAttribute/article/{id}", articleId)) + .perform(MockMvcRequestBuilders.get("/article/{id}", articleId)) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.id").value(articleId)); - + } - + @Test - public void givenRequiredAttributeIsFalse_whenIdPathVariableIsNotPassed_thenResponseOK() throws Exception { - + public void whenIdPathVariableIsNotPassed_thenResponse500() throws Exception { this.mockMvc - .perform(MockMvcRequestBuilders.get("/requiredAttribute/article")) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.jsonPath("$.id").value(Article.DEFAULT_ARTICLE.getId())); - + .perform(MockMvcRequestBuilders.get("/article")) + .andExpect(MockMvcResultMatchers.status().isInternalServerError()); + } } \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerWithMapParamIntegrationTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerWithMapParamIntegrationTest.java index 044a1c8bce..2be6d1e679 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerWithMapParamIntegrationTest.java +++ b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerWithMapParamIntegrationTest.java @@ -4,19 +4,18 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.controller.config.WebConfig; -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextConfiguration(classes = { WebConfig.class }) +import com.baeldung.validation.listvalidation.SpringListValidationApplication; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = SpringListValidationApplication.class) public class ArticleViewerWithMapParamIntegrationTest { @Autowired diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerWithTwoSeparateMethodsIntegrationTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerWithTwoSeparateMethodsIntegrationTest.java index 1ca926277d..e70ac5e5a6 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerWithTwoSeparateMethodsIntegrationTest.java +++ b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerWithTwoSeparateMethodsIntegrationTest.java @@ -4,19 +4,18 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.controller.config.WebConfig; -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextConfiguration(classes = { WebConfig.class }) +import com.baeldung.validation.listvalidation.SpringListValidationApplication; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = SpringListValidationApplication.class) public class ArticleViewerWithTwoSeparateMethodsIntegrationTest { @Autowired diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/validation/listvalidation/MovieControllerIntegrationTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/validation/listvalidation/MovieControllerIntegrationTest.java index cddc6c6bd9..14ceb651d7 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/validation/listvalidation/MovieControllerIntegrationTest.java +++ b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/validation/listvalidation/MovieControllerIntegrationTest.java @@ -34,7 +34,7 @@ public class MovieControllerIntegrationTest { Movie movie = new Movie("Movie3"); movies.add(movie); mvc.perform(MockMvcRequestBuilders.post("/movies") - .contentType(MediaType.APPLICATION_JSON_UTF8) + .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(movies))) .andExpect(MockMvcResultMatchers.status() .isOk()); @@ -44,7 +44,7 @@ public class MovieControllerIntegrationTest { public void givenEmptyMovieList_whenAddingMovieList_thenThrowBadRequest() throws Exception { List movies = new ArrayList<>(); mvc.perform(MockMvcRequestBuilders.post("/movies") - .contentType(MediaType.APPLICATION_JSON_UTF8) + .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(movies))) .andExpect(MockMvcResultMatchers.status() .isBadRequest()); @@ -54,7 +54,7 @@ public class MovieControllerIntegrationTest { public void givenEmptyMovieName_whenAddingMovieList_thenThrowBadRequest() throws Exception { Movie movie = new Movie(""); mvc.perform(MockMvcRequestBuilders.post("/movies") - .contentType(MediaType.APPLICATION_JSON_UTF8) + .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(Arrays.asList(movie)))) .andExpect(MockMvcResultMatchers.status() .isBadRequest()); @@ -74,7 +74,7 @@ public class MovieControllerIntegrationTest { movies.add(movie4); movies.add(movie5); mvc.perform(MockMvcRequestBuilders.post("/movies") - .contentType(MediaType.APPLICATION_JSON_UTF8) + .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(movies))) .andExpect(MockMvcResultMatchers.status() .isBadRequest()); diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/resources/test-mvc.xml b/spring-web-modules/spring-mvc-basics-4/src/test/resources/test-mvc.xml deleted file mode 100644 index f1aa8e9504..0000000000 --- a/spring-web-modules/spring-mvc-basics-4/src/test/resources/test-mvc.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - /WEB-INF/ - - - .jsp - - - \ No newline at end of file From 253c01ef4fd30400a3252817a2292161f9fd0001 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Mon, 20 Feb 2023 21:08:16 +0200 Subject: [PATCH 500/592] JAVA-18445 Cleanup un-committed or un-ignored artifacts - Week 6 - 2023 (conti-1) (moved-1) (#13510) Co-authored-by: timis1 --- .gitignore | 5 ++- .../com/baeldung/aes/AESUtilUnitTest.java | 6 ++-- .../EnumSingletonUnitTest.java | 34 ++++++++++++------- .../SingletonUnitTest.java | 34 ++++++++++++------- 4 files changed, 51 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index 5dc7abec6a..f78dcd70e1 100644 --- a/.gitignore +++ b/.gitignore @@ -107,4 +107,7 @@ spring-boot-modules/spring-boot-properties-3/*.log .sdkmanrc # Localstack -**/.localstack \ No newline at end of file +**/.localstack + +#web-modules/ninja +devDb*.db \ No newline at end of file diff --git a/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/aes/AESUtilUnitTest.java b/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/aes/AESUtilUnitTest.java index 531c20ca79..04499a4fed 100644 --- a/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/aes/AESUtilUnitTest.java +++ b/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/aes/AESUtilUnitTest.java @@ -48,7 +48,7 @@ class AESUtilUnitTest implements WithAssertions { IvParameterSpec ivParameterSpec = AESUtil.generateIv(); File inputFile = Paths.get("src/test/resources/baeldung.txt") .toFile(); - File encryptedFile = new File("classpath:baeldung.encrypted"); + File encryptedFile = new File("baeldung.encrypted"); File decryptedFile = new File("document.decrypted"); // when @@ -57,8 +57,8 @@ class AESUtilUnitTest implements WithAssertions { // then assertThat(inputFile).hasSameTextualContentAs(decryptedFile); - encryptedFile.delete(); - decryptedFile.delete(); + encryptedFile.deleteOnExit(); + decryptedFile.deleteOnExit(); } @Test diff --git a/patterns-modules/design-patterns-singleton/src/test/java/com/baeldung/serializable_singleton/EnumSingletonUnitTest.java b/patterns-modules/design-patterns-singleton/src/test/java/com/baeldung/serializable_singleton/EnumSingletonUnitTest.java index e0a098056a..7fdcb20850 100644 --- a/patterns-modules/design-patterns-singleton/src/test/java/com/baeldung/serializable_singleton/EnumSingletonUnitTest.java +++ b/patterns-modules/design-patterns-singleton/src/test/java/com/baeldung/serializable_singleton/EnumSingletonUnitTest.java @@ -1,8 +1,10 @@ package com.baeldung.serializable_singleton; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; +import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; @@ -10,8 +12,10 @@ import java.io.ObjectOutputStream; // Unit test for the EnumSingleton class. public class EnumSingletonUnitTest { - - // Checks that when an EnumSingleton instance is serialized + + private static final String ENUM_SINGLETON_TEST_TXT = "enum_singleton_test.txt"; + + // Checks that when an EnumSingleton instance is serialized // and then deserialized, its state is preserved. @Test public void givenEnumSingleton_whenSerializedAndDeserialized_thenStatePreserved() { @@ -19,11 +23,10 @@ public class EnumSingletonUnitTest { es1.setState("State One"); - try ( - FileOutputStream fos = new FileOutputStream("enum_singleton_test.txt"); - ObjectOutputStream oos = new ObjectOutputStream(fos); - FileInputStream fis = new FileInputStream("enum_singleton_test.txt"); - ObjectInputStream ois = new ObjectInputStream(fis)) { + try (FileOutputStream fos = new FileOutputStream(ENUM_SINGLETON_TEST_TXT); + ObjectOutputStream oos = new ObjectOutputStream(fos); + FileInputStream fis = new FileInputStream(ENUM_SINGLETON_TEST_TXT); + ObjectInputStream ois = new ObjectInputStream(fis)) { // Serializing. oos.writeObject(es1); @@ -46,11 +49,10 @@ public class EnumSingletonUnitTest { public void givenEnumSingleton_whenSerializedAndDeserialized_thenOneInstance() { EnumSingleton es1 = EnumSingleton.getInstance(); - try ( - FileOutputStream fos = new FileOutputStream("enum_singleton_test.txt"); - ObjectOutputStream oos = new ObjectOutputStream(fos); - FileInputStream fis = new FileInputStream("enum_singleton_test.txt"); - ObjectInputStream ois = new ObjectInputStream(fis)) { + try (FileOutputStream fos = new FileOutputStream(ENUM_SINGLETON_TEST_TXT); + ObjectOutputStream oos = new ObjectOutputStream(fos); + FileInputStream fis = new FileInputStream(ENUM_SINGLETON_TEST_TXT); + ObjectInputStream ois = new ObjectInputStream(fis)) { // Serializing. oos.writeObject(es1); @@ -66,4 +68,12 @@ public class EnumSingletonUnitTest { System.out.println(e); } } + + @AfterAll + public static void cleanUp() { + final File removeFile = new File(ENUM_SINGLETON_TEST_TXT); + if (removeFile.exists()) { + removeFile.deleteOnExit(); + } + } } diff --git a/patterns-modules/design-patterns-singleton/src/test/java/com/baeldung/serializable_singleton/SingletonUnitTest.java b/patterns-modules/design-patterns-singleton/src/test/java/com/baeldung/serializable_singleton/SingletonUnitTest.java index cc26eb6995..a46288cc8f 100644 --- a/patterns-modules/design-patterns-singleton/src/test/java/com/baeldung/serializable_singleton/SingletonUnitTest.java +++ b/patterns-modules/design-patterns-singleton/src/test/java/com/baeldung/serializable_singleton/SingletonUnitTest.java @@ -1,8 +1,10 @@ package com.baeldung.serializable_singleton; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; +import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; @@ -10,8 +12,10 @@ import java.io.ObjectOutputStream; // Unit test for the Singleton class. public class SingletonUnitTest { - - // Checks that when a Singleton instance is serialized + + private static final String SINGLETON_TEST_TXT = "singleton_test.txt"; + + // Checks that when a Singleton instance is serialized // and then deserialized, its state is preserved. @Test public void givenSingleton_whenSerializedAndDeserialized_thenStatePreserved() { @@ -19,11 +23,10 @@ public class SingletonUnitTest { s1.setState("State One"); - try ( - FileOutputStream fos = new FileOutputStream("singleton_test.txt"); - ObjectOutputStream oos = new ObjectOutputStream(fos); - FileInputStream fis = new FileInputStream("singleton_test.txt"); - ObjectInputStream ois = new ObjectInputStream(fis)) { + try (FileOutputStream fos = new FileOutputStream(SINGLETON_TEST_TXT); + ObjectOutputStream oos = new ObjectOutputStream(fos); + FileInputStream fis = new FileInputStream(SINGLETON_TEST_TXT); + ObjectInputStream ois = new ObjectInputStream(fis)) { // Serializing. oos.writeObject(s1); @@ -46,11 +49,10 @@ public class SingletonUnitTest { public void givenSingleton_whenSerializedAndDeserialized_thenTwoInstances() { Singleton s1 = Singleton.getInstance(); - try ( - FileOutputStream fos = new FileOutputStream("singleton_test.txt"); - ObjectOutputStream oos = new ObjectOutputStream(fos); - FileInputStream fis = new FileInputStream("singleton_test.txt"); - ObjectInputStream ois = new ObjectInputStream(fis)) { + try (FileOutputStream fos = new FileOutputStream(SINGLETON_TEST_TXT); + ObjectOutputStream oos = new ObjectOutputStream(fos); + FileInputStream fis = new FileInputStream(SINGLETON_TEST_TXT); + ObjectInputStream ois = new ObjectInputStream(fis)) { // Serializing. oos.writeObject(s1); @@ -65,4 +67,12 @@ public class SingletonUnitTest { System.out.println(e); } } + + @AfterAll + public static void cleanUp() { + final File removeFile = new File(SINGLETON_TEST_TXT); + if (removeFile.exists()) { + removeFile.deleteOnExit(); + } + } } From cd3df938a06c577dd25f3f12e3af030b04763ef6 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Mon, 20 Feb 2023 21:14:46 +0200 Subject: [PATCH 501/592] JAVA-18132 Upgrade custom-pmd module to JDK 11 (#13500) Co-authored-by: timis1 --- custom-pmd/pom.xml | 8 ++++---- .../com/baeldung/pmd/UnitTestNamingConventionRule.java | 3 ++- pom.xml | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/custom-pmd/pom.xml b/custom-pmd/pom.xml index 550f96de33..38a5e30404 100644 --- a/custom-pmd/pom.xml +++ b/custom-pmd/pom.xml @@ -44,10 +44,10 @@
    - 3.7.0 - 6.0.1 - 1.8 - 1.8 + 3.10.0 + 6.53.0 + 11 + 11 \ No newline at end of file diff --git a/custom-pmd/src/main/java/com/baeldung/pmd/UnitTestNamingConventionRule.java b/custom-pmd/src/main/java/com/baeldung/pmd/UnitTestNamingConventionRule.java index e30164ac4f..a652bd1bfa 100644 --- a/custom-pmd/src/main/java/com/baeldung/pmd/UnitTestNamingConventionRule.java +++ b/custom-pmd/src/main/java/com/baeldung/pmd/UnitTestNamingConventionRule.java @@ -18,8 +18,9 @@ public class UnitTestNamingConventionRule extends AbstractJavaRule { "UnitTest", "jmhTest"); + @Override public Object visit(ASTClassOrInterfaceDeclaration node, Object data) { - String className = node.getImage(); + String className = node.getSimpleName(); Objects.requireNonNull(className); if (className.endsWith("SpringContextTest")) { diff --git a/pom.xml b/pom.xml index d9519fa219..33ea7a7c5f 100644 --- a/pom.xml +++ b/pom.xml @@ -340,7 +340,6 @@ core-groovy-modules core-java-modules couchbase - custom-pmd drools @@ -609,7 +608,6 @@ core-groovy-modules core-java-modules couchbase - custom-pmd drools @@ -922,6 +920,7 @@ core-java-modules/core-java-networking-3 core-java-modules/core-java-strings core-java-modules/core-java-httpclient + custom-pmd spring-core-6 data-structures ddd-contexts @@ -1131,6 +1130,7 @@ core-java-modules/core-java-networking-3 core-java-modules/core-java-strings core-java-modules/core-java-httpclient + custom-pmd spring-core-6 data-structures ddd-contexts From 68522540e5b858925355e32f81ac0e670f819787 Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Mon, 20 Feb 2023 23:10:15 +0100 Subject: [PATCH 502/592] BAEL-6069: Exclude dependency in a Maven plugin (#13508) --- .../core-java-exclusions/pom.xml | 53 ++++++++++++++ .../ExcludeDirectDependencyUnitTest.java | 12 ++++ .../dummy-surefire-junit47/pom.xml | 9 +++ dependeny-exclusion/pom.xml | 71 +++++++++++++++++++ 4 files changed, 145 insertions(+) create mode 100644 dependeny-exclusion/core-java-exclusions/pom.xml create mode 100644 dependeny-exclusion/core-java-exclusions/src/test/java/com/sample/project/tests/ExcludeDirectDependencyUnitTest.java create mode 100644 dependeny-exclusion/dummy-surefire-junit47/pom.xml create mode 100644 dependeny-exclusion/pom.xml diff --git a/dependeny-exclusion/core-java-exclusions/pom.xml b/dependeny-exclusion/core-java-exclusions/pom.xml new file mode 100644 index 0000000000..cf1f6d1e1b --- /dev/null +++ b/dependeny-exclusion/core-java-exclusions/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + core-java-exclusions + 0.0.0-SNAPSHOT + core-java-exclusions + jar + + + com.baeldung.dependency-exclusion + dependency-exclusion + 0.0.1-SNAPSHOT + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${surefire-version} + + alphabetical + 1 + + + junit + false + + + + + + + org.apache.maven.surefire + surefire-junit47 + dummy + + + + + + + + + junit + junit + test + + + + diff --git a/dependeny-exclusion/core-java-exclusions/src/test/java/com/sample/project/tests/ExcludeDirectDependencyUnitTest.java b/dependeny-exclusion/core-java-exclusions/src/test/java/com/sample/project/tests/ExcludeDirectDependencyUnitTest.java new file mode 100644 index 0000000000..ed2400f9ac --- /dev/null +++ b/dependeny-exclusion/core-java-exclusions/src/test/java/com/sample/project/tests/ExcludeDirectDependencyUnitTest.java @@ -0,0 +1,12 @@ +package com.sample.project.tests; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class ExcludeDirectDependencyUnitTest { + @Test + public void basicUnitTest() { + assertTrue(true); + } +} diff --git a/dependeny-exclusion/dummy-surefire-junit47/pom.xml b/dependeny-exclusion/dummy-surefire-junit47/pom.xml new file mode 100644 index 0000000000..5859ddbe72 --- /dev/null +++ b/dependeny-exclusion/dummy-surefire-junit47/pom.xml @@ -0,0 +1,9 @@ + + + 4.0.0 + org.apache.maven.surefire + surefire-junit47 + dummy + diff --git a/dependeny-exclusion/pom.xml b/dependeny-exclusion/pom.xml new file mode 100644 index 0000000000..ac83cc161a --- /dev/null +++ b/dependeny-exclusion/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + com.baeldung.dependency-exclusion + dependency-exclusion + dependency-exclusion + pom + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + 2.22.2 + + + + dummy-surefire-junit47 + core-java-exclusions + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + -parameters + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${surefire-version} + + 1 + + + + org.apache.maven.surefire + surefire-junit-platform + ${surefire-version} + + + + + + + + + + + junit + junit + 4.13 + + + + + From a3f2e96feb8fd41ddf41778a0ff970c376c2532a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Grzegorz=20Musia=C5=82?= Date: Tue, 21 Feb 2023 02:40:59 +0100 Subject: [PATCH 503/592] BAEL-5549: feat: Hibernate Keywords - using keywords as table column names (#13355) * BAEL-5549: feat: Hibernate Keywords - using keywords as table column names * BAEL-5549: feat: Hibernate Keywords - using keywords as table column names * BAEL-5549: feat: Hibernate Keywords - using keywords as table column names * BAEL-5549: fix: Hibernate Keywords - alter the "where" value to make sure it is obvious that it is not the value but the @Column that is causing the error. * BAEL-5549: doc: Hibernate Keywords - revert README changes --- persistence-modules/hibernate-queries/pom.xml | 7 +++ .../hibernate/keywords/BrokenPhoneOrder.java | 39 +++++++++++++ .../hibernate/keywords/PhoneOrder.java | 39 +++++++++++++ ...ateKeywordsApplicationIntegrationTest.java | 58 +++++++++++++++++++ .../keywords/hibernate.keywords.cfg.xml | 14 +++++ .../src/test/resources/keywords/init.sql | 9 +++ 6 files changed, 166 insertions(+) create mode 100644 persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/keywords/BrokenPhoneOrder.java create mode 100644 persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/keywords/PhoneOrder.java create mode 100644 persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationIntegrationTest.java create mode 100644 persistence-modules/hibernate-queries/src/test/resources/keywords/hibernate.keywords.cfg.xml create mode 100644 persistence-modules/hibernate-queries/src/test/resources/keywords/init.sql diff --git a/persistence-modules/hibernate-queries/pom.xml b/persistence-modules/hibernate-queries/pom.xml index e530ea2555..68a46b82b1 100644 --- a/persistence-modules/hibernate-queries/pom.xml +++ b/persistence-modules/hibernate-queries/pom.xml @@ -79,6 +79,12 @@ jmh-generator-annprocess ${jmh-generator.version} + + org.testcontainers + mysql + ${testcontainers.mysql.version} + test + @@ -88,6 +94,7 @@ 6.0.6 2.2.3 2.1.214 + 1.17.6 \ No newline at end of file diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/keywords/BrokenPhoneOrder.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/keywords/BrokenPhoneOrder.java new file mode 100644 index 0000000000..e045005f28 --- /dev/null +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/keywords/BrokenPhoneOrder.java @@ -0,0 +1,39 @@ +package com.baeldung.hibernate.keywords; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "broken_phone_order") +public class BrokenPhoneOrder implements Serializable { + @Id + @Column(name = "order") + String order; + @Column(name = "where") + String where; + + public BrokenPhoneOrder(String order, String where) { + this.order = order; + this.where = where; + } + + public String getOrder() { + return order; + } + + public void setOrder(String order) { + this.order = order; + } + + public String getWhere() { + return where; + } + + public void setWhere(String where) { + this.where = where; + } +} diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/keywords/PhoneOrder.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/keywords/PhoneOrder.java new file mode 100644 index 0000000000..daee57d553 --- /dev/null +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/keywords/PhoneOrder.java @@ -0,0 +1,39 @@ +package com.baeldung.hibernate.keywords; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "phone_order") +public class PhoneOrder implements Serializable { + @Id + @Column(name = "`order`") + String order; + @Column(name = "`where`") + String where; + + public PhoneOrder(String order, String where) { + this.order = order; + this.where = where; + } + + public String getOrder() { + return order; + } + + public void setOrder(String order) { + this.order = order; + } + + public String getWhere() { + return where; + } + + public void setWhere(String where) { + this.where = where; + } +} diff --git a/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationIntegrationTest.java b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationIntegrationTest.java new file mode 100644 index 0000000000..4282da3de4 --- /dev/null +++ b/persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/keywords/HibernateKeywordsApplicationIntegrationTest.java @@ -0,0 +1,58 @@ +package com.baeldung.hibernate.keywords; + +import static java.util.UUID.randomUUID; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +import javax.persistence.PersistenceException; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.cfg.Configuration; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class HibernateKeywordsApplicationIntegrationTest { + + private static SessionFactory sessionFactory; + private Session session; + + @BeforeAll + static void createSession() { + sessionFactory = new Configuration().addAnnotatedClass(BrokenPhoneOrder.class) + .addAnnotatedClass(PhoneOrder.class) + .configure("keywords/hibernate.keywords.cfg.xml") + .buildSessionFactory(); + } + + @BeforeEach + void before() { + session = sessionFactory.openSession(); + session.beginTransaction(); + } + + @AfterEach + void after() { + session.close(); + } + + @Test + void givenBrokenPhoneOrderWithReservedKeywords_whenNewObjectIsPersisted_thenItFails() { + BrokenPhoneOrder order = new BrokenPhoneOrder(randomUUID().toString(), "My House"); + + assertThatExceptionOfType(PersistenceException.class).isThrownBy(() -> { + session.persist(order); + session.flush(); + }); + } + + @Test + void givenPhoneOrderWithEscapedKeywords_whenNewObjectIsPersisted_thenItSucceeds() { + PhoneOrder order = new PhoneOrder(randomUUID().toString(), "here"); + + session.persist(order); + session.flush(); + } + +} diff --git a/persistence-modules/hibernate-queries/src/test/resources/keywords/hibernate.keywords.cfg.xml b/persistence-modules/hibernate-queries/src/test/resources/keywords/hibernate.keywords.cfg.xml new file mode 100644 index 0000000000..9a1b6bb775 --- /dev/null +++ b/persistence-modules/hibernate-queries/src/test/resources/keywords/hibernate.keywords.cfg.xml @@ -0,0 +1,14 @@ + + + + + + org.hibernate.dialect.MySQLDialect + jdbc:tc:mysql:5.7.41:///restaurant?TC_INITSCRIPT=keywords/init.sql + org.testcontainers.jdbc.ContainerDatabaseDriver + validate + true + + + \ No newline at end of file diff --git a/persistence-modules/hibernate-queries/src/test/resources/keywords/init.sql b/persistence-modules/hibernate-queries/src/test/resources/keywords/init.sql new file mode 100644 index 0000000000..4d42a45f5b --- /dev/null +++ b/persistence-modules/hibernate-queries/src/test/resources/keywords/init.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS phone_order ( + `order` varchar(255) PRIMARY KEY, + `where` varchar(255) +); + +CREATE TABLE IF NOT EXISTS broken_phone_order ( + `order` varchar(255) PRIMARY KEY, + `where` varchar(255) +); \ No newline at end of file From d4419b6bf1cae157bb28fd16b1f566aa98eeebd7 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Tue, 21 Feb 2023 06:31:23 +0200 Subject: [PATCH 504/592] [JAVA-18603] Upgraded junit-platform version --- testing-modules/junit5-annotations/pom.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/testing-modules/junit5-annotations/pom.xml b/testing-modules/junit5-annotations/pom.xml index a4035a23f1..ab3c1c0cc2 100644 --- a/testing-modules/junit5-annotations/pom.xml +++ b/testing-modules/junit5-annotations/pom.xml @@ -15,6 +15,12 @@ + + org.junit.jupiter + junit-jupiter + ${junit-jupiter.version} + test + org.junit.platform junit-platform-engine @@ -39,7 +45,8 @@ - 2.17.1 + 2.19.0 + 1.9.2 \ No newline at end of file From 0a60389b76f1f2cf1923861c7deb70b8b6b89a04 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Tue, 21 Feb 2023 17:23:18 +0200 Subject: [PATCH 505/592] [JAVA-18603] Upgraded junit-platform version at parent pom --- pom.xml | 2 +- testing-modules/junit5-annotations/pom.xml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index f04f93e339..82ee69978e 100644 --- a/pom.xml +++ b/pom.xml @@ -1343,7 +1343,7 @@ 1.2 2.13.3 1.4 - 1.8.1 + 1.9.2 5.9.2 1.3.2 0.3.1 diff --git a/testing-modules/junit5-annotations/pom.xml b/testing-modules/junit5-annotations/pom.xml index ab3c1c0cc2..847baa827c 100644 --- a/testing-modules/junit5-annotations/pom.xml +++ b/testing-modules/junit5-annotations/pom.xml @@ -46,7 +46,6 @@ 2.19.0 - 1.9.2 \ No newline at end of file From 27b3b339a807fad708e45adbdca2c0f657fe6ef3 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 21 Feb 2023 17:41:43 +0200 Subject: [PATCH 506/592] [JAVA-18124] Moved apache-libraries module to jdk9-and-above profile (#13502) * [JAVA-18124] Moved apache-libraries module to jdk9-and-above profile * [JAVA-18124] Upgrade beam version --- apache-libraries/pom.xml | 9 +-------- pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/apache-libraries/pom.xml b/apache-libraries/pom.xml index 3d78869865..b6418e6a04 100644 --- a/apache-libraries/pom.xml +++ b/apache-libraries/pom.xml @@ -118,11 +118,6 @@ curator-recipes ${curator.version} - - org.apache.zookeeper - zookeeper - ${zookeeper.version} - com.fasterxml.jackson.core jackson-core @@ -191,10 +186,8 @@ - 1.8 - 1.8 1.8.2 - 2.19.0 + 2.45.0 1.1.2 1.1.0.Final 1.2.0 diff --git a/pom.xml b/pom.xml index 33ea7a7c5f..3994c713c8 100644 --- a/pom.xml +++ b/pom.xml @@ -331,7 +331,6 @@ parent-java apache-cxf-modules - apache-libraries azure checker-plugin @@ -599,7 +598,6 @@ parent-java apache-cxf-modules - apache-libraries azure checker-plugin @@ -878,6 +876,7 @@ algorithms-modules + apache-libraries apache-poi apache-velocity di-modules @@ -1087,6 +1086,7 @@ algorithms-modules + apache-libraries apache-poi apache-velocity di-modules From 9089d84d2bcc7733821ea3edb153af38974d34db Mon Sep 17 00:00:00 2001 From: alemoles Date: Tue, 21 Feb 2023 13:20:33 -0300 Subject: [PATCH 507/592] BAEL-5912 Introduction to RoaringBitmap (#13326) --- .../core-java-collections-5/README.md | 7 ++ .../core-java-collections-5/pom.xml | 58 +++++++++++++ .../roaringbitmap/BitSetsBenchmark.java | 82 +++++++++++++++++++ .../roaringbitmap/BitSetsBenchmarkRunner.java | 9 ++ .../RoaringBitmapBenchmarkUnitTest.java | 45 ++++++++++ core-java-modules/pom.xml | 1 + 6 files changed, 202 insertions(+) create mode 100644 core-java-modules/core-java-collections-5/README.md create mode 100644 core-java-modules/core-java-collections-5/pom.xml create mode 100644 core-java-modules/core-java-collections-5/src/main/java/com/baeldung/roaringbitmap/BitSetsBenchmark.java create mode 100644 core-java-modules/core-java-collections-5/src/main/java/com/baeldung/roaringbitmap/BitSetsBenchmarkRunner.java create mode 100644 core-java-modules/core-java-collections-5/src/test/java/com/baeldung/roaringbitmap/RoaringBitmapBenchmarkUnitTest.java diff --git a/core-java-modules/core-java-collections-5/README.md b/core-java-modules/core-java-collections-5/README.md new file mode 100644 index 0000000000..cf479ec507 --- /dev/null +++ b/core-java-modules/core-java-collections-5/README.md @@ -0,0 +1,7 @@ +========= + +## Core Java Collections Cookbooks and Examples + +### Relevant Articles: + +- More articles: [[<-- prev]](/core-java-modules/core-java-collections-4) \ No newline at end of file diff --git a/core-java-modules/core-java-collections-5/pom.xml b/core-java-modules/core-java-collections-5/pom.xml new file mode 100644 index 0000000000..67c9f7120c --- /dev/null +++ b/core-java-modules/core-java-collections-5/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + core-java-collections-5 + 0.0.1-SNAPSHOT + core-java-collections-5 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + org.junit.platform + junit-platform-runner + ${junit-platform.version} + test + + + org.junit.jupiter + junit-jupiter + ${junit.version} + test + + + org.junit.vintage + junit-vintage-engine + ${junit.version} + test + + + org.roaringbitmap + RoaringBitmap + ${roaringbitmap.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + + + 5.9.2 + 0.9.38 + 1.36 + + diff --git a/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/roaringbitmap/BitSetsBenchmark.java b/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/roaringbitmap/BitSetsBenchmark.java new file mode 100644 index 0000000000..4968afb752 --- /dev/null +++ b/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/roaringbitmap/BitSetsBenchmark.java @@ -0,0 +1,82 @@ +package com.baeldung.roaringbitmap; + +import java.util.BitSet; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.roaringbitmap.RoaringBitmap; + +@State(Scope.Thread) +public class BitSetsBenchmark { + private RoaringBitmap rb1; + private BitSet bs1; + private RoaringBitmap rb2; + private BitSet bs2; + private final static int SIZE = 10_000_000; + + @Setup + public void setup() { + rb1 = new RoaringBitmap(); + bs1 = new BitSet(SIZE); + rb2 = new RoaringBitmap(); + bs2 = new BitSet(SIZE); + for (int i = 0; i < SIZE / 2; i++) { + rb1.add(i); + bs1.set(i); + } + for (int i = SIZE / 2; i < SIZE; i++) { + rb2.add(i); + bs2.set(i); + } + } + + @Benchmark + public RoaringBitmap roaringBitmapUnion() { + return RoaringBitmap.or(rb1, rb2); + } + + @Benchmark + public BitSet bitSetUnion() { + BitSet result = (BitSet) bs1.clone(); + result.or(bs2); + return result; + } + + @Benchmark + public RoaringBitmap roaringBitmapIntersection() { + return RoaringBitmap.and(rb1, rb2); + } + + @Benchmark + public BitSet bitSetIntersection() { + BitSet result = (BitSet) bs1.clone(); + result.and(bs2); + return result; + } + + @Benchmark + public RoaringBitmap roaringBitmapDifference() { + return RoaringBitmap.andNot(rb1, rb2); + } + + @Benchmark + public BitSet bitSetDifference() { + BitSet result = (BitSet) bs1.clone(); + result.andNot(bs2); + return result; + } + + @Benchmark + public RoaringBitmap roaringBitmapXOR() { + return RoaringBitmap.xor(rb1, rb2); + } + + @Benchmark + public BitSet bitSetXOR() { + BitSet result = (BitSet) bs1.clone(); + result.xor(bs2); + return result; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/roaringbitmap/BitSetsBenchmarkRunner.java b/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/roaringbitmap/BitSetsBenchmarkRunner.java new file mode 100644 index 0000000000..49d556df7e --- /dev/null +++ b/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/roaringbitmap/BitSetsBenchmarkRunner.java @@ -0,0 +1,9 @@ +package com.baeldung.roaringbitmap; + +import java.io.IOException; + +public class BitSetsBenchmarkRunner { + public static void main(String... args) throws IOException { + org.openjdk.jmh.Main.main(args); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/roaringbitmap/RoaringBitmapBenchmarkUnitTest.java b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/roaringbitmap/RoaringBitmapBenchmarkUnitTest.java new file mode 100644 index 0000000000..07170512d9 --- /dev/null +++ b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/roaringbitmap/RoaringBitmapBenchmarkUnitTest.java @@ -0,0 +1,45 @@ +package com.baeldung.roaringbitmap; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; +import org.roaringbitmap.RoaringBitmap; + +class RoaringBitmapBenchmarkUnitTest { + @Test + public void givenTwoRoaringBitmap_whenUsingOr_thenWillGetSetsUnion() { + RoaringBitmap expected = RoaringBitmap.bitmapOf(1, 2, 3, 4, 5, 6, 7, 8); + RoaringBitmap A = RoaringBitmap.bitmapOf(1, 2, 3, 4, 5); + RoaringBitmap B = RoaringBitmap.bitmapOf(4, 5, 6, 7, 8); + RoaringBitmap union = RoaringBitmap.or(A, B); + assertEquals(expected, union); + } + + @Test + public void givenTwoRoaringBitmap_whenUsingAnd_thenWillGetSetsIntersection() { + RoaringBitmap expected = RoaringBitmap.bitmapOf(4, 5); + RoaringBitmap A = RoaringBitmap.bitmapOfRange(1, 6); + RoaringBitmap B = RoaringBitmap.bitmapOf(4, 5, 6, 7, 8); + RoaringBitmap intersection = RoaringBitmap.and(A, B); + assertEquals(expected, intersection); + } + + @Test + public void givenTwoRoaringBitmap_whenUsingAndNot_thenWillGetSetsDifference() { + RoaringBitmap expected = RoaringBitmap.bitmapOf(1, 2, 3); + RoaringBitmap A = new RoaringBitmap(); + A.add(1L, 6L); + RoaringBitmap B = RoaringBitmap.bitmapOf(4, 5, 6, 7, 8); + RoaringBitmap difference = RoaringBitmap.andNot(A, B); + assertEquals(expected, difference); + } + + @Test + public void givenTwoRoaringBitmap_whenUsingXOR_thenWillGetSetsSymmetricDifference() { + RoaringBitmap expected = RoaringBitmap.bitmapOf(1, 2, 3, 6, 7, 8); + RoaringBitmap A = RoaringBitmap.bitmapOfRange(1, 6); + RoaringBitmap B = RoaringBitmap.bitmapOfRange(4, 9); + RoaringBitmap xor = RoaringBitmap.xor(A, B); + assertEquals(expected, xor); + } +} \ No newline at end of file diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 1033213cd1..a96489ec6f 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -31,6 +31,7 @@ core-java-collections-2 core-java-collections-3 core-java-collections-4 + core-java-collections-5 core-java-collections-conversions core-java-collections-conversions-2 core-java-collections-set-2 From 14ce0136bd8a2f8600ccb2fb55bc90b138336426 Mon Sep 17 00:00:00 2001 From: 2406ankita <41814570+2406ankita@users.noreply.github.com> Date: Wed, 22 Feb 2023 18:36:23 +0530 Subject: [PATCH 508/592] Finding All Duplicates in a List in Java- BAEL-6075 (#13291) * Deep & Shallow Copy * Revert "Deep & Shallow Copy" This reverts commit 62f75b002a21feb90c0b6be02072356b64284283. * duplicates in a list in java * Unit test changes * unit test changes * Tests change after review * Code formatted * code formatted * new module core-java-lang-6 * entry in parent pom and test setup method name change * module renamed * parent pom entry added * pom.xml changes reverted --- .../baeldung/listduplicate/ListDuplicate.java | 69 +++++++++++++++++++ .../listduplicate/ListDuplicateUnitTest.java | 68 ++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 core-java-modules/core-java-collections-list-5/src/main/java/com/baeldung/listduplicate/ListDuplicate.java create mode 100644 core-java-modules/core-java-collections-list-5/src/test/java/com/baeldung/listduplicate/ListDuplicateUnitTest.java diff --git a/core-java-modules/core-java-collections-list-5/src/main/java/com/baeldung/listduplicate/ListDuplicate.java b/core-java-modules/core-java-collections-list-5/src/main/java/com/baeldung/listduplicate/ListDuplicate.java new file mode 100644 index 0000000000..5e3e845916 --- /dev/null +++ b/core-java-modules/core-java-collections-list-5/src/main/java/com/baeldung/listduplicate/ListDuplicate.java @@ -0,0 +1,69 @@ +package com.baeldung.listduplicate; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; + +public class ListDuplicate { + public List listDuplicateUsingSet(List list) { + List duplicates = new ArrayList<>(); + Set set = new HashSet<>(); + for (Integer i : list) { + if (set.contains(i)) { + duplicates.add(i); + } else { + set.add(i); + } + } + return duplicates; + } + + public List listDuplicateUsingMap(List list) { + List duplicates = new ArrayList<>(); + Map frequencyMap = new HashMap<>(); + for (Integer number : list) { + frequencyMap.put(number, frequencyMap.getOrDefault(number, 0) + 1); + } + for (int number : frequencyMap.keySet()) { + if (frequencyMap.get(number) != 1) { + duplicates.add(number); + } + } + return duplicates; + } + + public List listDuplicateUsingFilterAndSetAdd(List list) { + Set elements = new HashSet(); + return list.stream() + .filter(n -> !elements.add(n)) + .collect(Collectors.toList()); + } + + public List listDuplicateUsingCollectionsFrequency(List list) { + List duplicates = new ArrayList<>(); + Set set = list.stream() + .filter(i -> Collections.frequency(list, i) > 1) + .collect(Collectors.toSet()); + duplicates.addAll(set); + return duplicates; + } + + public List listDuplicateUsingMapAndCollectorsGroupingBy(List list) { + List duplicates = new ArrayList<>(); + Set set = list.stream() + .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) + .entrySet() + .stream() + .filter(m -> m.getValue() > 1) + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); + duplicates.addAll(set); + return duplicates; + } +} diff --git a/core-java-modules/core-java-collections-list-5/src/test/java/com/baeldung/listduplicate/ListDuplicateUnitTest.java b/core-java-modules/core-java-collections-list-5/src/test/java/com/baeldung/listduplicate/ListDuplicateUnitTest.java new file mode 100644 index 0000000000..0d81387aea --- /dev/null +++ b/core-java-modules/core-java-collections-list-5/src/test/java/com/baeldung/listduplicate/ListDuplicateUnitTest.java @@ -0,0 +1,68 @@ +package com.baeldung.listduplicate; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class ListDuplicateUnitTest { + private static ListDuplicate listDuplicate; + + @BeforeClass + public static void setup() { + listDuplicate = new ListDuplicate(); + } + + @Test + public void givenList_whenUsingSet_thenReturnDuplicateElements() { + List list = Arrays.asList(1, 2, 3, 3, 4, 4, 5); + List duplicates = listDuplicate.listDuplicateUsingSet(list); + Assert.assertEquals(duplicates.size(), 2); + Assert.assertEquals(duplicates.contains(3), true); + Assert.assertEquals(duplicates.contains(4), true); + Assert.assertEquals(duplicates.contains(1), false); + } + + @Test + public void givenList_whenUsingFrequencyMap_thenReturnDuplicateElements() { + List list = Arrays.asList(1, 2, 3, 3, 4, 4, 5); + List duplicates = listDuplicate.listDuplicateUsingMap(list); + Assert.assertEquals(duplicates.size(), 2); + Assert.assertEquals(duplicates.contains(3), true); + Assert.assertEquals(duplicates.contains(4), true); + Assert.assertEquals(duplicates.contains(1), false); + } + + @Test + public void givenList_whenUsingFilterAndSetAdd_thenReturnDuplicateElements() { + List list = Arrays.asList(1, 2, 3, 3, 4, 4, 5); + List duplicates = listDuplicate.listDuplicateUsingFilterAndSetAdd(list); + Assert.assertEquals(duplicates.size(), 2); + Assert.assertEquals(duplicates.contains(3), true); + Assert.assertEquals(duplicates.contains(4), true); + Assert.assertEquals(duplicates.contains(1), false); + } + + @Test + public void givenList_whenUsingCollectionsFrequency_thenReturnDuplicateElements() { + List list = Arrays.asList(1, 2, 3, 3, 4, 4, 5); + List duplicates = listDuplicate.listDuplicateUsingCollectionsFrequency(list); + Assert.assertEquals(duplicates.size(), 2); + Assert.assertEquals(duplicates.contains(3), true); + Assert.assertEquals(duplicates.contains(4), true); + Assert.assertEquals(duplicates.contains(1), false); + } + + @Test + public void givenList_whenUsingMapAndCollectorsGroupingBy_thenReturnDuplicateElements() { + List list = Arrays.asList(1, 2, 3, 3, 4, 4, 5); + List duplicates = listDuplicate.listDuplicateUsingCollectionsFrequency(list); + Assert.assertEquals(duplicates.size(), 2); + Assert.assertEquals(duplicates.contains(3), true); + Assert.assertEquals(duplicates.contains(4), true); + Assert.assertEquals(duplicates.contains(1), false); + } + +} From 58b8b7ecc788cae97bd0d5721f3604cfba9ea48c Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Wed, 22 Feb 2023 14:28:11 +0100 Subject: [PATCH 509/592] Bael 6069 (#13521) * BAEL-6069: Exclude dependency in a Maven plugin * BAEL-6069: rename project --- .../core-java-exclusions/pom.xml | 53 ++++++++++++++ .../ExcludeDirectDependencyUnitTest.java | 12 ++++ .../dummy-surefire-junit47/pom.xml | 9 +++ dependency-exclusion/pom.xml | 71 +++++++++++++++++++ 4 files changed, 145 insertions(+) create mode 100644 dependency-exclusion/core-java-exclusions/pom.xml create mode 100644 dependency-exclusion/core-java-exclusions/src/test/java/com/sample/project/tests/ExcludeDirectDependencyUnitTest.java create mode 100644 dependency-exclusion/dummy-surefire-junit47/pom.xml create mode 100644 dependency-exclusion/pom.xml diff --git a/dependency-exclusion/core-java-exclusions/pom.xml b/dependency-exclusion/core-java-exclusions/pom.xml new file mode 100644 index 0000000000..cf1b36656d --- /dev/null +++ b/dependency-exclusion/core-java-exclusions/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + core-java-exclusions + 0.0.0-SNAPSHOT + core-java-exclusions + jar + + + com.baeldung.dependency-exclusion + dependency-exclusion + 0.0.1-SNAPSHOT + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${surefire-version} + + alphabetical + 1 + + + junit + false + + + + + + + org.apache.maven.surefire + surefire-junit47 + dummy + + + + + + + + + junit + junit + test + + + + diff --git a/dependency-exclusion/core-java-exclusions/src/test/java/com/sample/project/tests/ExcludeDirectDependencyUnitTest.java b/dependency-exclusion/core-java-exclusions/src/test/java/com/sample/project/tests/ExcludeDirectDependencyUnitTest.java new file mode 100644 index 0000000000..ed2400f9ac --- /dev/null +++ b/dependency-exclusion/core-java-exclusions/src/test/java/com/sample/project/tests/ExcludeDirectDependencyUnitTest.java @@ -0,0 +1,12 @@ +package com.sample.project.tests; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class ExcludeDirectDependencyUnitTest { + @Test + public void basicUnitTest() { + assertTrue(true); + } +} diff --git a/dependency-exclusion/dummy-surefire-junit47/pom.xml b/dependency-exclusion/dummy-surefire-junit47/pom.xml new file mode 100644 index 0000000000..5859ddbe72 --- /dev/null +++ b/dependency-exclusion/dummy-surefire-junit47/pom.xml @@ -0,0 +1,9 @@ + + + 4.0.0 + org.apache.maven.surefire + surefire-junit47 + dummy + diff --git a/dependency-exclusion/pom.xml b/dependency-exclusion/pom.xml new file mode 100644 index 0000000000..ac83cc161a --- /dev/null +++ b/dependency-exclusion/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + com.baeldung.dependency-exclusion + dependency-exclusion + dependency-exclusion + pom + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + 2.22.2 + + + + dummy-surefire-junit47 + core-java-exclusions + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + -parameters + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${surefire-version} + + 1 + + + + org.apache.maven.surefire + surefire-junit-platform + ${surefire-version} + + + + + + + + + + + junit + junit + 4.13 + + + + + From 12f814488b29a484c64ed1a205c42d36f329209a Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:09:20 +0200 Subject: [PATCH 510/592] [JAVA-16376] Moved quarkus-modules to jdk9-and-above profile (#13487) * [JAVA-16376] Moved quarkus-modules to jdk9-and-above profile * [JAVA-18171] Moved reactive-systems module to jdk9-and-above profile * [JAVA-18170] Moved rxjava-modules to jdk9-and-above profile * [JAVA-18165] Moved patterns-modules to jdk9-and-above profile * [JAVA-18168] Upgraded quarkus version * [JAVA-16394] Moved groovy modules to jdk9-and-above profile * [JAVA-18165] Reverted changes for pattern-modules * [JAVA-16394] Upgraded dependencies to latest versions * [JAVA-18134] Upgraded guava-modules to java 11 and moved to jdk9-and-above profile * [JAVA-16394] Fixed groovy-eclipse-batch dependency version --------- Co-authored-by: Dhawal Kapil --- core-groovy-modules/core-groovy-2/pom.xml | 9 +++--- core-groovy-modules/pom.xml | 10 +++--- guava-modules/guava-collections/pom.xml | 1 + pom.xml | 31 ++++++------------- quarkus-modules/pom.xml | 3 +- quarkus-modules/quarkus/pom.xml | 2 +- rxjava-modules/pom.xml | 1 + .../SingleJustVsFromCallableTest.java | 2 +- 8 files changed, 26 insertions(+), 33 deletions(-) diff --git a/core-groovy-modules/core-groovy-2/pom.xml b/core-groovy-modules/core-groovy-2/pom.xml index 2b864ec7a1..ca6a9a62c7 100644 --- a/core-groovy-modules/core-groovy-2/pom.xml +++ b/core-groovy-modules/core-groovy-2/pom.xml @@ -83,7 +83,7 @@ org.codehaus.groovy groovy-eclipse-batch - ${groovy.version}-01 + ${groovy-eclipse-batch.version} @@ -163,9 +163,10 @@ 1.1.3 - 3.1.0 - 3.8.0 - 3.3.0-01 + 3.4.2 + 3.8.1 + 3.7.0 + 3.0.8-01 diff --git a/core-groovy-modules/pom.xml b/core-groovy-modules/pom.xml index 2d1120e435..6faa7f94c8 100644 --- a/core-groovy-modules/pom.xml +++ b/core-groovy-modules/pom.xml @@ -21,12 +21,12 @@ - 3.0.8 - 3.0.8 - 3.0.8 - 2.4.0 + 3.0.15 + 3.0.15 + 3.0.15 + 2.7.1 2.3-groovy-3.0 - 1.6 + 2.1.0 diff --git a/guava-modules/guava-collections/pom.xml b/guava-modules/guava-collections/pom.xml index 9283107023..8dc052db75 100644 --- a/guava-modules/guava-collections/pom.xml +++ b/guava-modules/guava-collections/pom.xml @@ -37,6 +37,7 @@ ${java-hamcrest.version} test + diff --git a/pom.xml b/pom.xml index 3994c713c8..49a0ddd8fe 100644 --- a/pom.xml +++ b/pom.xml @@ -336,7 +336,6 @@ checker-plugin - core-groovy-modules core-java-modules couchbase @@ -346,7 +345,6 @@ gradle-modules/gradle/maven-to-gradle - guava-modules apache-httpclient @@ -402,13 +400,8 @@ performance-tests persistence-modules - - quarkus-modules - rule-engines-modules - rxjava-modules - reactive-systems security-modules vavr-modules @@ -603,7 +596,6 @@ checker-plugin - core-groovy-modules core-java-modules couchbase drools @@ -611,8 +603,6 @@ gradle-modules/gradle/maven-to-gradle - - guava-modules apache-httpclient @@ -657,7 +647,6 @@ microservices-modules muleesb - netflix-modules osgi @@ -668,13 +657,8 @@ performance-tests persistence-modules - - quarkus-modules - rule-engines-modules - rxjava-modules - reactive-systems security-modules vavr-modules @@ -882,6 +866,7 @@ di-modules asciidoctor aws-modules + core-groovy-modules core-java-modules/core-java-9 core-java-modules/core-java-9-improvements core-java-modules/core-java-9-jigsaw @@ -925,6 +910,7 @@ ddd-contexts deeplearning4j docker-modules + guava-modules apache-httpclient-2 kubernetes-modules/kubernetes-spring libraries-concurrency @@ -934,8 +920,7 @@ optaplanner persistence-modules/sirix persistence-modules/spring-data-cassandra-2 - quarkus-modules/quarkus-vs-springboot - quarkus-modules/quarkus-jandex + quarkus-modules spring-boot-modules/spring-boot-cassandre spring-boot-modules/spring-boot-3 spring-boot-modules/spring-boot-3-native @@ -945,6 +930,8 @@ spring-swagger-codegen/custom-validations-opeanpi-codegen testing-modules/testing-assertions persistence-modules/fauna + reactive-systems + rxjava-modules lightrun tablesaw geotools @@ -1092,7 +1079,7 @@ di-modules asciidoctor aws-modules - + core-groovy-modules core-java-modules/core-java-9 core-java-modules/core-java-9-improvements core-java-modules/core-java-9-jigsaw @@ -1136,6 +1123,7 @@ ddd-contexts deeplearning4j docker-modules + guava-modules apache-httpclient-2 kubernetes-modules/kubernetes-spring libraries-concurrency @@ -1145,8 +1133,7 @@ optaplanner persistence-modules/sirix persistence-modules/spring-data-cassandra-2 - quarkus-modules/quarkus-vs-springboot - quarkus-modules/quarkus-jandex + quarkus-modules spring-boot-modules/spring-boot-cassandre spring-boot-modules/spring-boot-3 spring-boot-modules/spring-boot-3-native @@ -1156,6 +1143,8 @@ spring-swagger-codegen/custom-validations-opeanpi-codegen testing-modules/testing-assertions persistence-modules/fauna + reactive-systems + rxjava-modules lightrun tablesaw geotools diff --git a/quarkus-modules/pom.xml b/quarkus-modules/pom.xml index 94fe1ae10f..ab9f7c3906 100644 --- a/quarkus-modules/pom.xml +++ b/quarkus-modules/pom.xml @@ -16,7 +16,8 @@ quarkus quarkus-extension - + quarkus-jandex + quarkus-vs-springboot \ No newline at end of file diff --git a/quarkus-modules/quarkus/pom.xml b/quarkus-modules/quarkus/pom.xml index 3e1cbff01c..99d18579c3 100644 --- a/quarkus-modules/quarkus/pom.xml +++ b/quarkus-modules/quarkus/pom.xml @@ -182,7 +182,7 @@ - 1.7.0.Final + 2.16.3.Final 3.3.0 diff --git a/rxjava-modules/pom.xml b/rxjava-modules/pom.xml index cd46270d92..2f2597b644 100644 --- a/rxjava-modules/pom.xml +++ b/rxjava-modules/pom.xml @@ -17,6 +17,7 @@ rxjava-core + rxjava-core-2 rxjava-libraries rxjava-observables rxjava-operators diff --git a/rxjava-modules/rxjava-core-2/src/test/java/com/baeldung/rxjava/justvscallable/SingleJustVsFromCallableTest.java b/rxjava-modules/rxjava-core-2/src/test/java/com/baeldung/rxjava/justvscallable/SingleJustVsFromCallableTest.java index d0de86fed8..a693432343 100644 --- a/rxjava-modules/rxjava-core-2/src/test/java/com/baeldung/rxjava/justvscallable/SingleJustVsFromCallableTest.java +++ b/rxjava-modules/rxjava-core-2/src/test/java/com/baeldung/rxjava/justvscallable/SingleJustVsFromCallableTest.java @@ -12,7 +12,7 @@ import org.mockito.Mockito; import rx.Single; import rx.observers.TestSubscriber; -class SingleJustVsFromCallableTest { +class SingleJustVsFromCallableUnitTest { public EmployeeRepository repository = mock(EmployeeRepository.class); From 1bba7257a4508bf682a1d54dc94019d0462cdbea Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 22 Feb 2023 17:26:33 +0200 Subject: [PATCH 511/592] Update pom.xml --- drools/pom.xml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drools/pom.xml b/drools/pom.xml index ff121d7838..12aaf1318a 100644 --- a/drools/pom.xml +++ b/drools/pom.xml @@ -8,9 +8,8 @@ com.baeldung - parent-spring-4 - 0.0.1-SNAPSHOT - ../parent-spring-4 + parent-modules + 1.0.0-SNAPSHOT @@ -63,4 +62,4 @@ 8.32.0.Final
    - \ No newline at end of file + From d9a50e730462ae827f22c1382817545b011448e7 Mon Sep 17 00:00:00 2001 From: timis1 Date: Wed, 22 Feb 2023 19:38:11 +0200 Subject: [PATCH 512/592] JAVA-18149 Pass to the build the required parameters for chronicle-map --- libraries-2/pom.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml index 3f6f787f31..01c5c79588 100644 --- a/libraries-2/pom.xml +++ b/libraries-2/pom.xml @@ -124,6 +124,19 @@ + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M7 + + --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 + + + + + 3.0.8 4.8.153 From 8db563d9f9f53ff9373e99fd292471251d3b00ec Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Wed, 22 Feb 2023 22:19:08 -0300 Subject: [PATCH 513/592] deprecation --- .../baeldung/annotations/ClassWithSuppressWarningsNames.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithSuppressWarningsNames.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithSuppressWarningsNames.java index aad7cf49eb..d0a325a155 100644 --- a/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithSuppressWarningsNames.java +++ b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithSuppressWarningsNames.java @@ -17,7 +17,7 @@ public class ClassWithSuppressWarningsNames implements Serializable { list.add(Integer.valueOf(value)); } - @SuppressWarnings("deprecated") + @SuppressWarnings("deprecation") void suppressDeprecatedWarning() { ClassWithSuppressWarningsNames cls = new ClassWithSuppressWarningsNames(); cls.deprecatedMethod(); // no warning here From 6ad0c4f6805e6d298b12bf025f1b4677967f969b Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 23 Feb 2023 16:45:24 +0530 Subject: [PATCH 514/592] Update README.md (#13526) --- core-groovy-modules/core-groovy-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-groovy-modules/core-groovy-2/README.md b/core-groovy-modules/core-groovy-2/README.md index 9f81ac6c16..f128b43092 100644 --- a/core-groovy-modules/core-groovy-2/README.md +++ b/core-groovy-modules/core-groovy-2/README.md @@ -14,4 +14,4 @@ This module contains articles about core Groovy concepts - [A Quick Guide to Working with Web Services in Groovy](https://www.baeldung.com/groovy-web-services) - [Categories in Groovy](https://www.baeldung.com/groovy-categories) - [How to Determine the Data Type in Groovy](https://www.baeldung.com/groovy-determine-data-type) -- [[<-- Prev]](/core-groovy) +- [[<-- Prev]](/core-groovy-modules/core-groovy) From a6e2ac8872176897ef783b668f9ba6d4c5d7354e Mon Sep 17 00:00:00 2001 From: timis1 Date: Thu, 23 Feb 2023 14:16:02 +0200 Subject: [PATCH 515/592] JAVA-18149 Formatting pom.xml and apply some suggestion --- libraries-2/pom.xml | 10 +--------- pom.xml | 2 +- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml index 01c5c79588..1d5cde75a2 100644 --- a/libraries-2/pom.xml +++ b/libraries-2/pom.xml @@ -12,14 +12,6 @@ 1.0.0-SNAPSHOT - - - jboss-public-repository-group - JBoss Public Repository Group - https://repo.maven.apache.org/maven2 - - - org.mapdb @@ -129,7 +121,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.0.0-M7 + ${maven-surefire-plugin.version} --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 diff --git a/pom.xml b/pom.xml index 55b25f40de..63113b665c 100644 --- a/pom.xml +++ b/pom.xml @@ -997,7 +997,7 @@ java-native jsoup ksqldb - libraries-2 + libraries-2 libraries-7 libraries-apache-commons libraries-apache-commons-collections From 583bde3f6ada73872b4e3653b756fd25f7c858bf Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 23 Feb 2023 14:27:31 +0200 Subject: [PATCH 516/592] JAVA-18133 fix optaplanner test --- .../main/resources/courseScheduleSolverConfigDrools.xml | 6 ++++-- .../main/resources/courseScheduleSolverConfiguration.xml | 4 +++- .../baeldung/drools/optaplanner/OptaPlannerUnitTest.java | 5 +---- pom.xml | 8 ++++---- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/drools/src/main/resources/courseScheduleSolverConfigDrools.xml b/drools/src/main/resources/courseScheduleSolverConfigDrools.xml index 7cf95fdcd3..74112d9c7d 100644 --- a/drools/src/main/resources/courseScheduleSolverConfigDrools.xml +++ b/drools/src/main/resources/courseScheduleSolverConfigDrools.xml @@ -1,7 +1,9 @@ - - + + com.baeldung.drools.optaplanner.CourseSchedule + com.baeldung.drools.optaplanner.Lecture + courseSchedule.drl diff --git a/drools/src/main/resources/courseScheduleSolverConfiguration.xml b/drools/src/main/resources/courseScheduleSolverConfiguration.xml index dfedb8f2fd..4214b0943a 100644 --- a/drools/src/main/resources/courseScheduleSolverConfiguration.xml +++ b/drools/src/main/resources/courseScheduleSolverConfiguration.xml @@ -1,7 +1,9 @@ - + com.baeldung.drools.optaplanner.CourseSchedule + com.baeldung.drools.optaplanner.Lecture + com.baeldung.drools.optaplanner.ScoreCalculator diff --git a/drools/src/test/java/com/baeldung/drools/optaplanner/OptaPlannerUnitTest.java b/drools/src/test/java/com/baeldung/drools/optaplanner/OptaPlannerUnitTest.java index 2165cdda1f..36b24349c7 100644 --- a/drools/src/test/java/com/baeldung/drools/optaplanner/OptaPlannerUnitTest.java +++ b/drools/src/test/java/com/baeldung/drools/optaplanner/OptaPlannerUnitTest.java @@ -7,7 +7,6 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.optaplanner.core.api.solver.Solver; import org.optaplanner.core.api.solver.SolverFactory; -import org.optaplanner.core.config.solver.SolverConfig; public class OptaPlannerUnitTest { @@ -28,8 +27,7 @@ public class OptaPlannerUnitTest { @Test public void test_whenCustomJavaSolver() { - SolverConfig solverConfig = SolverConfig.createFromXmlResource("courseScheduleSolverConfiguration.xml"); - SolverFactory solverFactory = SolverFactory.create(solverConfig); + SolverFactory solverFactory = SolverFactory.createFromXmlResource("courseScheduleSolverConfiguration.xml"); Solver solver = solverFactory.buildSolver(); CourseSchedule solvedCourseSchedule = solver.solve(unsolvedCourseSchedule); @@ -39,7 +37,6 @@ public class OptaPlannerUnitTest { @Test public void test_whenDroolsSolver() { - SolverFactory solverFactory = SolverFactory.createFromXmlResource("courseScheduleSolverConfigDrools.xml"); Solver solver = solverFactory.buildSolver(); CourseSchedule solvedCourseSchedule = solver.solve(unsolvedCourseSchedule); diff --git a/pom.xml b/pom.xml index e330fd81c1..bd6c43ad3d 100644 --- a/pom.xml +++ b/pom.xml @@ -904,13 +904,13 @@ core-java-modules/core-java-networking-3 core-java-modules/core-java-strings core-java-modules/core-java-httpclient - custom-pmd + custom-pmd spring-core-6 data-structures ddd-contexts deeplearning4j docker-modules - drools + drools guava-modules apache-httpclient-2 kubernetes-modules/kubernetes-spring @@ -1118,13 +1118,13 @@ core-java-modules/core-java-networking-3 core-java-modules/core-java-strings core-java-modules/core-java-httpclient - custom-pmd + custom-pmd spring-core-6 data-structures ddd-contexts deeplearning4j docker-modules - drools + drools guava-modules apache-httpclient-2 kubernetes-modules/kubernetes-spring From 0b7379f60d1121992f2dbf47d8475671af8e3f9e Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 23 Feb 2023 18:47:39 +0200 Subject: [PATCH 517/592] =?UTF-8?q?[JAVA-18169]=20Moved=20rule-engines=20m?= =?UTF-8?q?odule=20to=20jdk9-and-above=20profile=20+=20Up=E2=80=A6=20(#135?= =?UTF-8?q?05)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [JAVA-18169] Moved rule-engines module to jdk9-and-above profile + Upgraded dependencies * [JAVA-18155] Moved libraries-testing module to jdk9-and-above profile * [JAVA-16395] Moved couchbase module to jdk9-and-above profile * [JAVA-18155] Upgraded libraries versions * [JAVA-18181] Moved spring-aop module to jdk9-and-above profile * [JAVA-18182] Moved spring-aop-2 module to jdk9-and-above profile * [JAVA-18143] Moved jmeter module to jdk9-and-above profile + testing build * [JAVA-18181] testing build * [JAVA-18181] Added configuration for war plugin * [JAVA-18182] Added maven-war-plugin --- couchbase/pom.xml | 9 ++++- libraries-testing/pom.xml | 5 +-- pom.xml | 47 +++++++++++++++------- rule-engines-modules/easy-rules/pom.xml | 2 +- rule-engines-modules/evrete/pom.xml | 2 +- rule-engines-modules/openl-tablets/pom.xml | 2 +- rule-engines-modules/rulebook/pom.xml | 2 +- spring-aop-2/pom.xml | 16 +++++++- spring-aop/pom.xml | 11 ++++- 9 files changed, 70 insertions(+), 26 deletions(-) diff --git a/couchbase/pom.xml b/couchbase/pom.xml index e87975a53c..095bda3610 100644 --- a/couchbase/pom.xml +++ b/couchbase/pom.xml @@ -64,11 +64,16 @@ ${commons-lang3.version} test + + javax.annotation + javax.annotation-api + 1.3.2 + - 2.5.0 - 4.3.5.RELEASE + 2.7.2 + 5.3.25 \ No newline at end of file diff --git a/libraries-testing/pom.xml b/libraries-testing/pom.xml index 2aaad59e09..9274c292ba 100644 --- a/libraries-testing/pom.xml +++ b/libraries-testing/pom.xml @@ -179,17 +179,16 @@ 1.9.9 1.9.0 1.9.0 - 1.9.27 + 3.6.12 1.5.0 3.0.0 0.8.1 4.3.8.RELEASE - 4.1.1 + 5.3.0 2.0.0.0 2.7.0 0.14.1 1.0.0 - 2.1.214 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 39720032ff..1efdb44fa0 100644 --- a/pom.xml +++ b/pom.xml @@ -337,6 +337,7 @@ core-java-modules + couchbase drools @@ -360,7 +361,7 @@ jaxb jersey jhipster-5 - jmeter + jmh jsf @@ -378,7 +379,6 @@ libraries-data-db libraries-security libraries-server-2 - libraries-testing logging-modules lombok-modules @@ -400,8 +400,6 @@ performance-tests persistence-modules - rule-engines-modules - security-modules vavr-modules @@ -455,7 +453,6 @@ spf4j spring-4 spring-aop - spring-aop-2 spring-batch spring-bom spring-boot-modules @@ -598,6 +595,7 @@ core-java-modules couchbase + drools @@ -618,7 +616,6 @@ jaxb jersey jhipster-5 - jmeter jmh jsf @@ -636,7 +633,6 @@ libraries-data-db libraries-security libraries-server-2 - libraries-testing logging-modules lombok-modules @@ -657,8 +653,6 @@ performance-tests persistence-modules - rule-engines-modules - security-modules vavr-modules @@ -703,8 +697,6 @@ server-modules spf4j spring-4 - spring-aop - spring-aop-2 spring-batch spring-bom spring-boot-modules @@ -859,6 +851,9 @@ + spring-aop + jmeter + spring-aop-2 algorithms-modules apache-libraries apache-poi @@ -866,7 +861,10 @@ di-modules asciidoctor aws-modules + + couchbase core-groovy-modules + core-java-modules/core-java-9 core-java-modules/core-java-9-improvements core-java-modules/core-java-9-jigsaw @@ -904,7 +902,7 @@ core-java-modules/core-java-networking-3 core-java-modules/core-java-strings core-java-modules/core-java-httpclient - custom-pmd + custom-pmd spring-core-6 data-structures ddd-contexts @@ -914,6 +912,7 @@ apache-httpclient-2 kubernetes-modules/kubernetes-spring libraries-concurrency + libraries-testing maven-modules/compiler-plugin-java-9 maven-modules/maven-generate-war maven-modules/multimodulemavenproject @@ -930,8 +929,12 @@ spring-swagger-codegen/custom-validations-opeanpi-codegen testing-modules/testing-assertions persistence-modules/fauna + + rule-engines-modules + reactive-systems rxjava-modules + lightrun tablesaw geotools @@ -1045,7 +1048,8 @@ UTF-8 11 - 11 + 11 + 11 @@ -1079,6 +1083,9 @@ di-modules asciidoctor aws-modules + + couchbase + core-groovy-modules core-java-modules/core-java-9 core-java-modules/core-java-9-improvements @@ -1117,16 +1124,21 @@ core-java-modules/core-java-networking-3 core-java-modules/core-java-strings core-java-modules/core-java-httpclient - custom-pmd + spring-aop + spring-aop-2 + + custom-pmd spring-core-6 data-structures ddd-contexts deeplearning4j + jmeter docker-modules guava-modules apache-httpclient-2 kubernetes-modules/kubernetes-spring libraries-concurrency + libraries-testing maven-modules/compiler-plugin-java-9 maven-modules/maven-generate-war maven-modules/multimodulemavenproject @@ -1143,8 +1155,12 @@ spring-swagger-codegen/custom-validations-opeanpi-codegen testing-modules/testing-assertions persistence-modules/fauna + + rule-engines-modules + reactive-systems rxjava-modules + lightrun tablesaw geotools @@ -1261,7 +1277,8 @@ UTF-8 11 - 11 + 11 + 11 diff --git a/rule-engines-modules/easy-rules/pom.xml b/rule-engines-modules/easy-rules/pom.xml index c8e875944c..6f43307e89 100644 --- a/rule-engines-modules/easy-rules/pom.xml +++ b/rule-engines-modules/easy-rules/pom.xml @@ -23,7 +23,7 @@ - 3.0.0 + 4.1.0 \ No newline at end of file diff --git a/rule-engines-modules/evrete/pom.xml b/rule-engines-modules/evrete/pom.xml index d94da2853f..5b7f195722 100644 --- a/rule-engines-modules/evrete/pom.xml +++ b/rule-engines-modules/evrete/pom.xml @@ -30,7 +30,7 @@ - 2.1.04 + 3.0.01 \ No newline at end of file diff --git a/rule-engines-modules/openl-tablets/pom.xml b/rule-engines-modules/openl-tablets/pom.xml index 204efce6c5..a24e06c44d 100644 --- a/rule-engines-modules/openl-tablets/pom.xml +++ b/rule-engines-modules/openl-tablets/pom.xml @@ -28,7 +28,7 @@ - 5.19.4 + 5.26.5 \ No newline at end of file diff --git a/rule-engines-modules/rulebook/pom.xml b/rule-engines-modules/rulebook/pom.xml index 55e312289e..88feb148e2 100644 --- a/rule-engines-modules/rulebook/pom.xml +++ b/rule-engines-modules/rulebook/pom.xml @@ -23,7 +23,7 @@ - 0.6.2 + 0.12 \ No newline at end of file diff --git a/spring-aop-2/pom.xml b/spring-aop-2/pom.xml index 76e4780e72..cb84ed4ca2 100644 --- a/spring-aop-2/pom.xml +++ b/spring-aop-2/pom.xml @@ -39,8 +39,22 @@ + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + false + + + + + - 1.11 + 1.14.0 + 3.3.2 \ No newline at end of file diff --git a/spring-aop/pom.xml b/spring-aop/pom.xml index 0d48c479ca..ae5ab5fce1 100644 --- a/spring-aop/pom.xml +++ b/spring-aop/pom.xml @@ -69,11 +69,20 @@ + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + false + + - 1.11 + 1.14.0 + 3.3.2 \ No newline at end of file From b8bea1489d2d78631bebe7d6e101fdebe4a493c3 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 23 Feb 2023 18:53:46 +0200 Subject: [PATCH 518/592] [JAVA-18408] Comment out axon module (#13527) --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1efdb44fa0..9ef2b0df97 100644 --- a/pom.xml +++ b/pom.xml @@ -958,7 +958,7 @@ asm atomikos atomix - axon + bazel code-generation @@ -1183,7 +1183,7 @@ asm atomikos atomix - axon + bazel code-generation From 373f969aa521f5b444af30dc6c12ad0d2cb93db1 Mon Sep 17 00:00:00 2001 From: timis1 Date: Thu, 23 Feb 2023 19:01:37 +0200 Subject: [PATCH 519/592] JAVA-18133 Fix wrong indentation --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index c8b6d2833e..49b862a723 100644 --- a/pom.xml +++ b/pom.xml @@ -900,7 +900,7 @@ core-java-modules/core-java-networking-3 core-java-modules/core-java-strings core-java-modules/core-java-httpclient - custom-pmd + custom-pmd spring-core-6 data-structures ddd-contexts @@ -1125,7 +1125,7 @@ core-java-modules/core-java-httpclient spring-aop spring-aop-2 - custom-pmd + custom-pmd spring-core-6 data-structures ddd-contexts From 0560ac2d9dbb3eac94cce1fa2196d1f9276f7868 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 23 Feb 2023 19:11:06 +0200 Subject: [PATCH 520/592] [JAVA-16398] Removed duplicate dependency (#13522) --- geotools/pom.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/geotools/pom.xml b/geotools/pom.xml index 6edb344c8c..f17b4cc5da 100644 --- a/geotools/pom.xml +++ b/geotools/pom.xml @@ -39,13 +39,6 @@ gt-swing ${geotools-swing.version} - - org.locationtech.jts - jts-core - 1.19.0 - - - From 73a6c2c8326982d0206221f2fa887ca98a0f1132 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 23 Feb 2023 19:12:26 +0200 Subject: [PATCH 521/592] =?UTF-8?q?[JAVA-18754]=20Upgraded=20to=20the=20la?= =?UTF-8?q?test=20version=20of=20commons-csv=20+=20Replaced=E2=80=A6=20(#1?= =?UTF-8?q?3496)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [JAVA-18754] Upgraded to the latest version of commons-csv + Replaced deprecated method * [JAVA-18754] Removed setUp method --- libraries-apache-commons-io/pom.xml | 2 +- .../io/csv/CSVReaderWriterUnitTest.java | 54 +++++++++++++++---- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/libraries-apache-commons-io/pom.xml b/libraries-apache-commons-io/pom.xml index b45572ddad..7cac50a8e2 100644 --- a/libraries-apache-commons-io/pom.xml +++ b/libraries-apache-commons-io/pom.xml @@ -26,7 +26,7 @@ - 1.9.0 + 1.10.0 \ No newline at end of file diff --git a/libraries-apache-commons-io/src/test/java/com/baeldung/commons/io/csv/CSVReaderWriterUnitTest.java b/libraries-apache-commons-io/src/test/java/com/baeldung/commons/io/csv/CSVReaderWriterUnitTest.java index b99f4e8bc3..b37613e962 100644 --- a/libraries-apache-commons-io/src/test/java/com/baeldung/commons/io/csv/CSVReaderWriterUnitTest.java +++ b/libraries-apache-commons-io/src/test/java/com/baeldung/commons/io/csv/CSVReaderWriterUnitTest.java @@ -1,9 +1,11 @@ package com.baeldung.commons.io.csv; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; + import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVPrinter; import org.apache.commons.csv.CSVRecord; -import org.junit.Test; import java.io.FileReader; import java.io.IOException; @@ -13,9 +15,7 @@ import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; -import static org.junit.Assert.assertEquals; - -public class CSVReaderWriterUnitTest { +class CSVReaderWriterUnitTest { public static final Map AUTHOR_BOOK_MAP = Collections.unmodifiableMap(new LinkedHashMap() { { @@ -24,12 +24,24 @@ public class CSVReaderWriterUnitTest { } }); public static final String[] HEADERS = { "author", "title" }; + + enum BookHeaders{ + author, title + } + public static final String EXPECTED_FILESTREAM = "author,title\r\n" + "Dan Simmons,Hyperion\r\n" + "Douglas Adams,The Hitchhiker's Guide to the Galaxy"; @Test - public void givenCSVFile_whenRead_thenContentsAsExpected() throws IOException { + void givenCSVFile_whenReadWithArrayHeader_thenContentsAsExpected() throws IOException { Reader in = new FileReader("src/test/resources/book.csv"); - Iterable records = CSVFormat.DEFAULT.withHeader(HEADERS).withFirstRecordAsHeader().parse(in); + + CSVFormat csvFormat = CSVFormat.DEFAULT.builder() + .setHeader(HEADERS) + .setSkipHeaderRecord(true) + .build(); + + Iterable records = csvFormat.parse(in); + for (CSVRecord record : records) { String author = record.get("author"); String title = record.get("title"); @@ -38,9 +50,32 @@ public class CSVReaderWriterUnitTest { } @Test - public void givenAuthorBookMap_whenWrittenToStream_thenOutputStreamAsExpected() throws IOException { + void givenCSVFile_whenReadWithEnumHeader_thenContentsAsExpected() throws IOException { + Reader in = new FileReader("src/test/resources/book.csv"); + + CSVFormat csvFormat = CSVFormat.DEFAULT.builder() + .setHeader(BookHeaders.class) + .setSkipHeaderRecord(true) + .build(); + + Iterable records = csvFormat.parse(in); + + for (CSVRecord record : records) { + String author = record.get(BookHeaders.author); + String title = record.get(BookHeaders.title); + assertEquals(AUTHOR_BOOK_MAP.get(author), title); + } + } + + @Test + void givenAuthorBookMap_whenWrittenToStream_thenOutputStreamAsExpected() throws IOException { StringWriter sw = new StringWriter(); - try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withHeader(HEADERS))) { + + CSVFormat csvFormat = CSVFormat.DEFAULT.builder() + .setHeader(BookHeaders.class) + .build(); + + try (final CSVPrinter printer = new CSVPrinter(sw, csvFormat)) { AUTHOR_BOOK_MAP.forEach((author, title) -> { try { printer.printRecord(author, title); @@ -49,7 +84,8 @@ public class CSVReaderWriterUnitTest { } }); } - assertEquals(EXPECTED_FILESTREAM, sw.toString().trim()); + assertEquals(EXPECTED_FILESTREAM, sw.toString() + .trim()); } } From 3f9b886367647c8d2c2ee823fa754773115c845a Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 24 Feb 2023 12:56:20 +0530 Subject: [PATCH 522/592] JAVA-15014 Renamed httpclient4 to apache-httpclient4 (#13516) --- {httpclient4 => apache-httpclient4}/.gitignore | 0 {httpclient4 => apache-httpclient4}/README.md | 2 +- {httpclient4 => apache-httpclient4}/pom.xml | 4 ++-- .../com/baeldung/basic/MyBasicAuthenticationEntryPoint.java | 0 .../HttpComponentsClientHttpRequestFactoryBasicAuth.java | 0 .../main/java/com/baeldung/client/RestTemplateFactory.java | 0 .../main/java/com/baeldung/client/spring/ClientConfig.java | 0 .../src/main/java/com/baeldung/filter/CustomFilter.java | 0 .../baeldung/filter/CustomWebSecurityConfigurerAdapter.java | 0 .../MySavedRequestAwareAuthenticationSuccessHandler.java | 0 .../com/baeldung/security/RestAuthenticationEntryPoint.java | 0 .../src/main/java/com/baeldung/spring/SecSecurityConfig.java | 0 .../src/main/java/com/baeldung/spring/WebConfig.java | 0 .../main/java/com/baeldung/web/controller/BarController.java | 0 .../main/java/com/baeldung/web/controller/FooController.java | 0 .../src/main/java/com/baeldung/web/dto/Bar.java | 0 .../src/main/java/com/baeldung/web/dto/Foo.java | 0 .../src/main/resources/logback.xml | 0 .../src/main/resources/webSecurityConfig.xml | 0 .../src/main/webapp/WEB-INF/api-servlet.xml | 0 .../src/main/webapp/WEB-INF/web.xml | 0 .../src/test/java/com/baeldung/client/ClientLiveTest.java | 0 .../java/com/baeldung/client/RestClientV4LiveManualTest.java | 0 .../com/baeldung/httpclient/HttpClientHeaderV4LiveTest.java | 0 .../com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java | 0 .../com/baeldung/httpclient/HttpsClientV4SslLiveTest.java | 0 .../src/test/java/com/baeldung/httpclient/ResponseUtil.java | 0 .../src/test/resources/.gitignore | 0 .../src/test/resources/test.in | 0 pom.xml | 4 ++-- 30 files changed, 5 insertions(+), 5 deletions(-) rename {httpclient4 => apache-httpclient4}/.gitignore (100%) rename {httpclient4 => apache-httpclient4}/README.md (96%) rename {httpclient4 => apache-httpclient4}/pom.xml (99%) rename {httpclient4 => apache-httpclient4}/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java (100%) rename {httpclient4 => apache-httpclient4}/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java (100%) rename {httpclient4 => apache-httpclient4}/src/main/java/com/baeldung/client/RestTemplateFactory.java (100%) rename {httpclient4 => apache-httpclient4}/src/main/java/com/baeldung/client/spring/ClientConfig.java (100%) rename {httpclient4 => apache-httpclient4}/src/main/java/com/baeldung/filter/CustomFilter.java (100%) rename {httpclient4 => apache-httpclient4}/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java (100%) rename {httpclient4 => apache-httpclient4}/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java (100%) rename {httpclient4 => apache-httpclient4}/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java (100%) rename {httpclient4 => apache-httpclient4}/src/main/java/com/baeldung/spring/SecSecurityConfig.java (100%) rename {httpclient4 => apache-httpclient4}/src/main/java/com/baeldung/spring/WebConfig.java (100%) rename {httpclient4 => apache-httpclient4}/src/main/java/com/baeldung/web/controller/BarController.java (100%) rename {httpclient4 => apache-httpclient4}/src/main/java/com/baeldung/web/controller/FooController.java (100%) rename {httpclient4 => apache-httpclient4}/src/main/java/com/baeldung/web/dto/Bar.java (100%) rename {httpclient4 => apache-httpclient4}/src/main/java/com/baeldung/web/dto/Foo.java (100%) rename {httpclient4 => apache-httpclient4}/src/main/resources/logback.xml (100%) rename {httpclient4 => apache-httpclient4}/src/main/resources/webSecurityConfig.xml (100%) rename {httpclient4 => apache-httpclient4}/src/main/webapp/WEB-INF/api-servlet.xml (100%) rename {httpclient4 => apache-httpclient4}/src/main/webapp/WEB-INF/web.xml (100%) rename {httpclient4 => apache-httpclient4}/src/test/java/com/baeldung/client/ClientLiveTest.java (100%) rename {httpclient4 => apache-httpclient4}/src/test/java/com/baeldung/client/RestClientV4LiveManualTest.java (100%) rename {httpclient4 => apache-httpclient4}/src/test/java/com/baeldung/httpclient/HttpClientHeaderV4LiveTest.java (100%) rename {httpclient4 => apache-httpclient4}/src/test/java/com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java (100%) rename {httpclient4 => apache-httpclient4}/src/test/java/com/baeldung/httpclient/HttpsClientV4SslLiveTest.java (100%) rename {httpclient4 => apache-httpclient4}/src/test/java/com/baeldung/httpclient/ResponseUtil.java (100%) rename {httpclient4 => apache-httpclient4}/src/test/resources/.gitignore (100%) rename {httpclient4 => apache-httpclient4}/src/test/resources/test.in (100%) diff --git a/httpclient4/.gitignore b/apache-httpclient4/.gitignore similarity index 100% rename from httpclient4/.gitignore rename to apache-httpclient4/.gitignore diff --git a/httpclient4/README.md b/apache-httpclient4/README.md similarity index 96% rename from httpclient4/README.md rename to apache-httpclient4/README.md index 445db1108b..25791d05e6 100644 --- a/httpclient4/README.md +++ b/apache-httpclient4/README.md @@ -1,4 +1,4 @@ -## Apache HttpClient +## Apache HttpClient 4 This module contains articles about Apache HttpClient 4.5 diff --git a/httpclient4/pom.xml b/apache-httpclient4/pom.xml similarity index 99% rename from httpclient4/pom.xml rename to apache-httpclient4/pom.xml index 8f896283b3..6b449e3be1 100644 --- a/httpclient4/pom.xml +++ b/apache-httpclient4/pom.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - httpclient4 + apache-httpclient4 0.1-SNAPSHOT - httpclient4 + apache-httpclient4 war diff --git a/httpclient4/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java b/apache-httpclient4/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java similarity index 100% rename from httpclient4/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java rename to apache-httpclient4/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java diff --git a/httpclient4/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java b/apache-httpclient4/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java similarity index 100% rename from httpclient4/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java rename to apache-httpclient4/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java diff --git a/httpclient4/src/main/java/com/baeldung/client/RestTemplateFactory.java b/apache-httpclient4/src/main/java/com/baeldung/client/RestTemplateFactory.java similarity index 100% rename from httpclient4/src/main/java/com/baeldung/client/RestTemplateFactory.java rename to apache-httpclient4/src/main/java/com/baeldung/client/RestTemplateFactory.java diff --git a/httpclient4/src/main/java/com/baeldung/client/spring/ClientConfig.java b/apache-httpclient4/src/main/java/com/baeldung/client/spring/ClientConfig.java similarity index 100% rename from httpclient4/src/main/java/com/baeldung/client/spring/ClientConfig.java rename to apache-httpclient4/src/main/java/com/baeldung/client/spring/ClientConfig.java diff --git a/httpclient4/src/main/java/com/baeldung/filter/CustomFilter.java b/apache-httpclient4/src/main/java/com/baeldung/filter/CustomFilter.java similarity index 100% rename from httpclient4/src/main/java/com/baeldung/filter/CustomFilter.java rename to apache-httpclient4/src/main/java/com/baeldung/filter/CustomFilter.java diff --git a/httpclient4/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java b/apache-httpclient4/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java similarity index 100% rename from httpclient4/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java rename to apache-httpclient4/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java diff --git a/httpclient4/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java b/apache-httpclient4/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java similarity index 100% rename from httpclient4/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java rename to apache-httpclient4/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java diff --git a/httpclient4/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java b/apache-httpclient4/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java similarity index 100% rename from httpclient4/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java rename to apache-httpclient4/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java diff --git a/httpclient4/src/main/java/com/baeldung/spring/SecSecurityConfig.java b/apache-httpclient4/src/main/java/com/baeldung/spring/SecSecurityConfig.java similarity index 100% rename from httpclient4/src/main/java/com/baeldung/spring/SecSecurityConfig.java rename to apache-httpclient4/src/main/java/com/baeldung/spring/SecSecurityConfig.java diff --git a/httpclient4/src/main/java/com/baeldung/spring/WebConfig.java b/apache-httpclient4/src/main/java/com/baeldung/spring/WebConfig.java similarity index 100% rename from httpclient4/src/main/java/com/baeldung/spring/WebConfig.java rename to apache-httpclient4/src/main/java/com/baeldung/spring/WebConfig.java diff --git a/httpclient4/src/main/java/com/baeldung/web/controller/BarController.java b/apache-httpclient4/src/main/java/com/baeldung/web/controller/BarController.java similarity index 100% rename from httpclient4/src/main/java/com/baeldung/web/controller/BarController.java rename to apache-httpclient4/src/main/java/com/baeldung/web/controller/BarController.java diff --git a/httpclient4/src/main/java/com/baeldung/web/controller/FooController.java b/apache-httpclient4/src/main/java/com/baeldung/web/controller/FooController.java similarity index 100% rename from httpclient4/src/main/java/com/baeldung/web/controller/FooController.java rename to apache-httpclient4/src/main/java/com/baeldung/web/controller/FooController.java diff --git a/httpclient4/src/main/java/com/baeldung/web/dto/Bar.java b/apache-httpclient4/src/main/java/com/baeldung/web/dto/Bar.java similarity index 100% rename from httpclient4/src/main/java/com/baeldung/web/dto/Bar.java rename to apache-httpclient4/src/main/java/com/baeldung/web/dto/Bar.java diff --git a/httpclient4/src/main/java/com/baeldung/web/dto/Foo.java b/apache-httpclient4/src/main/java/com/baeldung/web/dto/Foo.java similarity index 100% rename from httpclient4/src/main/java/com/baeldung/web/dto/Foo.java rename to apache-httpclient4/src/main/java/com/baeldung/web/dto/Foo.java diff --git a/httpclient4/src/main/resources/logback.xml b/apache-httpclient4/src/main/resources/logback.xml similarity index 100% rename from httpclient4/src/main/resources/logback.xml rename to apache-httpclient4/src/main/resources/logback.xml diff --git a/httpclient4/src/main/resources/webSecurityConfig.xml b/apache-httpclient4/src/main/resources/webSecurityConfig.xml similarity index 100% rename from httpclient4/src/main/resources/webSecurityConfig.xml rename to apache-httpclient4/src/main/resources/webSecurityConfig.xml diff --git a/httpclient4/src/main/webapp/WEB-INF/api-servlet.xml b/apache-httpclient4/src/main/webapp/WEB-INF/api-servlet.xml similarity index 100% rename from httpclient4/src/main/webapp/WEB-INF/api-servlet.xml rename to apache-httpclient4/src/main/webapp/WEB-INF/api-servlet.xml diff --git a/httpclient4/src/main/webapp/WEB-INF/web.xml b/apache-httpclient4/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from httpclient4/src/main/webapp/WEB-INF/web.xml rename to apache-httpclient4/src/main/webapp/WEB-INF/web.xml diff --git a/httpclient4/src/test/java/com/baeldung/client/ClientLiveTest.java b/apache-httpclient4/src/test/java/com/baeldung/client/ClientLiveTest.java similarity index 100% rename from httpclient4/src/test/java/com/baeldung/client/ClientLiveTest.java rename to apache-httpclient4/src/test/java/com/baeldung/client/ClientLiveTest.java diff --git a/httpclient4/src/test/java/com/baeldung/client/RestClientV4LiveManualTest.java b/apache-httpclient4/src/test/java/com/baeldung/client/RestClientV4LiveManualTest.java similarity index 100% rename from httpclient4/src/test/java/com/baeldung/client/RestClientV4LiveManualTest.java rename to apache-httpclient4/src/test/java/com/baeldung/client/RestClientV4LiveManualTest.java diff --git a/httpclient4/src/test/java/com/baeldung/httpclient/HttpClientHeaderV4LiveTest.java b/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientHeaderV4LiveTest.java similarity index 100% rename from httpclient4/src/test/java/com/baeldung/httpclient/HttpClientHeaderV4LiveTest.java rename to apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientHeaderV4LiveTest.java diff --git a/httpclient4/src/test/java/com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java b/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java similarity index 100% rename from httpclient4/src/test/java/com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java rename to apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpClientTimeoutV4LiveTest.java diff --git a/httpclient4/src/test/java/com/baeldung/httpclient/HttpsClientV4SslLiveTest.java b/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpsClientV4SslLiveTest.java similarity index 100% rename from httpclient4/src/test/java/com/baeldung/httpclient/HttpsClientV4SslLiveTest.java rename to apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpsClientV4SslLiveTest.java diff --git a/httpclient4/src/test/java/com/baeldung/httpclient/ResponseUtil.java b/apache-httpclient4/src/test/java/com/baeldung/httpclient/ResponseUtil.java similarity index 100% rename from httpclient4/src/test/java/com/baeldung/httpclient/ResponseUtil.java rename to apache-httpclient4/src/test/java/com/baeldung/httpclient/ResponseUtil.java diff --git a/httpclient4/src/test/resources/.gitignore b/apache-httpclient4/src/test/resources/.gitignore similarity index 100% rename from httpclient4/src/test/resources/.gitignore rename to apache-httpclient4/src/test/resources/.gitignore diff --git a/httpclient4/src/test/resources/test.in b/apache-httpclient4/src/test/resources/test.in similarity index 100% rename from httpclient4/src/test/resources/test.in rename to apache-httpclient4/src/test/resources/test.in diff --git a/pom.xml b/pom.xml index 9ef2b0df97..79ab649cea 100644 --- a/pom.xml +++ b/pom.xml @@ -349,7 +349,7 @@ apache-httpclient - httpclient4 + apache-httpclient4 jackson-modules @@ -604,7 +604,7 @@ apache-httpclient - httpclient4 + apache-httpclient4 jackson-modules From b26d2b693201f00e2bbd9f85bedc5b815d479b50 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Feb 2023 19:08:29 +0800 Subject: [PATCH 523/592] Update README.md [skip ci] --- core-java-modules/core-java-lang-oop-constructors/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-oop-constructors/README.md b/core-java-modules/core-java-lang-oop-constructors/README.md index a552a79721..2f414c6bf5 100644 --- a/core-java-modules/core-java-lang-oop-constructors/README.md +++ b/core-java-modules/core-java-lang-oop-constructors/README.md @@ -12,3 +12,4 @@ This module contains article about constructors in Java - [Java Implicit Super Constructor is Undefined Error](https://www.baeldung.com/java-implicit-super-constructor-is-undefined-error) - [Constructor Specification in Java](https://www.baeldung.com/java-constructor-specification) - [Static vs. Instance Initializer Block in Java](https://www.baeldung.com/java-static-instance-initializer-blocks) +- [Accessing Private Constructor in Java](https://www.baeldung.com/java-private-constructor-access) From 25e159150f0c46b154a6476eb29711b34eddf1cf Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Feb 2023 19:11:49 +0800 Subject: [PATCH 524/592] 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 477f37e00a..46480c6b01 100644 --- a/core-java-modules/core-java-concurrency-basic-3/README.md +++ b/core-java-modules/core-java-concurrency-basic-3/README.md @@ -5,4 +5,5 @@ This module contains articles about basic Java concurrency. ### Relevant Articles: - [How to Handle InterruptedException in Java](https://www.baeldung.com/java-interrupted-exception) +- [Thread.sleep() vs Awaitility.await()](https://www.baeldung.com/java-thread-sleep-vs-awaitility-await) - [[<-- Prev]](../core-java-concurrency-basic-2) From e6f03563c95c3247992e40af36f2edb7d925c750 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Feb 2023 19:15:33 +0800 Subject: [PATCH 525/592] Update README.md [skip ci] --- core-java-modules/core-java-streams-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-streams-4/README.md b/core-java-modules/core-java-streams-4/README.md index 67b16ac153..c6717ec5fe 100644 --- a/core-java-modules/core-java-streams-4/README.md +++ b/core-java-modules/core-java-streams-4/README.md @@ -9,3 +9,4 @@ - [Stream to Iterable in Java](https://www.baeldung.com/java-stream-to-iterable) - [Understanding the Difference Between Stream.of() and IntStream.range()](https://www.baeldung.com/java-stream-of-and-intstream-range) - [Check if Object Is an Array in Java](https://www.baeldung.com/java-check-if-object-is-an-array) +- [Mapping an Array of Integers to Strings Using Java Streams](https://www.baeldung.com/java-stream-integer-array-to-strings) From 8ca6e679b1d6a57760d686354d497e1a3156d416 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Feb 2023 19:18:00 +0800 Subject: [PATCH 526/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-conversions-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-conversions-2/README.md b/core-java-modules/core-java-collections-conversions-2/README.md index 742b52aad5..904e876032 100644 --- a/core-java-modules/core-java-collections-conversions-2/README.md +++ b/core-java-modules/core-java-collections-conversions-2/README.md @@ -10,4 +10,5 @@ This module contains articles about conversions among Collection types and array - [Arrays.asList vs new ArrayList(Arrays.asList())](https://www.baeldung.com/java-arrays-aslist-vs-new-arraylist) - [Iterate Over a Set in Java](https://www.baeldung.com/java-iterate-set) - [Convert a List of Integers to a List of Strings](https://www.baeldung.com/java-convert-list-integers-to-list-strings) +- [Combining Two Lists Into a Map in Java](https://www.baeldung.com/java-combine-two-lists-into-map) - More articles: [[<-- prev]](../core-java-collections-conversions) From 72eeac46feeb3cfe910e66ee6d5ee4addc856590 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Feb 2023 19:20:13 +0800 Subject: [PATCH 527/592] Create README.md [skip ci] --- persistence-modules/rethinkdb/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 persistence-modules/rethinkdb/README.md diff --git a/persistence-modules/rethinkdb/README.md b/persistence-modules/rethinkdb/README.md new file mode 100644 index 0000000000..e8cf1415e7 --- /dev/null +++ b/persistence-modules/rethinkdb/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Getting Started With RethinkDB](https://www.baeldung.com/rethinkdb) From 941d8dbc7d994c567098e3b6d6ee5a2d7dec8a3b Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Feb 2023 19:22:20 +0800 Subject: [PATCH 528/592] 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 9f39b0289f..1af860b7c4 100644 --- a/core-java-modules/core-java-17/README.md +++ b/core-java-modules/core-java-17/README.md @@ -6,3 +6,4 @@ - [New Features in Java 17](https://www.baeldung.com/java-17-new-features) - [Random Number Generators in Java 17](https://www.baeldung.com/java-17-random-number-generators) - [Sealed Classes and Interfaces in Java](https://www.baeldung.com/java-sealed-classes-interfaces) +- [Migrate From Java 8 to Java 17](https://www.baeldung.com/java-migrate-8-to-17) From 9a0a3f3b8c4920981414fdc9ddc83c382e0bc0dc Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Feb 2023 19:25:01 +0800 Subject: [PATCH 529/592] Update README.md [skip ci] --- core-java-modules/core-java-8-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-8-2/README.md b/core-java-modules/core-java-8-2/README.md index c0bc63f21f..cad4a4f1fa 100644 --- a/core-java-modules/core-java-8-2/README.md +++ b/core-java-modules/core-java-8-2/README.md @@ -10,4 +10,5 @@ This module contains articles about Java 8 core features - [Interface With Default Methods vs Abstract Class](https://www.baeldung.com/java-interface-default-method-vs-abstract-class) - [Convert Between Byte Array and UUID in Java](https://www.baeldung.com/java-byte-array-to-uuid) - [Create a Simple “Rock-Paper-Scissors” Game in Java](https://www.baeldung.com/java-rock-paper-scissors) +- [VarArgs vs Array Input Parameters in Java](https://www.baeldung.com/varargs-vs-array) - [[<-- Prev]](/core-java-modules/core-java-8) From c63b57c6b34992a683f9bb76eb5966ac89b7419e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Feb 2023 19:28:19 +0800 Subject: [PATCH 530/592] Update README.md [skip ci] --- persistence-modules/spring-data-cassandra-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-data-cassandra-2/README.md b/persistence-modules/spring-data-cassandra-2/README.md index f5cf20b8a9..3f49d6ae93 100644 --- a/persistence-modules/spring-data-cassandra-2/README.md +++ b/persistence-modules/spring-data-cassandra-2/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: - [Using Test Containers With Spring Data Cassandra](https://www.baeldung.com/spring-data-cassandra-test-containers) +- [Cassandra – Object Mapping with DataStax Java Driver](https://www.baeldung.com/cassandra-object-mapping-datastax-java-driver) From c2c2a22d095da3c15f412d1b6f5cc6528bc0e4f7 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Feb 2023 19:30:32 +0800 Subject: [PATCH 531/592] Update README.md [skip ci] --- persistence-modules/hibernate-queries/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate-queries/README.md b/persistence-modules/hibernate-queries/README.md index f5cba1aa6f..9e6c52d6dc 100644 --- a/persistence-modules/hibernate-queries/README.md +++ b/persistence-modules/hibernate-queries/README.md @@ -12,3 +12,4 @@ This module contains articles about use of Queries in Hibernate. - [Hibernate’s addScalar() Method](https://www.baeldung.com/hibernate-addscalar) - [Distinct Queries in HQL](https://www.baeldung.com/java-hql-distinct) - [JPA and Hibernate – Criteria vs. JPQL vs. HQL Query](https://www.baeldung.com/jpql-hql-criteria-query) +- [Database Keywords as Columns in Hibernate Entities](https://www.baeldung.com/java-hibernate-db-keywords-as-columns) From aeaa4beb842cc01dcc30c4db46d1177a07eb0986 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Feb 2023 19:35:00 +0800 Subject: [PATCH 532/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-5/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-collections-5/README.md b/core-java-modules/core-java-collections-5/README.md index cf479ec507..0d9b12b842 100644 --- a/core-java-modules/core-java-collections-5/README.md +++ b/core-java-modules/core-java-collections-5/README.md @@ -3,5 +3,5 @@ ## Core Java Collections Cookbooks and Examples ### Relevant Articles: - -- More articles: [[<-- prev]](/core-java-modules/core-java-collections-4) \ No newline at end of file +- [Introduction to Roaring Bitmap](https://www.baeldung.com/java-roaring-bitmap-intro) +- More articles: [[<-- prev]](/core-java-modules/core-java-collections-4) From c7bba3900e6c8941d42f65d46b2b7021e2c2a873 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Feb 2023 19:37:14 +0800 Subject: [PATCH 533/592] Update README.md [skip ci] --- spring-boot-modules/spring-boot-swagger-2/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-swagger-2/README.md b/spring-boot-modules/spring-boot-swagger-2/README.md index 242f3d3385..e5ec236801 100644 --- a/spring-boot-modules/spring-boot-swagger-2/README.md +++ b/spring-boot-modules/spring-boot-swagger-2/README.md @@ -2,4 +2,5 @@ - [Swagger: Specify Two Responses with the Same Response Code](https://www.baeldung.com/swagger-two-responses-one-response-code) - [Specify an Array of Strings as Body Parameters in Swagger](https://www.baeldung.com/swagger-body-array-of-strings) -- [Swagger @ApiParam vs @ApiModelProperty](https://www.baeldung.com/swagger-apiparam-vs-apimodelproperty) \ No newline at end of file +- [Swagger @ApiParam vs @ApiModelProperty](https://www.baeldung.com/swagger-apiparam-vs-apimodelproperty) +- [Map Date Types With OpenAPI Generator](https://www.baeldung.com/openapi-map-date-types) From ae1621f6fd71a7fb4bd40b7e070c096ca65022cb Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Feb 2023 19:39:09 +0800 Subject: [PATCH 534/592] Update README.md [skip ci] --- core-java-modules/core-java-collections-list-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-list-5/README.md b/core-java-modules/core-java-collections-list-5/README.md index 78959e7d5d..d8cd989600 100644 --- a/core-java-modules/core-java-collections-list-5/README.md +++ b/core-java-modules/core-java-collections-list-5/README.md @@ -4,3 +4,4 @@ This module contains articles about the Java List collection ### Relevant Articles: - [Java List Interface](https://www.baeldung.com/java-list-interface) +- [Finding All Duplicates in a List in Java](https://www.baeldung.com/java-list-find-duplicates) From a6330243e7128b640440678ac35ff7fbe2d09eae Mon Sep 17 00:00:00 2001 From: exaucae Date: Fri, 24 Feb 2023 15:49:38 +0000 Subject: [PATCH 535/592] fix: set version properties --- java-panama/pom.xml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/java-panama/pom.xml b/java-panama/pom.xml index ad711d0718..8453a38abd 100644 --- a/java-panama/pom.xml +++ b/java-panama/pom.xml @@ -1,27 +1,30 @@ - 4.0.0 + ${project.model.version} com.baeldung.java.panama java-panama - 1.0-SNAPSHOT + ${project.version} jar java-panama https://maven.apache.org + 4.0.0 UTF-8 + 1.0 19 19 3.10.1 + 5.9.0 org.junit.jupiter junit-jupiter - 5.9.0 + ${junit.jupiter.version} test From d1144a5605aff764af2d2e7b5e8be846f4bdabbe Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 25 Feb 2023 15:06:03 +0530 Subject: [PATCH 536/592] JAVA-18598 Update Intro to Apache Kafka with Spring article --- spring-kafka/pom.xml | 20 +++++++++++++++++-- .../KafkaCountingMessagesComponent.java | 2 +- .../com/baeldung/kafka/ssl/KafkaProducer.java | 11 ++++++---- .../baeldung/kafka/streams/KafkaProducer.java | 11 ++++++---- .../spring/kafka/KafkaApplication.java | 20 +++++++------------ .../KafkaStreamsApplicationLiveTest.java | 2 +- 6 files changed, 41 insertions(+), 25 deletions(-) diff --git a/spring-kafka/pom.xml b/spring-kafka/pom.xml index d51c2e300f..7b0bb0a8b7 100644 --- a/spring-kafka/pom.xml +++ b/spring-kafka/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-3 @@ -61,8 +61,24 @@ awaitility test + + org.apache.commons + commons-lang3 + + + + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.spring.kafka.KafkaApplication + + + + + 1.16.2 diff --git a/spring-kafka/src/main/java/com/baeldung/countingmessages/KafkaCountingMessagesComponent.java b/spring-kafka/src/main/java/com/baeldung/countingmessages/KafkaCountingMessagesComponent.java index 89cd1c8dac..f76be95c1c 100644 --- a/spring-kafka/src/main/java/com/baeldung/countingmessages/KafkaCountingMessagesComponent.java +++ b/spring-kafka/src/main/java/com/baeldung/countingmessages/KafkaCountingMessagesComponent.java @@ -6,7 +6,7 @@ import org.apache.kafka.common.serialization.StringDeserializer; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import java.util.Collections; import java.util.HashMap; import java.util.List; diff --git a/spring-kafka/src/main/java/com/baeldung/kafka/ssl/KafkaProducer.java b/spring-kafka/src/main/java/com/baeldung/kafka/ssl/KafkaProducer.java index 895d437c6b..38ce366355 100644 --- a/spring-kafka/src/main/java/com/baeldung/kafka/ssl/KafkaProducer.java +++ b/spring-kafka/src/main/java/com/baeldung/kafka/ssl/KafkaProducer.java @@ -15,9 +15,12 @@ public class KafkaProducer { public void sendMessage(String message, String topic) { log.info("Producing message: {}", message); kafkaTemplate.send(topic, "key", message) - .addCallback( - result -> log.info("Message sent to topic: {}", message), - ex -> log.error("Failed to send message", ex) - ); + .whenComplete((result, ex) -> { + if (ex == null) { + log.info("Message sent to topic: {}", message); + } else { + log.error("Failed to send message", ex); + } + }); } } diff --git a/spring-kafka/src/main/java/com/baeldung/kafka/streams/KafkaProducer.java b/spring-kafka/src/main/java/com/baeldung/kafka/streams/KafkaProducer.java index 2b8e9bbfbd..664758a052 100644 --- a/spring-kafka/src/main/java/com/baeldung/kafka/streams/KafkaProducer.java +++ b/spring-kafka/src/main/java/com/baeldung/kafka/streams/KafkaProducer.java @@ -15,9 +15,12 @@ public class KafkaProducer { public void sendMessage(String message) { kafkaTemplate.send("input-topic", message) - .addCallback( - result -> log.info("Message sent to topic: {}", message), - ex -> log.error("Failed to send message", ex) - ); + .whenComplete((result, ex) -> { + if (ex == null) { + log.info("Message sent to topic: {}", message); + } else { + log.error("Failed to send message", ex); + } + }); } } diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java index 9b79f716e9..ff2d21668f 100644 --- a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java +++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java @@ -1,5 +1,6 @@ package com.baeldung.spring.kafka; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -16,8 +17,6 @@ import org.springframework.kafka.support.KafkaHeaders; import org.springframework.kafka.support.SendResult; import org.springframework.messaging.handler.annotation.Header; import org.springframework.messaging.handler.annotation.Payload; -import org.springframework.util.concurrent.ListenableFuture; -import org.springframework.util.concurrent.ListenableFutureCallback; @SpringBootApplication public class KafkaApplication { @@ -102,18 +101,13 @@ public class KafkaApplication { public void sendMessage(String message) { - ListenableFuture> future = kafkaTemplate.send(topicName, message); + CompletableFuture> future = kafkaTemplate.send(topicName, message); + future.whenComplete((result, ex) -> { - future.addCallback(new ListenableFutureCallback>() { - - @Override - public void onSuccess(SendResult result) { + if (ex == null) { System.out.println("Sent message=[" + message + "] with offset=[" + result.getRecordMetadata() .offset() + "]"); - } - - @Override - public void onFailure(Throwable ex) { + } else { System.out.println("Unable to send message=[" + message + "] due to : " + ex.getMessage()); } }); @@ -155,13 +149,13 @@ public class KafkaApplication { } @KafkaListener(topics = "${message.topic.name}", containerFactory = "headersKafkaListenerContainerFactory") - public void listenWithHeaders(@Payload String message, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition) { + public void listenWithHeaders(@Payload String message, @Header(KafkaHeaders.RECEIVED_PARTITION) int partition) { System.out.println("Received Message: " + message + " from partition: " + partition); latch.countDown(); } @KafkaListener(topicPartitions = @TopicPartition(topic = "${partitioned.topic.name}", partitions = { "0", "3" }), containerFactory = "partitionsKafkaListenerContainerFactory") - public void listenToPartition(@Payload String message, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition) { + public void listenToPartition(@Payload String message, @Header(KafkaHeaders.RECEIVED_PARTITION) int partition) { System.out.println("Received Message: " + message + " from partition: " + partition); this.partitionLatch.countDown(); } diff --git a/spring-kafka/src/test/java/com/baeldung/kafka/streams/KafkaStreamsApplicationLiveTest.java b/spring-kafka/src/test/java/com/baeldung/kafka/streams/KafkaStreamsApplicationLiveTest.java index 85df8485d2..aee3c2c0dc 100644 --- a/spring-kafka/src/test/java/com/baeldung/kafka/streams/KafkaStreamsApplicationLiveTest.java +++ b/spring-kafka/src/test/java/com/baeldung/kafka/streams/KafkaStreamsApplicationLiveTest.java @@ -20,7 +20,7 @@ import org.junit.jupiter.api.io.TempDir; 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.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; From 3a18a59e6d5ecac86bc95511678d3e1c648a829e Mon Sep 17 00:00:00 2001 From: Saikat Date: Sat, 25 Feb 2023 18:21:59 +0530 Subject: [PATCH 537/592] Dependencies Version update --- .../spring-cloud-open-telemetry1/pom.xml | 29 ++++--------------- .../src/main/resources/application.properties | 2 +- .../spring-cloud-open-telemetry2/pom.xml | 29 ++++--------------- 3 files changed, 13 insertions(+), 47 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/pom.xml b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/pom.xml index 5011590e73..3003113085 100644 --- a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/pom.xml +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/pom.xml @@ -62,12 +62,8 @@ io.opentelemetry - opentelemetry-exporter-otlp-trace - - - io.grpc - grpc-okhttp - ${grpc-okhttp.version} + opentelemetry-exporter-otlp + ${otel-exporter-otlp.version} org.junit.jupiter @@ -93,24 +89,11 @@ - - - spring-milestones - https://repo.spring.io/milestone - - - - - spring-milestones - https://repo.spring.io/milestone - - - - 2.5.7 - 2020.0.4 - 1.0.0-M12 - 1.42.1 + 2.7.9 + 2021.0.5 + 1.1.2 + 1.23.1 \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/resources/application.properties index 1645b6144d..22634c8a8e 100644 --- a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/resources/application.properties +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/resources/application.properties @@ -2,4 +2,4 @@ server.port= 8080 spring.application.name=product-service priceClient.baseUrl=http://price-service:8081 spring.sleuth.otel.config.trace-id-ratio-based=1.0 -spring.sleuth.otel.exporter.otlp.endpoint=http://collector:4317 \ No newline at end of file +#spring.sleuth.otel.exporter.otlp.endpoint=http://collector:4317 \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/pom.xml b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/pom.xml index 2d7ac8204e..4f56cc717e 100644 --- a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/pom.xml +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/pom.xml @@ -61,12 +61,8 @@ io.opentelemetry - opentelemetry-exporter-otlp-trace - - - io.grpc - grpc-okhttp - ${grpc-okhttp.version} + opentelemetry-exporter-otlp + ${otel-exporter-otlp.version} org.junit.jupiter @@ -92,24 +88,11 @@ - - - spring-milestones - https://repo.spring.io/milestone - - - - - spring-milestones - https://repo.spring.io/milestone - - - - 2.5.7 - 2020.0.4 - 1.0.0-M12 - 1.42.1 + 2.7.9 + 2021.0.5 + 1.1.2 + 1.23.1 \ No newline at end of file From c015e438cb44aa04ab6a965f759254070a62bc07 Mon Sep 17 00:00:00 2001 From: Saikat Date: Sat, 25 Feb 2023 18:24:10 +0530 Subject: [PATCH 538/592] Dependencies Version update --- .../src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/resources/application.properties index 22634c8a8e..1645b6144d 100644 --- a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/resources/application.properties +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/src/main/resources/application.properties @@ -2,4 +2,4 @@ server.port= 8080 spring.application.name=product-service priceClient.baseUrl=http://price-service:8081 spring.sleuth.otel.config.trace-id-ratio-based=1.0 -#spring.sleuth.otel.exporter.otlp.endpoint=http://collector:4317 \ No newline at end of file +spring.sleuth.otel.exporter.otlp.endpoint=http://collector:4317 \ No newline at end of file From ce4b70f967b516285dd72ae132b62ddf6dcb6877 Mon Sep 17 00:00:00 2001 From: Saikat Date: Sat, 25 Feb 2023 18:41:35 +0530 Subject: [PATCH 539/592] OpenTelemetry docker version upgrade --- .../spring-cloud-open-telemetry/docker-compose.yml | 2 +- .../spring-cloud-open-telemetry/otel-config.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/docker-compose.yml b/spring-cloud-modules/spring-cloud-open-telemetry/docker-compose.yml index 8a6833095c..7ee2f67c0f 100644 --- a/spring-cloud-modules/spring-cloud-open-telemetry/docker-compose.yml +++ b/spring-cloud-modules/spring-cloud-open-telemetry/docker-compose.yml @@ -20,7 +20,7 @@ services: - "14250" collector: - image: otel/opentelemetry-collector:0.47.0 + image: otel/opentelemetry-collector:0.72.0 command: [ "--config=/etc/otel-collector-config.yml" ] volumes: - ./otel-config.yml:/etc/otel-collector-config.yml diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/otel-config.yml b/spring-cloud-modules/spring-cloud-open-telemetry/otel-config.yml index 886c10a1c3..4402603a85 100644 --- a/spring-cloud-modules/spring-cloud-open-telemetry/otel-config.yml +++ b/spring-cloud-modules/spring-cloud-open-telemetry/otel-config.yml @@ -9,7 +9,7 @@ processors: exporters: logging: - logLevel: debug + loglevel: debug jaeger: endpoint: jaeger-service:14250 tls: From 8fd4ad46ea0cf4518d5f558e6482bf1c8c7eb913 Mon Sep 17 00:00:00 2001 From: Shaun Phillips <61982125+ShaPhi7@users.noreply.github.com> Date: Sat, 25 Feb 2023 17:45:16 +0000 Subject: [PATCH 540/592] BAEL-5915 Added different ways to create an object (#13539) --- .../objects/ClonableRabbit.java | 18 ++++ .../objectcreation/objects/Rabbit.java | 17 +++ .../objectcreation/objects/RabbitType.java | 7 ++ .../objects/SerializableRabbit.java | 21 ++++ .../objectcreation/utils/CreateRabbits.java | 71 +++++++++++++ .../objectcreation/CreateRabbitsUnitTest.java | 100 ++++++++++++++++++ 6 files changed, 234 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/ClonableRabbit.java create mode 100644 core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/Rabbit.java create mode 100644 core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/RabbitType.java create mode 100644 core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/SerializableRabbit.java create mode 100644 core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/utils/CreateRabbits.java create mode 100644 core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/objectcreation/CreateRabbitsUnitTest.java diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/ClonableRabbit.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/ClonableRabbit.java new file mode 100644 index 0000000000..0d97e010fb --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/ClonableRabbit.java @@ -0,0 +1,18 @@ +package com.baeldung.objectcreation.objects; + +public class ClonableRabbit implements Cloneable { + + String name = ""; + + public ClonableRabbit(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } +} diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/Rabbit.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/Rabbit.java new file mode 100644 index 0000000000..c8a8159544 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/Rabbit.java @@ -0,0 +1,17 @@ +package com.baeldung.objectcreation.objects; + +public class Rabbit { + + String name = ""; + + public Rabbit() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/RabbitType.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/RabbitType.java new file mode 100644 index 0000000000..b7afe5fe2f --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/RabbitType.java @@ -0,0 +1,7 @@ +package com.baeldung.objectcreation.objects; + +public enum RabbitType { + PET, + TAME, + WILD +} diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/SerializableRabbit.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/SerializableRabbit.java new file mode 100644 index 0000000000..cb5f2d0b71 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/objects/SerializableRabbit.java @@ -0,0 +1,21 @@ +package com.baeldung.objectcreation.objects; + +import java.io.Serializable; + +public class SerializableRabbit implements Serializable { + + private static final long serialVersionUID = 2589844379773087465L; + + String name = ""; + + public SerializableRabbit() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/utils/CreateRabbits.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/utils/CreateRabbits.java new file mode 100644 index 0000000000..8b3c84e89c --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/objectcreation/utils/CreateRabbits.java @@ -0,0 +1,71 @@ +package com.baeldung.objectcreation.utils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.lang.reflect.InvocationTargetException; +import java.util.function.Supplier; + +import com.baeldung.objectcreation.objects.ClonableRabbit; +import com.baeldung.objectcreation.objects.Rabbit; +import com.baeldung.objectcreation.objects.RabbitType; +import com.baeldung.objectcreation.objects.SerializableRabbit; + +public final class CreateRabbits { + + public static Rabbit createRabbitUsingNewOperator() { + Rabbit rabbit = new Rabbit(); + + return rabbit; + } + + public static Rabbit createRabbitUsingClassForName() throws InstantiationException, IllegalAccessException, ClassNotFoundException { + Rabbit rabbit = (Rabbit) Class.forName("com.baeldung.objectcreation.objects.Rabbit").newInstance(); + + return rabbit; + } + + public static Rabbit createRabbitUsingClassNewInstance() throws InstantiationException, IllegalAccessException { + Rabbit rabbit = Rabbit.class.newInstance(); + + return rabbit; + } + + public static Rabbit createRabbitUsingConstructorNewInstance() throws InstantiationException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException, NoSuchMethodException, SecurityException { + Rabbit rabbit = Rabbit.class.getConstructor().newInstance(); + + return rabbit; + } + + public static ClonableRabbit createRabbitUsingClone(ClonableRabbit originalRabbit) throws CloneNotSupportedException { + ClonableRabbit clonedRabbit = (ClonableRabbit) originalRabbit.clone(); + + return clonedRabbit; + } + + public static SerializableRabbit createRabbitUsingDeserialization(File file) throws IOException, ClassNotFoundException { + try (FileInputStream fis = new FileInputStream(file); + ObjectInputStream ois = new ObjectInputStream(fis);) { + return (SerializableRabbit) ois.readObject(); + } + } + + public static Rabbit createRabbitUsingSupplier() { + Supplier rabbitSupplier = Rabbit::new; + Rabbit rabbit = rabbitSupplier.get(); + + return rabbit; + } + + public static Rabbit[] createRabbitArray() { + Rabbit[] rabbitArray = new Rabbit[10]; + + return rabbitArray; + } + + public static RabbitType createRabbitTypeEnum() { + return RabbitType.PET; //any RabbitType could be returned here, PET is just an example. + } +} diff --git a/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/objectcreation/CreateRabbitsUnitTest.java b/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/objectcreation/CreateRabbitsUnitTest.java new file mode 100644 index 0000000000..653beba096 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/objectcreation/CreateRabbitsUnitTest.java @@ -0,0 +1,100 @@ +package com.baeldung.objectcreation; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.lang.reflect.InvocationTargetException; + +import org.junit.Test; + +import com.baeldung.objectcreation.objects.ClonableRabbit; +import com.baeldung.objectcreation.objects.Rabbit; +import com.baeldung.objectcreation.objects.RabbitType; +import com.baeldung.objectcreation.objects.SerializableRabbit; +import com.baeldung.objectcreation.utils.CreateRabbits; + +public class CreateRabbitsUnitTest { + + @Test + public void whenUsingNewOperator_thenRabbitIsReturned() { + assertTrue(CreateRabbits.createRabbitUsingNewOperator() instanceof Rabbit); + } + + @Test + public void whenUsingClassForName_thenRabbitIsReturned() throws InstantiationException, IllegalAccessException, ClassNotFoundException { + assertTrue(CreateRabbits.createRabbitUsingClassForName() instanceof Rabbit); + } + + @Test + public void whenUsingClassNewInstance_thenRabbitIsReturned() throws InstantiationException, IllegalAccessException { + assertTrue(CreateRabbits.createRabbitUsingClassNewInstance() instanceof Rabbit); + } + + @Test + public void whenUsingConstructorNewInstance_thenRabbitIsReturned() throws InstantiationException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException, NoSuchMethodException, SecurityException { + assertTrue(CreateRabbits.createRabbitUsingConstructorNewInstance() instanceof Rabbit); + } + + @Test + public void givenClonableRabbit_whenUsingCloneMethod_thenClonedRabbitIsReturned() throws CloneNotSupportedException { + //given + ClonableRabbit originalRabbit = new ClonableRabbit("Peter"); + + //when + ClonableRabbit clonedRabbit = CreateRabbits.createRabbitUsingClone(originalRabbit); + + //then + assertTrue(clonedRabbit instanceof ClonableRabbit); + assertNotEquals(originalRabbit, clonedRabbit); + assertEquals("Peter", clonedRabbit.getName()); + } + + @Test + public void givenSerializedRabbit_whenDeserializing_thenNewRabbitIsReturned() throws IOException, ClassNotFoundException { + //given + SerializableRabbit originalRabbit = new SerializableRabbit(); + originalRabbit.setName("Peter"); + + File resourcesFolder = new File("src/test/resources"); + resourcesFolder.mkdirs(); //creates the directory in case it doesn't exist + + File file = new File(resourcesFolder, "rabbit.ser"); + + try (FileOutputStream fileOutputStream = new FileOutputStream(file); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);) { + objectOutputStream.writeObject(originalRabbit); + } + + //when + SerializableRabbit newRabbit = CreateRabbits.createRabbitUsingDeserialization(file); + + //then + assertTrue(newRabbit instanceof SerializableRabbit); + assertNotEquals(originalRabbit, newRabbit); + assertEquals("Peter", newRabbit.getName()); + + //clean up + file.delete(); + } + + @Test + public void whenUsingSupplier_thenRabbitIsReturned() { + assertTrue(CreateRabbits.createRabbitUsingSupplier() instanceof Rabbit); + } + + @Test + public void whenUsingArrays_thenRabbitArrayIsReturned() { + assertTrue(CreateRabbits.createRabbitArray() instanceof Rabbit[]); + } + + @Test + public void whenUsingEnums_thenRabbitTypeIsReturned() { + assertTrue(CreateRabbits.createRabbitTypeEnum() instanceof RabbitType); + } +} From a713d96d4da5056c2ebf2881941b26d10c5254ac Mon Sep 17 00:00:00 2001 From: psevestre Date: Sat, 25 Feb 2023 16:46:17 -0300 Subject: [PATCH 541/592] BAEL 6160 (#13519) * [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-5900] Initial commit * [BAEL-5974] Article Code * [BAEL-5974] Article Code * [BAEL-6160] Article code * [BAEL-6160] Tests --------- Co-authored-by: Philippe Sevestre --- .../baeldung/sentry/support/SentryFilter.java | 2 +- .../src/main/resources/sentry.properties | 4 +- spring-security-modules/pom.xml | 1 + .../spring-security-azuread/pom.xml | 76 +++++++++++++++++++ .../security/azuread/Application.java | 14 ++++ .../config/JwtAuthorizationConfiguration.java | 72 ++++++++++++++++++ .../config/JwtAuthorizationProperties.java | 68 +++++++++++++++++ .../azuread/controllers/IndexController.java | 22 ++++++ .../azuread/support/GroupsClaimMapper.java | 61 +++++++++++++++ .../azuread/support/NamedOidcUser.java | 24 ++++++ .../main/resources/application-azuread.yml | 27 +++++++ .../src/main/resources/application.properties | 1 + .../src/main/resources/templates/index.html | 53 +++++++++++++ .../security/azuread/ApplicationLiveTest.java | 62 +++++++++++++++ .../support/GroupsClaimMapperUnitTest.java | 48 ++++++++++++ 15 files changed, 532 insertions(+), 3 deletions(-) create mode 100644 spring-security-modules/spring-security-azuread/pom.xml create mode 100644 spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/Application.java create mode 100644 spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/config/JwtAuthorizationConfiguration.java create mode 100644 spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/config/JwtAuthorizationProperties.java create mode 100644 spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/controllers/IndexController.java create mode 100644 spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/support/GroupsClaimMapper.java create mode 100644 spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/support/NamedOidcUser.java create mode 100644 spring-security-modules/spring-security-azuread/src/main/resources/application-azuread.yml create mode 100644 spring-security-modules/spring-security-azuread/src/main/resources/application.properties create mode 100644 spring-security-modules/spring-security-azuread/src/main/resources/templates/index.html create mode 100644 spring-security-modules/spring-security-azuread/src/test/java/com/baeldung/security/azuread/ApplicationLiveTest.java create mode 100644 spring-security-modules/spring-security-azuread/src/test/java/com/baeldung/security/azuread/support/GroupsClaimMapperUnitTest.java diff --git a/saas-modules/sentry-servlet/src/main/java/com/baeldung/sentry/support/SentryFilter.java b/saas-modules/sentry-servlet/src/main/java/com/baeldung/sentry/support/SentryFilter.java index e853368ad9..51055f321d 100644 --- a/saas-modules/sentry-servlet/src/main/java/com/baeldung/sentry/support/SentryFilter.java +++ b/saas-modules/sentry-servlet/src/main/java/com/baeldung/sentry/support/SentryFilter.java @@ -21,7 +21,7 @@ public class SentryFilter implements Filter { try { chain.doFilter(request, response); int rc = ((HttpServletResponse) response).getStatus(); - if (rc/100 == 5) { + if (rc / 100 == 5) { Sentry.captureMessage("Application error: code=" + rc, SentryLevel.ERROR); } } catch (Throwable t) { diff --git a/saas-modules/sentry-servlet/src/main/resources/sentry.properties b/saas-modules/sentry-servlet/src/main/resources/sentry.properties index c937874420..cd8b3005dd 100644 --- a/saas-modules/sentry-servlet/src/main/resources/sentry.properties +++ b/saas-modules/sentry-servlet/src/main/resources/sentry.properties @@ -1,3 +1,3 @@ # Sentry configuration file -# put your DSN here -dsn=https://xxxxxxxxxxxxxxxx@zzzzzzz.ingest.sentry.io/wwww \ No newline at end of file +# put your own DSN here. This one is NOT valid !!! +dsn=https://c295098aadd04f719f1c9f50d801f93e@o75061.ingest.sentry.io/4504455033978880 \ No newline at end of file diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml index d6e30e8ab8..223f0894d5 100644 --- a/spring-security-modules/pom.xml +++ b/spring-security-modules/pom.xml @@ -49,6 +49,7 @@ spring-security-web-x509 spring-security-opa spring-security-pkce + spring-security-azuread \ No newline at end of file diff --git a/spring-security-modules/spring-security-azuread/pom.xml b/spring-security-modules/spring-security-azuread/pom.xml new file mode 100644 index 0000000000..c4dbbd14b9 --- /dev/null +++ b/spring-security-modules/spring-security-azuread/pom.xml @@ -0,0 +1,76 @@ + + + + 4.0.0 + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + spring-security-azuread + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-oauth2-client + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + \ No newline at end of file diff --git a/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/Application.java b/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/Application.java new file mode 100644 index 0000000000..ac36bc1328 --- /dev/null +++ b/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/Application.java @@ -0,0 +1,14 @@ +package com.baeldung.security.azuread; + +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-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/config/JwtAuthorizationConfiguration.java b/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/config/JwtAuthorizationConfiguration.java new file mode 100644 index 0000000000..4d82e930ae --- /dev/null +++ b/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/config/JwtAuthorizationConfiguration.java @@ -0,0 +1,72 @@ +package com.baeldung.security.azuread.config; + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +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.core.GrantedAuthority; +import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest; +import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService; +import org.springframework.security.oauth2.client.registration.ClientRegistration.ProviderDetails; +import org.springframework.security.oauth2.client.userinfo.OAuth2UserService; +import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser; +import org.springframework.security.oauth2.core.oidc.user.OidcUser; +import org.springframework.security.web.SecurityFilterChain; + +import com.baeldung.security.azuread.support.GroupsClaimMapper; +import com.baeldung.security.azuread.support.NamedOidcUser; + +@Configuration +@EnableConfigurationProperties(JwtAuthorizationProperties.class) +public class JwtAuthorizationConfiguration { + + + + @Bean + SecurityFilterChain customJwtSecurityChain(HttpSecurity http, JwtAuthorizationProperties props) throws Exception { + // @formatter:off + return http + .authorizeRequests( r -> r.anyRequest().authenticated()) + .oauth2Login(oauth2 -> { + oauth2.userInfoEndpoint(ep -> + ep.oidcUserService(customOidcUserService(props))); + }) + .build(); + // @formatter:on + } + + private OAuth2UserService customOidcUserService(JwtAuthorizationProperties props) { + final OidcUserService delegate = new OidcUserService(); + final GroupsClaimMapper mapper = new GroupsClaimMapper( + props.getAuthoritiesPrefix(), + props.getGroupsClaim(), + props.getGroupToAuthorities()); + + return (userRequest) -> { + OidcUser oidcUser = delegate.loadUser(userRequest); + // Enrich standard authorities with groups + Set mappedAuthorities = new HashSet<>(); + mappedAuthorities.addAll(oidcUser.getAuthorities()); + mappedAuthorities.addAll(mapper.mapAuthorities(oidcUser)); + + oidcUser = new NamedOidcUser(mappedAuthorities, oidcUser.getIdToken(), oidcUser.getUserInfo(),oidcUser.getName()); + + return oidcUser; + }; + } + + + +// @Bean +// GrantedAuthoritiesMapper jwtAuthoritiesMapper(JwtAuthorizationProperties props) { +// return new MappingJwtGrantedAuthoritiesMapper( +// props.getAuthoritiesPrefix(), +// props.getGroupsClaim(), +// props.getGroupToAuthorities()); +// } + + +} diff --git a/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/config/JwtAuthorizationProperties.java b/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/config/JwtAuthorizationProperties.java new file mode 100644 index 0000000000..981be317a3 --- /dev/null +++ b/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/config/JwtAuthorizationProperties.java @@ -0,0 +1,68 @@ +package com.baeldung.security.azuread.config; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author Baeldung + * + */ +@ConfigurationProperties(prefix="baeldung.jwt.authorization") +public class JwtAuthorizationProperties { + + // Claim that has the group list + private String groupsClaim = "groups"; + + private String authoritiesPrefix = "ROLE_"; + + // map groupIds to a list of authorities. + private Map> groupToAuthorities = new HashMap<>(); + + /** + * @return the groupsClaim + */ + public String getGroupsClaim() { + return groupsClaim; + } + + /** + * @param groupsClaim the groupsClaim to set + */ + public void setGroupsClaim(String groupsClaim) { + this.groupsClaim = groupsClaim; + } + + /** + * @return the groupToAuthorities + */ + public Map> getGroupToAuthorities() { + return groupToAuthorities; + } + + /** + * @param groupToAuthorities the groupToAuthorities to set + */ + public void setGroupToAuthorities(Map> groupToAuthorities) { + this.groupToAuthorities = groupToAuthorities; + } + + /** + * @return the authoritiesPrefix + */ + public String getAuthoritiesPrefix() { + return authoritiesPrefix; + } + + /** + * @param authoritiesPrefix the authoritiesPrefix to set + */ + public void setAuthoritiesPrefix(String authoritiesPrefix) { + this.authoritiesPrefix = authoritiesPrefix; + } + + + +} diff --git a/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/controllers/IndexController.java b/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/controllers/IndexController.java new file mode 100644 index 0000000000..d2cebd0231 --- /dev/null +++ b/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/controllers/IndexController.java @@ -0,0 +1,22 @@ +package com.baeldung.security.azuread.controllers; + +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import lombok.extern.slf4j.Slf4j; + +@Controller +@RequestMapping("/") +@Slf4j +public class IndexController { + + @GetMapping + public String index(Model model, Authentication user) { + log.info("GET /: user={}", user); + model.addAttribute("user", user); + return "index"; + } +} diff --git a/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/support/GroupsClaimMapper.java b/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/support/GroupsClaimMapper.java new file mode 100644 index 0000000000..2487cd9db3 --- /dev/null +++ b/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/support/GroupsClaimMapper.java @@ -0,0 +1,61 @@ +/** + * + */ +package com.baeldung.security.azuread.support; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper; +import org.springframework.security.oauth2.core.ClaimAccessor; +import org.springframework.security.oauth2.jwt.Jwt; + +/** + * @author Baeldung + * + */ +public class GroupsClaimMapper { + + private final String authoritiesPrefix; + private final String groupsClaim; + private final Map> groupToAuthorities; + + public GroupsClaimMapper(String authoritiesPrefix, String groupsClaim, Map> groupToAuthorities) { + this.authoritiesPrefix = authoritiesPrefix; + this.groupsClaim = groupsClaim; + this.groupToAuthorities = Collections.unmodifiableMap(groupToAuthorities); + } + + public Collection mapAuthorities(ClaimAccessor source) { + + List groups = source.getClaimAsStringList(groupsClaim); + if ( groups == null || groups.isEmpty()) { + return Collections.emptyList(); + } + + List result = new ArrayList<>(); + for( String g : groups) { + List authNames = groupToAuthorities.get(g); + if ( authNames == null ) { + continue; + } + + List mapped = authNames.stream() + .map( s -> authoritiesPrefix + s) + .map( SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + + result.addAll(mapped); + } + + return result; + } + +} diff --git a/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/support/NamedOidcUser.java b/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/support/NamedOidcUser.java new file mode 100644 index 0000000000..b29b04fe7b --- /dev/null +++ b/spring-security-modules/spring-security-azuread/src/main/java/com/baeldung/security/azuread/support/NamedOidcUser.java @@ -0,0 +1,24 @@ +package com.baeldung.security.azuread.support; + +import java.util.Collection; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.oauth2.core.oidc.OidcIdToken; +import org.springframework.security.oauth2.core.oidc.OidcUserInfo; +import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser; + +public class NamedOidcUser extends DefaultOidcUser { + private static final long serialVersionUID = 1L; + private final String userName; + + public NamedOidcUser(Collection authorities, OidcIdToken idToken, + OidcUserInfo userInfo, String userName) { + super(authorities,idToken,userInfo); + this.userName= userName; + } + + @Override + public String getName() { + return this.userName; + } +} diff --git a/spring-security-modules/spring-security-azuread/src/main/resources/application-azuread.yml b/spring-security-modules/spring-security-azuread/src/main/resources/application-azuread.yml new file mode 100644 index 0000000000..5e65c381c8 --- /dev/null +++ b/spring-security-modules/spring-security-azuread/src/main/resources/application-azuread.yml @@ -0,0 +1,27 @@ +spring: + security: + oauth2: + client: + provider: + azure: + issuer-uri: https://login.microsoftonline.com/2e9fde3a-38ec-44f9-8bcd-c184dc1e8033/v2.0 + user-name-attribute: name + registration: + azure-dev: + provider: azure + #client-id: "6035bfd4-22f0-437c-b76f-da729a916cbf" + #client-secret: "fo28Q~-aLbmQvonnZtzbgtSiqYstmBWEmGPAodmx" + client-id: your-client-id + client-secret: your-secret-id + scope: + - openid + - email + - profile + +# Group mapping +baeldung: + jwt: + authorization: + group-to-authorities: + "ceef656a-fca9-49b6-821b-f7543b7065cb": BAELDUNG_RW + "eaaecb69-ccbc-4143-b111-7dd1ce1d99f1": BAELDUNG_RO,BAELDUNG_ADMIN \ No newline at end of file diff --git a/spring-security-modules/spring-security-azuread/src/main/resources/application.properties b/spring-security-modules/spring-security-azuread/src/main/resources/application.properties new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/spring-security-modules/spring-security-azuread/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/spring-security-modules/spring-security-azuread/src/main/resources/templates/index.html b/spring-security-modules/spring-security-azuread/src/main/resources/templates/index.html new file mode 100644 index 0000000000..ca9a9bdbe8 --- /dev/null +++ b/spring-security-modules/spring-security-azuread/src/main/resources/templates/index.html @@ -0,0 +1,53 @@ + + + + +Insert title here + + + +

    Hello, NOMO_NOMO

    + +

    User info:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AttributeValue
    Nameuser.name
    Classuser.class
    Principal Classuser.principal.class
    isAuthenticated?user.authenticated
    clientRegistrationIduser.authorizedClientregistrationId
    Claim: keyvalue
    Granted Authority: authority
    + + \ No newline at end of file diff --git a/spring-security-modules/spring-security-azuread/src/test/java/com/baeldung/security/azuread/ApplicationLiveTest.java b/spring-security-modules/spring-security-azuread/src/test/java/com/baeldung/security/azuread/ApplicationLiveTest.java new file mode 100644 index 0000000000..8c941aa787 --- /dev/null +++ b/spring-security-modules/spring-security-azuread/src/test/java/com/baeldung/security/azuread/ApplicationLiveTest.java @@ -0,0 +1,62 @@ +package com.baeldung.security.azuread; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import java.net.URI; + +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.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@ActiveProfiles("azuread") +class ApplicationLiveTest { + + @Autowired + TestRestTemplate rest; + + @LocalServerPort + int port; + + @Test + void testWhenAccessRootPath_thenRedirectToAzureAD() { + + ResponseEntity response = rest.getForEntity("http://localhost:" + port , String.class); + HttpStatus st = response.getStatusCode(); + assertThat(st) + .isEqualTo(HttpStatus.FOUND); + + URI location1 = response.getHeaders().getLocation(); + assertThat(location1) + .isNotNull(); + assertThat(location1.getPath()) + .isEqualTo("/oauth2/authorization/azure-dev"); + + assertThat(location1.getPort()) + .isEqualTo(port); + + assertThat(location1.getHost()) + .isEqualTo("localhost"); + + // Now let't follow this redirect + response = rest.getForEntity(location1, String.class); + assertThat(st) + .isEqualTo(HttpStatus.FOUND); + URI location2 = response.getHeaders().getLocation(); + assertThat(location2) + .isNotNull(); + + assertThat(location2.getHost()) + .describedAs("Should redirect to AzureAD") + .isEqualTo("login.microsoftonline.com"); + + } + +} diff --git a/spring-security-modules/spring-security-azuread/src/test/java/com/baeldung/security/azuread/support/GroupsClaimMapperUnitTest.java b/spring-security-modules/spring-security-azuread/src/test/java/com/baeldung/security/azuread/support/GroupsClaimMapperUnitTest.java new file mode 100644 index 0000000000..0a8f85d0d1 --- /dev/null +++ b/spring-security-modules/spring-security-azuread/src/test/java/com/baeldung/security/azuread/support/GroupsClaimMapperUnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.security.azuread.support; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.jupiter.api.Test; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.oauth2.core.ClaimAccessor; + +class GroupsClaimMapperUnitTest { + + private Map> g2a = new HashMap<>(); + + @Test + void testWhenNoGroupClaimsPresent_thenNoAuthoritiesAdded() { + + ClaimAccessor source = mock(ClaimAccessor.class); + GroupsClaimMapper mapper = new GroupsClaimMapper("ROLE", "group", g2a); + + Collection authorities = mapper.mapAuthorities(source); + assertThat(authorities) + .isNotNull() + .isEmpty(); + } + + @Test + void testWhenEmptyGroupClaimsPresent_thenNoAuthoritiesAdded() { + + ClaimAccessor source = mock(ClaimAccessor.class); + when(source.getClaimAsStringList("group")) + .thenReturn(Collections.emptyList()); + + GroupsClaimMapper mapper = new GroupsClaimMapper("ROLE", "group", g2a); + + Collection authorities = mapper.mapAuthorities(source); + assertThat(authorities) + .isNotNull() + .isEmpty(); + } + +} From 41b3460af62cca60c8f99ddbeacf3611f6446619 Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Sun, 26 Feb 2023 04:26:44 +0100 Subject: [PATCH 542/592] BAEL-5741 Download a Webpage in Java (#13531) * BAEL-5741 Download a Webpage in Java * BAEL-5741 Download a Webpage in Java * BAEL-5741 Download a Webpage in Java * BAEL-5741 Download a Webpage in Java * BAEL-5741 Download a Webpage in Java --- .../core-java-networking-4/pom.xml | 7 +++ .../DownloadWebpageUnitTest.java | 48 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 core-java-modules/core-java-networking-4/src/test/java/com/baeldung/downloadwebpage/DownloadWebpageUnitTest.java diff --git a/core-java-modules/core-java-networking-4/pom.xml b/core-java-modules/core-java-networking-4/pom.xml index 29531a5767..a3694cfea8 100644 --- a/core-java-modules/core-java-networking-4/pom.xml +++ b/core-java-modules/core-java-networking-4/pom.xml @@ -20,6 +20,12 @@ commons-validator ${apache.commons-validator.version} + + org.jsoup + jsoup + ${jsoup.version} + + @@ -28,6 +34,7 @@ 1.7 + 1.15.4 \ No newline at end of file diff --git a/core-java-modules/core-java-networking-4/src/test/java/com/baeldung/downloadwebpage/DownloadWebpageUnitTest.java b/core-java-modules/core-java-networking-4/src/test/java/com/baeldung/downloadwebpage/DownloadWebpageUnitTest.java new file mode 100644 index 0000000000..23b8928ecb --- /dev/null +++ b/core-java-modules/core-java-networking-4/src/test/java/com/baeldung/downloadwebpage/DownloadWebpageUnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.downloadwebpage; + +import static org.junit.jupiter.api.Assertions.*; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.junit.jupiter.api.Test; + +class DownloadWebpageUnitTest { + + @Test + public void givenURLConnection_whenRetrieveWebpage_thenWebpageIsNotNullAndContainsHtmlTag() throws IOException { + URL url = new URL("https://example.com"); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + + try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + StringBuilder responseBuilder = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + responseBuilder.append(line); + } + + assertNotNull(responseBuilder); + assertTrue(responseBuilder.toString() + .contains("")); + } + + } + + @Test + public void givenJsoup_whenRetrievingWebpage_thenWebpageDocumentIsNotNullAndContainsHtmlTag() throws IOException { + + Document document = Jsoup.connect("https://example.com") + .get(); + String webpage = document.html(); + + assertNotNull(webpage); + assertTrue(webpage.contains("")); + + } + +} From db1e483c243e432c36b299f891fc368ff5b691f4 Mon Sep 17 00:00:00 2001 From: Saikat Date: Sun, 26 Feb 2023 13:04:08 +0530 Subject: [PATCH 543/592] Port number corrected --- .../spring-cloud-open-telemetry1/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/Dockerfile b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/Dockerfile index 8bae52cec4..50cd35ed84 100644 --- a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/Dockerfile +++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry1/Dockerfile @@ -2,6 +2,6 @@ FROM adoptopenjdk/openjdk11:alpine COPY target/spring-cloud-open-telemetry1-1.0.0-SNAPSHOT.jar spring-cloud-open-telemetry.jar -EXPOSE 8081 +EXPOSE 8080 ENTRYPOINT ["java","-jar","/spring-cloud-open-telemetry.jar"] \ No newline at end of file From f3a236c77c8aef7e1da9b1e6eaf28ed66cb30229 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 26 Feb 2023 16:49:13 +0530 Subject: [PATCH 544/592] JAVA-17766 Fix references to parents - Week 6 - 2023 (moved-2) (#13536) --- .../spring-boot-logging-log4j2/pom.xml | 34 +++---------------- 1 file changed, 4 insertions(+), 30 deletions(-) diff --git a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml index b2a6975964..b429339417 100644 --- a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml +++ b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml @@ -8,34 +8,13 @@ jar Demo project for Spring Boot Logging with Log4J2 - - org.springframework.boot - spring-boot-starter-parent - 2.2.2.RELEASE - + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 - - - - - - - junit - junit - ${junit.version} - - - org.junit - junit-bom - ${junit-jupiter.version} - pom - import - - - - org.springframework.boot @@ -62,7 +41,6 @@ org.projectlombok lombok - ${lombok.version} provided @@ -96,10 +74,6 @@ com.baeldung.springbootlogging.SpringBootLoggingApplication 1.3.8.RELEASE 1.1.16 - 1.18.24 - - 4.13.2 - 5.8.1 2.17.1 From 4e89577f19af1f657153b8b9dafb406848994188 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Sun, 26 Feb 2023 17:35:12 +0200 Subject: [PATCH 545/592] JAVA-14723 Some additional improvements (#13517) Co-authored-by: timis1 --- .../java/com/baeldung/config/WebConfig.java | 43 ------------------- ...ssParametersControllerIntegrationTest.java | 6 +-- ...rWithRequiredAttributeIntegrationTest.java | 9 ++-- 3 files changed, 7 insertions(+), 51 deletions(-) diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/config/WebConfig.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/config/WebConfig.java index 9901915b03..e9b59a2b23 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/config/WebConfig.java +++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/config/WebConfig.java @@ -41,47 +41,4 @@ public class WebConfig { public ObjectMapper objectMapper() { return new ObjectMapper(); } - - // Thymeleaf configuration - @Bean - public ViewResolver thymeleafViewResolver() { - - ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); - - viewResolver.setTemplateEngine(thymeleafTemplateEngine()); - viewResolver.setCharacterEncoding("UTF-8"); - viewResolver.setOrder(0); - - return viewResolver; - } - - // Thymeleaf template engine with Spring integration - @Bean - public SpringTemplateEngine thymeleafTemplateEngine() { - - SpringTemplateEngine templateEngine = new SpringTemplateEngine(); - templateEngine.setTemplateResolver(thymeleafTemplateResolver()); - templateEngine.setEnableSpringELCompiler(true); - - return templateEngine; - } - - @Bean - public SpringResourceTemplateResolver springResourceTemplateResolver() { - return new SpringResourceTemplateResolver(); - } - - @Bean - public ITemplateResolver thymeleafTemplateResolver() { - - ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); - - templateResolver.setPrefix("/templates/"); - templateResolver.setCacheable(false); - templateResolver.setSuffix(".html"); - templateResolver.setTemplateMode(TemplateMode.HTML); - templateResolver.setCharacterEncoding("UTF-8"); - - return templateResolver; - } } diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/PassParametersControllerIntegrationTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/PassParametersControllerIntegrationTest.java index c1311acba0..7408ae825d 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/PassParametersControllerIntegrationTest.java +++ b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/PassParametersControllerIntegrationTest.java @@ -39,7 +39,7 @@ public class PassParametersControllerIntegrationTest { ModelAndView mv = this.mockMvc.perform(MockMvcRequestBuilders.get("/showViewPage")).andReturn().getModelAndView(); //Validate view - Assert.assertEquals(mv.getViewName(), "viewPage"); + Assert.assertEquals(mv.getViewName(), "view/viewPage"); //Validate attribute Assert.assertEquals(mv.getModelMap().get("message").toString(), "Baeldung"); @@ -50,7 +50,7 @@ public class PassParametersControllerIntegrationTest { ModelAndView mv = this.mockMvc.perform(MockMvcRequestBuilders.get("/printViewPage")).andReturn().getModelAndView(); //Validate view - Assert.assertEquals(mv.getViewName(), "viewPage"); + Assert.assertEquals(mv.getViewName(), "view/viewPage"); //Validate attribute Assert.assertEquals(mv.getModelMap().get("message").toString(), "Baeldung"); @@ -61,7 +61,7 @@ public class PassParametersControllerIntegrationTest { ModelAndView mv = this.mockMvc.perform(MockMvcRequestBuilders.get("/goToViewPage")).andReturn().getModelAndView(); //Validate view - Assert.assertEquals(mv.getViewName(), "viewPage"); + Assert.assertEquals(mv.getViewName(), "view/viewPage"); //Validate attribute Assert.assertEquals(mv.getModelMap().get("message").toString(), "Baeldung"); diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithRequiredAttributeIntegrationTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithRequiredAttributeIntegrationTest.java index 6e087a1640..e7d864d9be 100644 --- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithRequiredAttributeIntegrationTest.java +++ b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithRequiredAttributeIntegrationTest.java @@ -34,17 +34,16 @@ public class ArticleViewerControllerWithRequiredAttributeIntegrationTest { int articleId = 5; this.mockMvc - .perform(MockMvcRequestBuilders.get("/article/{id}", articleId)) + .perform(MockMvcRequestBuilders.get("/requiredAttribute/article/{id}", articleId)) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.id").value(articleId)); - } @Test - public void whenIdPathVariableIsNotPassed_thenResponse500() throws Exception { + public void whenIdPathVariableIsNotPassed_thenResponseOK() throws Exception { this.mockMvc - .perform(MockMvcRequestBuilders.get("/article")) - .andExpect(MockMvcResultMatchers.status().isInternalServerError()); + .perform(MockMvcRequestBuilders.get("/requiredAttribute/article")) + .andExpect(MockMvcResultMatchers.status().isOk()); } } \ No newline at end of file From 45790055bac0b249fd3af9d91c2b1ce17f745d8b Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Sun, 26 Feb 2023 18:01:26 +0200 Subject: [PATCH 546/592] =?UTF-8?q?JAVA-13870=20Move=20spring-caching,spri?= =?UTF-8?q?ng-caching-2=20to=20spring-boot-module=E2=80=A6=20(#13457)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * JAVA-13870 Move spring-caching,spring-caching-2 to spring-boot-modules (conti-1) * JAVA-13870 Making spring boot as the parent for spring-caching and spring caching-2 --------- Co-authored-by: timis1 --- pom.xml | 6 ++---- spring-boot-modules/pom.xml | 1 + .../spring-caching-2}/README.md | 0 .../spring-caching-2}/pom.xml | 7 +++---- .../java/com/baeldung/caching/redis/CacheConfig.java | 0 .../src/main/java/com/baeldung/caching/redis/Item.java | 0 .../java/com/baeldung/caching/redis/ItemController.java | 0 .../java/com/baeldung/caching/redis/ItemRepository.java | 0 .../java/com/baeldung/caching/redis/ItemService.java | 0 .../baeldung/caching/redis/RedisCacheApplication.java | 0 .../com/baeldung/caching/ttl/CachingTTLApplication.java | 0 .../baeldung/caching/ttl/config/SpringCachingConfig.java | 0 .../baeldung/caching/ttl/controller/HotelController.java | 0 .../caching/ttl/exception/ControllerAdvisor.java | 0 .../caching/ttl/exception/ElementNotFoundException.java | 0 .../main/java/com/baeldung/caching/ttl/model/City.java | 0 .../main/java/com/baeldung/caching/ttl/model/Hotel.java | 0 .../baeldung/caching/ttl/repository/CityRepository.java | 0 .../baeldung/caching/ttl/repository/HotelRepository.java | 0 .../com/baeldung/caching/ttl/service/HotelService.java | 0 .../caching/ttl/service/SpringCacheCustomizer.java | 0 .../src/main/resources/application.properties | 0 .../spring-caching-2}/src/main/resources/data.sql | 0 .../caching/redis/ItemServiceCachingIntegrationTest.java | 0 .../caching/ttl/HotelControllerIntegrationTest.java | 0 .../src/test/java/com/baeldung/caching/ttl/SlowTest.java | 0 .../src/test/resources/application.properties | 0 .../spring-caching}/README.md | 0 .../spring-caching}/pom.xml | 9 ++++----- .../main/java/com/baeldung/cachetest/Application.java | 0 .../java/com/baeldung/cachetest/config/CacheConfig.java | 0 .../com/baeldung/cachetest/config/CacheEventLogger.java | 0 .../com/baeldung/cachetest/rest/NumberController.java | 0 .../com/baeldung/cachetest/service/NumberService.java | 0 .../java/com/baeldung/caching/boot/CacheApplication.java | 0 .../com/baeldung/caching/boot/SimpleCacheCustomizer.java | 0 .../baeldung/caching/config/ApplicationCacheConfig.java | 0 .../java/com/baeldung/caching/config/CachingConfig.java | 0 .../com/baeldung/caching/config/CustomKeyGenerator.java | 0 .../caching/eviction/controllers/CachingController.java | 0 .../caching/eviction/service/CachingService.java | 0 .../com/baeldung/caching/example/AbstractService.java | 0 .../java/com/baeldung/caching/example/BookService.java | 0 .../main/java/com/baeldung/caching/example/Customer.java | 0 .../baeldung/caching/example/CustomerDataService.java | 0 .../caching/example/CustomerServiceWithParent.java | 0 .../src/main/java/com/baeldung/caching/model/Book.java | 0 .../baeldung/ehcache/calculator/SquaredCalculator.java | 0 .../java/com/baeldung/ehcache/config/CacheHelper.java | 0 .../multiplecachemanager/bo/CustomerDetailBO.java | 0 .../baeldung/multiplecachemanager/bo/OrderDetailBO.java | 0 .../config/MultipleCacheManagerConfig.java | 0 .../config/MultipleCacheResolver.java | 0 .../controller/MultipleCacheManagerController.java | 0 .../baeldung/multiplecachemanager/entity/Customer.java | 0 .../com/baeldung/multiplecachemanager/entity/Item.java | 0 .../com/baeldung/multiplecachemanager/entity/Order.java | 0 .../repository/CustomerDetailRepository.java | 0 .../repository/OrderDetailRepository.java | 0 .../java/com/baeldung/springdatacaching/model/Book.java | 0 .../springdatacaching/repositories/BookRepository.java | 0 .../src/main/resources/application.properties | 0 .../spring-caching}/src/main/resources/config.xml | 0 .../spring-caching}/src/main/resources/data.sql | 0 .../spring-caching}/src/main/resources/ehcache.xml | 0 .../spring-caching}/src/main/resources/logback.xml | 0 .../spring-caching}/src/main/resources/schema.sql | 0 .../boot/SimpleCacheCustomizerIntegrationTest.java | 0 .../test/CacheEvictAnnotationIntegrationTest.java | 0 .../caching/test/CacheManagerEvictIntegrationTest.java | 0 .../caching/test/SpringCachingIntegrationTest.java | 0 .../com/baeldung/ehcache/SquareCalculatorUnitTest.java | 0 .../MultipleCacheManagerIntegrationTest.java | 0 .../BookRepositoryCachingIntegrationTest.java | 0 .../repositories/BookRepositoryIntegrationTest.java | 0 75 files changed, 10 insertions(+), 13 deletions(-) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/README.md (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/pom.xml (91%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/redis/CacheConfig.java (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/redis/Item.java (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/redis/ItemController.java (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/redis/ItemRepository.java (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/redis/ItemService.java (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/redis/RedisCacheApplication.java (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/ttl/CachingTTLApplication.java (100%) mode change 100755 => 100644 rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/ttl/config/SpringCachingConfig.java (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/ttl/controller/HotelController.java (100%) mode change 100755 => 100644 rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/ttl/exception/ControllerAdvisor.java (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/ttl/exception/ElementNotFoundException.java (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/ttl/model/City.java (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/ttl/model/Hotel.java (100%) mode change 100755 => 100644 rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/ttl/repository/CityRepository.java (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/ttl/repository/HotelRepository.java (100%) mode change 100755 => 100644 rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/ttl/service/HotelService.java (100%) mode change 100755 => 100644 rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/java/com/baeldung/caching/ttl/service/SpringCacheCustomizer.java (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/resources/application.properties (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/main/resources/data.sql (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/test/java/com/baeldung/caching/redis/ItemServiceCachingIntegrationTest.java (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/test/java/com/baeldung/caching/ttl/HotelControllerIntegrationTest.java (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/test/java/com/baeldung/caching/ttl/SlowTest.java (100%) rename {spring-caching-2 => spring-boot-modules/spring-caching-2}/src/test/resources/application.properties (100%) rename {spring-caching => spring-boot-modules/spring-caching}/README.md (100%) rename {spring-caching => spring-boot-modules/spring-caching}/pom.xml (93%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/cachetest/Application.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/cachetest/config/CacheConfig.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/cachetest/config/CacheEventLogger.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/cachetest/rest/NumberController.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/cachetest/service/NumberService.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/caching/boot/CacheApplication.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/caching/boot/SimpleCacheCustomizer.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/caching/config/ApplicationCacheConfig.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/caching/config/CachingConfig.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/caching/config/CustomKeyGenerator.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/caching/eviction/controllers/CachingController.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/caching/eviction/service/CachingService.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/caching/example/AbstractService.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/caching/example/BookService.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/caching/example/Customer.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/caching/example/CustomerDataService.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/caching/example/CustomerServiceWithParent.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/caching/model/Book.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/ehcache/calculator/SquaredCalculator.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/ehcache/config/CacheHelper.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/multiplecachemanager/bo/CustomerDetailBO.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/multiplecachemanager/bo/OrderDetailBO.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheManagerConfig.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheResolver.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/multiplecachemanager/controller/MultipleCacheManagerController.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/multiplecachemanager/entity/Customer.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/multiplecachemanager/entity/Item.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/multiplecachemanager/entity/Order.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/multiplecachemanager/repository/CustomerDetailRepository.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/multiplecachemanager/repository/OrderDetailRepository.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/springdatacaching/model/Book.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/java/com/baeldung/springdatacaching/repositories/BookRepository.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/resources/application.properties (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/resources/config.xml (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/resources/data.sql (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/resources/ehcache.xml (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/resources/logback.xml (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/main/resources/schema.sql (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/test/java/com/baeldung/caching/boot/SimpleCacheCustomizerIntegrationTest.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/test/java/com/baeldung/caching/test/CacheEvictAnnotationIntegrationTest.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/test/java/com/baeldung/caching/test/CacheManagerEvictIntegrationTest.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/test/java/com/baeldung/caching/test/SpringCachingIntegrationTest.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/test/java/com/baeldung/ehcache/SquareCalculatorUnitTest.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/test/java/com/baeldung/multiplecachemanager/MultipleCacheManagerIntegrationTest.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/test/java/com/baeldung/springdatacaching/repositories/BookRepositoryCachingIntegrationTest.java (100%) rename {spring-caching => spring-boot-modules/spring-caching}/src/test/java/com/baeldung/springdatacaching/repositories/BookRepositoryIntegrationTest.java (100%) diff --git a/pom.xml b/pom.xml index dfda6fd130..ff29bacfa4 100644 --- a/pom.xml +++ b/pom.xml @@ -455,7 +455,6 @@ spring-bom spring-boot-modules spring-boot-rest - spring-caching spring-cloud-modules spring-core @@ -697,7 +696,6 @@ spring-bom spring-boot-modules spring-boot-rest - spring-caching spring-cloud-modules spring-core @@ -1020,7 +1018,7 @@ spring-5-webflux-2 spring-activiti spring-batch-2 - spring-caching-2 + spring-boot-modules/spring-caching-2 spring-core-2 spring-core-3 spring-core-5 @@ -1249,7 +1247,7 @@ spring-5-webflux-2 spring-activiti spring-batch-2 - spring-caching-2 + spring-boot-modules/spring-caching-2 spring-core-2 spring-core-3 spring-core-5 diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 3ed9eea431..7fdfac4b93 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -84,6 +84,7 @@ spring-boot-data-2 spring-boot-validation spring-boot-data-3 + spring-caching diff --git a/spring-caching-2/README.md b/spring-boot-modules/spring-caching-2/README.md similarity index 100% rename from spring-caching-2/README.md rename to spring-boot-modules/spring-caching-2/README.md diff --git a/spring-caching-2/pom.xml b/spring-boot-modules/spring-caching-2/pom.xml similarity index 91% rename from spring-caching-2/pom.xml rename to spring-boot-modules/spring-caching-2/pom.xml index 0a07820fc4..6e33e42d2b 100644 --- a/spring-caching-2/pom.xml +++ b/spring-boot-modules/spring-caching-2/pom.xml @@ -9,10 +9,9 @@ jar - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2/pom.xml + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/redis/CacheConfig.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/redis/CacheConfig.java similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/redis/CacheConfig.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/redis/CacheConfig.java diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/redis/Item.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/redis/Item.java similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/redis/Item.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/redis/Item.java diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemController.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemController.java similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemController.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemController.java diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemRepository.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemRepository.java similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemRepository.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemRepository.java diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemService.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemService.java similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemService.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemService.java diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/redis/RedisCacheApplication.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/redis/RedisCacheApplication.java similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/redis/RedisCacheApplication.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/redis/RedisCacheApplication.java diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/ttl/CachingTTLApplication.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/CachingTTLApplication.java old mode 100755 new mode 100644 similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/ttl/CachingTTLApplication.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/CachingTTLApplication.java diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/ttl/config/SpringCachingConfig.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/config/SpringCachingConfig.java similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/ttl/config/SpringCachingConfig.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/config/SpringCachingConfig.java diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/ttl/controller/HotelController.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/controller/HotelController.java old mode 100755 new mode 100644 similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/ttl/controller/HotelController.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/controller/HotelController.java diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/ttl/exception/ControllerAdvisor.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/exception/ControllerAdvisor.java similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/ttl/exception/ControllerAdvisor.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/exception/ControllerAdvisor.java diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/ttl/exception/ElementNotFoundException.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/exception/ElementNotFoundException.java similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/ttl/exception/ElementNotFoundException.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/exception/ElementNotFoundException.java diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/ttl/model/City.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/model/City.java similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/ttl/model/City.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/model/City.java diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/ttl/model/Hotel.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/model/Hotel.java old mode 100755 new mode 100644 similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/ttl/model/Hotel.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/model/Hotel.java diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/ttl/repository/CityRepository.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/repository/CityRepository.java similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/ttl/repository/CityRepository.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/repository/CityRepository.java diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/ttl/repository/HotelRepository.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/repository/HotelRepository.java old mode 100755 new mode 100644 similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/ttl/repository/HotelRepository.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/repository/HotelRepository.java diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/ttl/service/HotelService.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/service/HotelService.java old mode 100755 new mode 100644 similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/ttl/service/HotelService.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/service/HotelService.java diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/ttl/service/SpringCacheCustomizer.java b/spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/service/SpringCacheCustomizer.java similarity index 100% rename from spring-caching-2/src/main/java/com/baeldung/caching/ttl/service/SpringCacheCustomizer.java rename to spring-boot-modules/spring-caching-2/src/main/java/com/baeldung/caching/ttl/service/SpringCacheCustomizer.java diff --git a/spring-caching-2/src/main/resources/application.properties b/spring-boot-modules/spring-caching-2/src/main/resources/application.properties similarity index 100% rename from spring-caching-2/src/main/resources/application.properties rename to spring-boot-modules/spring-caching-2/src/main/resources/application.properties diff --git a/spring-caching-2/src/main/resources/data.sql b/spring-boot-modules/spring-caching-2/src/main/resources/data.sql similarity index 100% rename from spring-caching-2/src/main/resources/data.sql rename to spring-boot-modules/spring-caching-2/src/main/resources/data.sql diff --git a/spring-caching-2/src/test/java/com/baeldung/caching/redis/ItemServiceCachingIntegrationTest.java b/spring-boot-modules/spring-caching-2/src/test/java/com/baeldung/caching/redis/ItemServiceCachingIntegrationTest.java similarity index 100% rename from spring-caching-2/src/test/java/com/baeldung/caching/redis/ItemServiceCachingIntegrationTest.java rename to spring-boot-modules/spring-caching-2/src/test/java/com/baeldung/caching/redis/ItemServiceCachingIntegrationTest.java diff --git a/spring-caching-2/src/test/java/com/baeldung/caching/ttl/HotelControllerIntegrationTest.java b/spring-boot-modules/spring-caching-2/src/test/java/com/baeldung/caching/ttl/HotelControllerIntegrationTest.java similarity index 100% rename from spring-caching-2/src/test/java/com/baeldung/caching/ttl/HotelControllerIntegrationTest.java rename to spring-boot-modules/spring-caching-2/src/test/java/com/baeldung/caching/ttl/HotelControllerIntegrationTest.java diff --git a/spring-caching-2/src/test/java/com/baeldung/caching/ttl/SlowTest.java b/spring-boot-modules/spring-caching-2/src/test/java/com/baeldung/caching/ttl/SlowTest.java similarity index 100% rename from spring-caching-2/src/test/java/com/baeldung/caching/ttl/SlowTest.java rename to spring-boot-modules/spring-caching-2/src/test/java/com/baeldung/caching/ttl/SlowTest.java diff --git a/spring-caching-2/src/test/resources/application.properties b/spring-boot-modules/spring-caching-2/src/test/resources/application.properties similarity index 100% rename from spring-caching-2/src/test/resources/application.properties rename to spring-boot-modules/spring-caching-2/src/test/resources/application.properties diff --git a/spring-caching/README.md b/spring-boot-modules/spring-caching/README.md similarity index 100% rename from spring-caching/README.md rename to spring-boot-modules/spring-caching/README.md diff --git a/spring-caching/pom.xml b/spring-boot-modules/spring-caching/pom.xml similarity index 93% rename from spring-caching/pom.xml rename to spring-boot-modules/spring-caching/pom.xml index 34c035a8ec..c0318729af 100644 --- a/spring-caching/pom.xml +++ b/spring-boot-modules/spring-caching/pom.xml @@ -8,11 +8,10 @@ spring-caching war - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2 + + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT diff --git a/spring-caching/src/main/java/com/baeldung/cachetest/Application.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/cachetest/Application.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/cachetest/Application.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/cachetest/Application.java diff --git a/spring-caching/src/main/java/com/baeldung/cachetest/config/CacheConfig.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/cachetest/config/CacheConfig.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/cachetest/config/CacheConfig.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/cachetest/config/CacheConfig.java diff --git a/spring-caching/src/main/java/com/baeldung/cachetest/config/CacheEventLogger.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/cachetest/config/CacheEventLogger.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/cachetest/config/CacheEventLogger.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/cachetest/config/CacheEventLogger.java diff --git a/spring-caching/src/main/java/com/baeldung/cachetest/rest/NumberController.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/cachetest/rest/NumberController.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/cachetest/rest/NumberController.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/cachetest/rest/NumberController.java diff --git a/spring-caching/src/main/java/com/baeldung/cachetest/service/NumberService.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/cachetest/service/NumberService.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/cachetest/service/NumberService.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/cachetest/service/NumberService.java diff --git a/spring-caching/src/main/java/com/baeldung/caching/boot/CacheApplication.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/boot/CacheApplication.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/caching/boot/CacheApplication.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/boot/CacheApplication.java diff --git a/spring-caching/src/main/java/com/baeldung/caching/boot/SimpleCacheCustomizer.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/boot/SimpleCacheCustomizer.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/caching/boot/SimpleCacheCustomizer.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/boot/SimpleCacheCustomizer.java diff --git a/spring-caching/src/main/java/com/baeldung/caching/config/ApplicationCacheConfig.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/config/ApplicationCacheConfig.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/caching/config/ApplicationCacheConfig.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/config/ApplicationCacheConfig.java diff --git a/spring-caching/src/main/java/com/baeldung/caching/config/CachingConfig.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/config/CachingConfig.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/caching/config/CachingConfig.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/config/CachingConfig.java diff --git a/spring-caching/src/main/java/com/baeldung/caching/config/CustomKeyGenerator.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/config/CustomKeyGenerator.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/caching/config/CustomKeyGenerator.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/config/CustomKeyGenerator.java diff --git a/spring-caching/src/main/java/com/baeldung/caching/eviction/controllers/CachingController.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/eviction/controllers/CachingController.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/caching/eviction/controllers/CachingController.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/eviction/controllers/CachingController.java diff --git a/spring-caching/src/main/java/com/baeldung/caching/eviction/service/CachingService.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/eviction/service/CachingService.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/caching/eviction/service/CachingService.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/eviction/service/CachingService.java diff --git a/spring-caching/src/main/java/com/baeldung/caching/example/AbstractService.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/example/AbstractService.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/caching/example/AbstractService.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/example/AbstractService.java diff --git a/spring-caching/src/main/java/com/baeldung/caching/example/BookService.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/example/BookService.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/caching/example/BookService.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/example/BookService.java diff --git a/spring-caching/src/main/java/com/baeldung/caching/example/Customer.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/example/Customer.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/caching/example/Customer.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/example/Customer.java diff --git a/spring-caching/src/main/java/com/baeldung/caching/example/CustomerDataService.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/example/CustomerDataService.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/caching/example/CustomerDataService.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/example/CustomerDataService.java diff --git a/spring-caching/src/main/java/com/baeldung/caching/example/CustomerServiceWithParent.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/example/CustomerServiceWithParent.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/caching/example/CustomerServiceWithParent.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/example/CustomerServiceWithParent.java diff --git a/spring-caching/src/main/java/com/baeldung/caching/model/Book.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/model/Book.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/caching/model/Book.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/caching/model/Book.java diff --git a/spring-caching/src/main/java/com/baeldung/ehcache/calculator/SquaredCalculator.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/ehcache/calculator/SquaredCalculator.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/ehcache/calculator/SquaredCalculator.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/ehcache/calculator/SquaredCalculator.java diff --git a/spring-caching/src/main/java/com/baeldung/ehcache/config/CacheHelper.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/ehcache/config/CacheHelper.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/ehcache/config/CacheHelper.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/ehcache/config/CacheHelper.java diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/bo/CustomerDetailBO.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/bo/CustomerDetailBO.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/multiplecachemanager/bo/CustomerDetailBO.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/bo/CustomerDetailBO.java diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/bo/OrderDetailBO.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/bo/OrderDetailBO.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/multiplecachemanager/bo/OrderDetailBO.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/bo/OrderDetailBO.java diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheManagerConfig.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheManagerConfig.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheManagerConfig.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheManagerConfig.java diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheResolver.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheResolver.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheResolver.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/config/MultipleCacheResolver.java diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/controller/MultipleCacheManagerController.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/controller/MultipleCacheManagerController.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/multiplecachemanager/controller/MultipleCacheManagerController.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/controller/MultipleCacheManagerController.java diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Customer.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Customer.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Customer.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Customer.java diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Item.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Item.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Item.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Item.java diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Order.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Order.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Order.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/entity/Order.java diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/repository/CustomerDetailRepository.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/repository/CustomerDetailRepository.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/multiplecachemanager/repository/CustomerDetailRepository.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/repository/CustomerDetailRepository.java diff --git a/spring-caching/src/main/java/com/baeldung/multiplecachemanager/repository/OrderDetailRepository.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/repository/OrderDetailRepository.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/multiplecachemanager/repository/OrderDetailRepository.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/multiplecachemanager/repository/OrderDetailRepository.java diff --git a/spring-caching/src/main/java/com/baeldung/springdatacaching/model/Book.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/springdatacaching/model/Book.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/springdatacaching/model/Book.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/springdatacaching/model/Book.java diff --git a/spring-caching/src/main/java/com/baeldung/springdatacaching/repositories/BookRepository.java b/spring-boot-modules/spring-caching/src/main/java/com/baeldung/springdatacaching/repositories/BookRepository.java similarity index 100% rename from spring-caching/src/main/java/com/baeldung/springdatacaching/repositories/BookRepository.java rename to spring-boot-modules/spring-caching/src/main/java/com/baeldung/springdatacaching/repositories/BookRepository.java diff --git a/spring-caching/src/main/resources/application.properties b/spring-boot-modules/spring-caching/src/main/resources/application.properties similarity index 100% rename from spring-caching/src/main/resources/application.properties rename to spring-boot-modules/spring-caching/src/main/resources/application.properties diff --git a/spring-caching/src/main/resources/config.xml b/spring-boot-modules/spring-caching/src/main/resources/config.xml similarity index 100% rename from spring-caching/src/main/resources/config.xml rename to spring-boot-modules/spring-caching/src/main/resources/config.xml diff --git a/spring-caching/src/main/resources/data.sql b/spring-boot-modules/spring-caching/src/main/resources/data.sql similarity index 100% rename from spring-caching/src/main/resources/data.sql rename to spring-boot-modules/spring-caching/src/main/resources/data.sql diff --git a/spring-caching/src/main/resources/ehcache.xml b/spring-boot-modules/spring-caching/src/main/resources/ehcache.xml similarity index 100% rename from spring-caching/src/main/resources/ehcache.xml rename to spring-boot-modules/spring-caching/src/main/resources/ehcache.xml diff --git a/spring-caching/src/main/resources/logback.xml b/spring-boot-modules/spring-caching/src/main/resources/logback.xml similarity index 100% rename from spring-caching/src/main/resources/logback.xml rename to spring-boot-modules/spring-caching/src/main/resources/logback.xml diff --git a/spring-caching/src/main/resources/schema.sql b/spring-boot-modules/spring-caching/src/main/resources/schema.sql similarity index 100% rename from spring-caching/src/main/resources/schema.sql rename to spring-boot-modules/spring-caching/src/main/resources/schema.sql diff --git a/spring-caching/src/test/java/com/baeldung/caching/boot/SimpleCacheCustomizerIntegrationTest.java b/spring-boot-modules/spring-caching/src/test/java/com/baeldung/caching/boot/SimpleCacheCustomizerIntegrationTest.java similarity index 100% rename from spring-caching/src/test/java/com/baeldung/caching/boot/SimpleCacheCustomizerIntegrationTest.java rename to spring-boot-modules/spring-caching/src/test/java/com/baeldung/caching/boot/SimpleCacheCustomizerIntegrationTest.java diff --git a/spring-caching/src/test/java/com/baeldung/caching/test/CacheEvictAnnotationIntegrationTest.java b/spring-boot-modules/spring-caching/src/test/java/com/baeldung/caching/test/CacheEvictAnnotationIntegrationTest.java similarity index 100% rename from spring-caching/src/test/java/com/baeldung/caching/test/CacheEvictAnnotationIntegrationTest.java rename to spring-boot-modules/spring-caching/src/test/java/com/baeldung/caching/test/CacheEvictAnnotationIntegrationTest.java diff --git a/spring-caching/src/test/java/com/baeldung/caching/test/CacheManagerEvictIntegrationTest.java b/spring-boot-modules/spring-caching/src/test/java/com/baeldung/caching/test/CacheManagerEvictIntegrationTest.java similarity index 100% rename from spring-caching/src/test/java/com/baeldung/caching/test/CacheManagerEvictIntegrationTest.java rename to spring-boot-modules/spring-caching/src/test/java/com/baeldung/caching/test/CacheManagerEvictIntegrationTest.java diff --git a/spring-caching/src/test/java/com/baeldung/caching/test/SpringCachingIntegrationTest.java b/spring-boot-modules/spring-caching/src/test/java/com/baeldung/caching/test/SpringCachingIntegrationTest.java similarity index 100% rename from spring-caching/src/test/java/com/baeldung/caching/test/SpringCachingIntegrationTest.java rename to spring-boot-modules/spring-caching/src/test/java/com/baeldung/caching/test/SpringCachingIntegrationTest.java diff --git a/spring-caching/src/test/java/com/baeldung/ehcache/SquareCalculatorUnitTest.java b/spring-boot-modules/spring-caching/src/test/java/com/baeldung/ehcache/SquareCalculatorUnitTest.java similarity index 100% rename from spring-caching/src/test/java/com/baeldung/ehcache/SquareCalculatorUnitTest.java rename to spring-boot-modules/spring-caching/src/test/java/com/baeldung/ehcache/SquareCalculatorUnitTest.java diff --git a/spring-caching/src/test/java/com/baeldung/multiplecachemanager/MultipleCacheManagerIntegrationTest.java b/spring-boot-modules/spring-caching/src/test/java/com/baeldung/multiplecachemanager/MultipleCacheManagerIntegrationTest.java similarity index 100% rename from spring-caching/src/test/java/com/baeldung/multiplecachemanager/MultipleCacheManagerIntegrationTest.java rename to spring-boot-modules/spring-caching/src/test/java/com/baeldung/multiplecachemanager/MultipleCacheManagerIntegrationTest.java diff --git a/spring-caching/src/test/java/com/baeldung/springdatacaching/repositories/BookRepositoryCachingIntegrationTest.java b/spring-boot-modules/spring-caching/src/test/java/com/baeldung/springdatacaching/repositories/BookRepositoryCachingIntegrationTest.java similarity index 100% rename from spring-caching/src/test/java/com/baeldung/springdatacaching/repositories/BookRepositoryCachingIntegrationTest.java rename to spring-boot-modules/spring-caching/src/test/java/com/baeldung/springdatacaching/repositories/BookRepositoryCachingIntegrationTest.java diff --git a/spring-caching/src/test/java/com/baeldung/springdatacaching/repositories/BookRepositoryIntegrationTest.java b/spring-boot-modules/spring-caching/src/test/java/com/baeldung/springdatacaching/repositories/BookRepositoryIntegrationTest.java similarity index 100% rename from spring-caching/src/test/java/com/baeldung/springdatacaching/repositories/BookRepositoryIntegrationTest.java rename to spring-boot-modules/spring-caching/src/test/java/com/baeldung/springdatacaching/repositories/BookRepositoryIntegrationTest.java From 62ba63db7f6e46339065876ba070bab753aab4b3 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Sun, 26 Feb 2023 18:07:17 +0200 Subject: [PATCH 547/592] JAVA-17818 Merge spring-cloud-modules/open-feign and spring-cloud-modules/open-feign-2 (#13530) Co-authored-by: timis1 --- spring-cloud-modules/pom.xml | 3 +- .../spring-cloud-openfeign-2/README.md | 4 -- .../spring-cloud-openfeign-2/pom.xml | 64 ------------------- .../cloud/openfeign/ExampleApplication.java | 16 ----- .../exception/BadRequestException.java | 21 ------ .../exception/NotFoundException.java | 18 ------ .../src/main/resources/application.properties | 10 --- .../cloud/openfeign/SpringContextTest.java | 16 ----- .../spring-cloud-openfeign/README.md | 1 + .../fileupload/config/ExceptionMessage.java | 0 .../fileupload/config/FeignSupportConfig.java | 0 .../config/RetreiveMessageErrorDecoder.java | 0 .../FileUploadClientFallbackFactory.java | 0 .../service/FileUploadClientWithFallBack.java | 0 .../FileUploadClientWithFallbackFactory.java | 0 .../FileUploadClientWithFallbackImpl.java | 0 .../fileupload/service/UploadResource.java | 0 .../fileupload/service/UploadService.java | 0 .../src/main/resources/fileupload.txt | 0 .../OpenFeignFileUploadLiveTest.java | 0 20 files changed, 2 insertions(+), 151 deletions(-) delete mode 100644 spring-cloud-modules/spring-cloud-openfeign-2/README.md delete mode 100644 spring-cloud-modules/spring-cloud-openfeign-2/pom.xml delete mode 100644 spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/ExampleApplication.java delete mode 100644 spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/exception/BadRequestException.java delete mode 100644 spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/exception/NotFoundException.java delete mode 100644 spring-cloud-modules/spring-cloud-openfeign-2/src/main/resources/application.properties delete mode 100644 spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/SpringContextTest.java rename spring-cloud-modules/{spring-cloud-openfeign-2 => spring-cloud-openfeign}/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/ExceptionMessage.java (100%) rename spring-cloud-modules/{spring-cloud-openfeign-2 => spring-cloud-openfeign}/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java (100%) rename spring-cloud-modules/{spring-cloud-openfeign-2 => spring-cloud-openfeign}/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/RetreiveMessageErrorDecoder.java (100%) rename spring-cloud-modules/{spring-cloud-openfeign-2 => spring-cloud-openfeign}/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientFallbackFactory.java (100%) rename spring-cloud-modules/{spring-cloud-openfeign-2 => spring-cloud-openfeign}/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientWithFallBack.java (100%) rename spring-cloud-modules/{spring-cloud-openfeign-2 => spring-cloud-openfeign}/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientWithFallbackFactory.java (100%) rename spring-cloud-modules/{spring-cloud-openfeign-2 => spring-cloud-openfeign}/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientWithFallbackImpl.java (100%) rename spring-cloud-modules/{spring-cloud-openfeign-2 => spring-cloud-openfeign}/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadResource.java (100%) rename spring-cloud-modules/{spring-cloud-openfeign-2 => spring-cloud-openfeign}/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java (100%) rename spring-cloud-modules/{spring-cloud-openfeign-2 => spring-cloud-openfeign}/src/main/resources/fileupload.txt (100%) rename spring-cloud-modules/{spring-cloud-openfeign-2 => spring-cloud-openfeign}/src/test/java/com/baeldung/cloud/openfeign/OpenFeignFileUploadLiveTest.java (100%) diff --git a/spring-cloud-modules/pom.xml b/spring-cloud-modules/pom.xml index 43e2687d74..68c7d45b7c 100644 --- a/spring-cloud-modules/pom.xml +++ b/spring-cloud-modules/pom.xml @@ -54,8 +54,7 @@ spring-cloud-bus spring-cloud-data-flow spring-cloud-sleuth - spring-cloud-openfeign-2 - spring-cloud-open-telemetry + spring-cloud-open-telemetry diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/README.md b/spring-cloud-modules/spring-cloud-openfeign-2/README.md deleted file mode 100644 index bc306e2302..0000000000 --- a/spring-cloud-modules/spring-cloud-openfeign-2/README.md +++ /dev/null @@ -1,4 +0,0 @@ - -### Relevant Articles: - -- [Feign Client Exception Handling](https://www.baeldung.com/java-feign-client-exception-handling) diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/pom.xml b/spring-cloud-modules/spring-cloud-openfeign-2/pom.xml deleted file mode 100644 index 43cc7c6c50..0000000000 --- a/spring-cloud-modules/spring-cloud-openfeign-2/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - 4.0.0 - com.baeldung.cloud - spring-cloud-openfeign-2 - spring-cloud-openfeign-2 - OpenFeign project for Spring Boot - - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - - - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - io.github.openfeign - feign-okhttp - - - org.springframework.boot - spring-boot-starter-web - - - io.github.openfeign.form - feign-form - ${feign-form.version} - - - io.github.openfeign.form - feign-form-spring - - - org.springframework.boot - spring-boot-starter-test - test - - - - - 2021.0.3 - 3.8.0 - - - \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/ExampleApplication.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/ExampleApplication.java deleted file mode 100644 index c7f07f6667..0000000000 --- a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/ExampleApplication.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.cloud.openfeign; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.openfeign.EnableFeignClients; - -@SpringBootApplication -@EnableFeignClients -public class ExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(ExampleApplication.class, args); - } - -} - diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/exception/BadRequestException.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/exception/BadRequestException.java deleted file mode 100644 index 7c2daf43fe..0000000000 --- a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/exception/BadRequestException.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.cloud.openfeign.exception; - -public class BadRequestException extends Exception { - - public BadRequestException() { - } - - public BadRequestException(String message) { - super(message); - } - - public BadRequestException(Throwable cause) { - super(cause); - } - - @Override - public String toString() { - return "BadRequestException: " + getMessage(); - } - -} diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/exception/NotFoundException.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/exception/NotFoundException.java deleted file mode 100644 index 19f6204b86..0000000000 --- a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/exception/NotFoundException.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.cloud.openfeign.exception; - -public class NotFoundException extends Exception { - - public NotFoundException(String message) { - super(message); - } - - public NotFoundException(Throwable cause) { - super(cause); - } - - @Override - public String toString() { - return "NotFoundException: " + getMessage(); - } - -} diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/resources/application.properties deleted file mode 100644 index 7188b74c9b..0000000000 --- a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/resources/application.properties +++ /dev/null @@ -1,10 +0,0 @@ -server.port=8085 -spring.main.allow-bean-definition-overriding=true -spring.application.name= openfeign -logging.level.com.baeldung.cloud.openfeign.client: DEBUG -feign.hystrix.enabled=true - -spring.security.oauth2.client.registration.keycloak.authorization-grant-type=client_credentials -spring.security.oauth2.client.registration.keycloak.client-id=payment-app -spring.security.oauth2.client.registration.keycloak.client-secret=863e9de4-33d4-4471-b35e-f8d2434385bb -spring.security.oauth2.client.provider.keycloak.token-uri=http://localhost:8083/auth/realms/master/protocol/openid-connect/token diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/SpringContextTest.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/SpringContextTest.java deleted file mode 100644 index 4bf35f74f4..0000000000 --- a/spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/SpringContextTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.cloud.openfeign; - - -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 = ExampleApplication.class) -public class SpringContextTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-cloud-modules/spring-cloud-openfeign/README.md b/spring-cloud-modules/spring-cloud-openfeign/README.md index c291e60aa6..62434b35b8 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/README.md +++ b/spring-cloud-modules/spring-cloud-openfeign/README.md @@ -4,3 +4,4 @@ - [Differences Between Netflix Feign and OpenFeign](https://www.baeldung.com/netflix-feign-vs-openfeign) - [Provide an OAuth2 Token to a Feign Client](https://www.baeldung.com/spring-cloud-feign-oauth-token) - [Propagating Exceptions With OpenFeign and Spring](https://www.baeldung.com/spring-openfeign-propagate-exception) +- [Feign Client Exception Handling](https://www.baeldung.com/java-feign-client-exception-handling) diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/ExceptionMessage.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/ExceptionMessage.java similarity index 100% rename from spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/ExceptionMessage.java rename to spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/ExceptionMessage.java diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java rename to spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/RetreiveMessageErrorDecoder.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/RetreiveMessageErrorDecoder.java similarity index 100% rename from spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/RetreiveMessageErrorDecoder.java rename to spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/RetreiveMessageErrorDecoder.java diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientFallbackFactory.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientFallbackFactory.java similarity index 100% rename from spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientFallbackFactory.java rename to spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientFallbackFactory.java diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientWithFallBack.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientWithFallBack.java similarity index 100% rename from spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientWithFallBack.java rename to spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientWithFallBack.java diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientWithFallbackFactory.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientWithFallbackFactory.java similarity index 100% rename from spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientWithFallbackFactory.java rename to spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientWithFallbackFactory.java diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientWithFallbackImpl.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientWithFallbackImpl.java similarity index 100% rename from spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientWithFallbackImpl.java rename to spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/FileUploadClientWithFallbackImpl.java diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadResource.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadResource.java similarity index 100% rename from spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadResource.java rename to spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadResource.java diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java similarity index 100% rename from spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java rename to spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/resources/fileupload.txt b/spring-cloud-modules/spring-cloud-openfeign/src/main/resources/fileupload.txt similarity index 100% rename from spring-cloud-modules/spring-cloud-openfeign-2/src/main/resources/fileupload.txt rename to spring-cloud-modules/spring-cloud-openfeign/src/main/resources/fileupload.txt diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/OpenFeignFileUploadLiveTest.java b/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenFeignFileUploadLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/OpenFeignFileUploadLiveTest.java rename to spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenFeignFileUploadLiveTest.java From 428f69a96638c0cd9d0b043154f4f51fb55c5358 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sun, 26 Feb 2023 18:25:24 +0200 Subject: [PATCH 548/592] [JAVA-18177] Moved server modules to jdk9-and-above profile (#13523) * [JAVA-18177] Moved server modules to jdk9-and-above profile * [JAVA-18177] Upgraded maven-war-plugin version * [JAVA-18146] Moved json-modules to jdk9-and-above profile * [JAVA-18151] Moved libraries-data module to jdk9-and-above profile * [JAVA-18176] Moved saas-modules to jdk9-and-above profile * [JAVA-18165] Moved patterns-modules to jdk9-and-above profile * [JAVA-18146] Fixed tests at gson module * [JAVA-18165] Upgraded maven-war-plugin version * [JAVA-16377] Moved apache-cxf-module to jdk9-and-above profile + comment out cxf spring * [JAVA-18151] Testing maven compiler plugin * [JAVA-18151] Ignored 2 test cases * [JAVA-18151] import javassist dependency manually * [JAVA-16377] Upgraded spring version + uncomment cxf-spring module --- apache-cxf-modules/cxf-introduction/pom.xml | 16 ++++++++++ .../baeldung/cxf/introduction/Baeldung.java | 4 +-- .../cxf/introduction/BaeldungImpl.java | 2 +- .../com/baeldung/cxf/introduction/Server.java | 2 +- .../baeldung/cxf/introduction/Student.java | 2 +- .../cxf/introduction/StudentAdapter.java | 2 +- .../cxf/introduction/StudentImpl.java | 2 +- .../baeldung/cxf/introduction/StudentMap.java | 4 +-- .../cxf/introduction/StudentMapAdapter.java | 2 +- .../cxf/introduction/StudentLiveTest.java | 4 +-- .../cxf-jaxrs-implementation/pom.xml | 23 +++++++++++++-- .../cxf/jaxrs/implementation/Course.java | 6 ++-- .../implementation/CourseRepository.java | 4 +-- .../cxf/jaxrs/implementation/Student.java | 2 +- .../jaxrs/implementation/ServiceLiveTest.java | 2 +- apache-cxf-modules/cxf-spring/pom.xml | 17 +++++++++-- .../sse-jaxrs/sse-jaxrs-client/pom.xml | 8 ++++- .../sse/jaxrs/client/SseClientApp.java | 10 +++---- .../jaxrs/client/SseClientBroadcastApp.java | 10 +++---- .../sse-jaxrs/sse-jaxrs-server/pom.xml | 24 ++++++++------- .../com/baeldung/sse/jaxrs/AppConfig.java | 4 +-- .../com/baeldung/sse/jaxrs/SseResource.java | 20 ++++++------- .../com/baeldung/sse/jaxrs/StockService.java | 12 ++++---- .../serialization/GsonSerializeUnitTest.java | 4 +-- .../test/GsonSerializationUnitTest.java | 4 +-- json-modules/json-2/pom.xml | 6 +++- libraries-data/pom.xml | 17 +++++++++++ .../crunch/StopWordFilterUnitTest.java | 1 + .../ToUpperCaseWithCounterFnUnitTest.java | 1 + patterns-modules/enterprise-patterns/pom.xml | 2 +- patterns-modules/front-controller/pom.xml | 7 +++++ patterns-modules/intercepting-filter/pom.xml | 5 ++++ pom.xml | 29 ++++++++++--------- saas-modules/sentry-servlet/pom.xml | 1 + server-modules/wildfly/pom.xml | 7 ++++- 35 files changed, 184 insertions(+), 82 deletions(-) diff --git a/apache-cxf-modules/cxf-introduction/pom.xml b/apache-cxf-modules/cxf-introduction/pom.xml index fe7b917c6f..fdcd100cc5 100644 --- a/apache-cxf-modules/cxf-introduction/pom.xml +++ b/apache-cxf-modules/cxf-introduction/pom.xml @@ -23,6 +23,16 @@ cxf-rt-transports-http-jetty ${cxf.version} + + jakarta.xml.ws + jakarta.xml.ws-api + ${jakarta-xml.version} + + + jakarta.jws + jakarta.jws-api + ${jakarta.jws.version} + @@ -37,4 +47,10 @@ + + 4.0.0 + 4.0.0 + 3.0.0 + + \ No newline at end of file diff --git a/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/Baeldung.java b/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/Baeldung.java index 472d38b8e1..cd482af0db 100644 --- a/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/Baeldung.java +++ b/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/Baeldung.java @@ -2,8 +2,8 @@ package com.baeldung.cxf.introduction; import java.util.Map; -import javax.jws.WebService; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.jws.WebService; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @WebService public interface Baeldung { diff --git a/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/BaeldungImpl.java b/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/BaeldungImpl.java index 240f6bb1da..04a6243cc2 100644 --- a/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/BaeldungImpl.java +++ b/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/BaeldungImpl.java @@ -3,7 +3,7 @@ package com.baeldung.cxf.introduction; import java.util.LinkedHashMap; import java.util.Map; -import javax.jws.WebService; +import jakarta.jws.WebService; @WebService(endpointInterface = "com.baeldung.cxf.introduction.Baeldung") public class BaeldungImpl implements Baeldung { diff --git a/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/Server.java b/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/Server.java index 2ac649f4c5..f00a64a055 100644 --- a/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/Server.java +++ b/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/Server.java @@ -1,6 +1,6 @@ package com.baeldung.cxf.introduction; -import javax.xml.ws.Endpoint; +import jakarta.xml.ws.Endpoint; public class Server { public static void main(String args[]) throws InterruptedException { diff --git a/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/Student.java b/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/Student.java index cad8f94d97..0605956bbc 100644 --- a/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/Student.java +++ b/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/Student.java @@ -1,6 +1,6 @@ package com.baeldung.cxf.introduction; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @XmlJavaTypeAdapter(StudentAdapter.class) public interface Student { diff --git a/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/StudentAdapter.java b/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/StudentAdapter.java index 29b829d808..7885c953a5 100644 --- a/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/StudentAdapter.java +++ b/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/StudentAdapter.java @@ -1,6 +1,6 @@ package com.baeldung.cxf.introduction; -import javax.xml.bind.annotation.adapters.XmlAdapter; +import jakarta.xml.bind.annotation.adapters.XmlAdapter; public class StudentAdapter extends XmlAdapter { public StudentImpl marshal(Student student) throws Exception { diff --git a/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/StudentImpl.java b/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/StudentImpl.java index bc9dd27afe..041418befb 100644 --- a/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/StudentImpl.java +++ b/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/StudentImpl.java @@ -1,6 +1,6 @@ package com.baeldung.cxf.introduction; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlType; @XmlType(name = "Student") public class StudentImpl implements Student { diff --git a/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/StudentMap.java b/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/StudentMap.java index 4c40886c42..aa17b0cf4f 100644 --- a/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/StudentMap.java +++ b/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/StudentMap.java @@ -3,8 +3,8 @@ package com.baeldung.cxf.introduction; import java.util.ArrayList; import java.util.List; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlType; @XmlType(name = "StudentMap") public class StudentMap { diff --git a/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/StudentMapAdapter.java b/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/StudentMapAdapter.java index f156676a5f..3bf1bfd2ff 100644 --- a/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/StudentMapAdapter.java +++ b/apache-cxf-modules/cxf-introduction/src/main/java/com/baeldung/cxf/introduction/StudentMapAdapter.java @@ -3,7 +3,7 @@ package com.baeldung.cxf.introduction; import java.util.LinkedHashMap; import java.util.Map; -import javax.xml.bind.annotation.adapters.XmlAdapter; +import jakarta.xml.bind.annotation.adapters.XmlAdapter; public class StudentMapAdapter extends XmlAdapter> { public StudentMap marshal(Map boundMap) throws Exception { diff --git a/apache-cxf-modules/cxf-introduction/src/test/java/com/baeldung/cxf/introduction/StudentLiveTest.java b/apache-cxf-modules/cxf-introduction/src/test/java/com/baeldung/cxf/introduction/StudentLiveTest.java index 60fc0a10e7..89b127a742 100644 --- a/apache-cxf-modules/cxf-introduction/src/test/java/com/baeldung/cxf/introduction/StudentLiveTest.java +++ b/apache-cxf-modules/cxf-introduction/src/test/java/com/baeldung/cxf/introduction/StudentLiveTest.java @@ -5,8 +5,8 @@ import static org.junit.Assert.assertEquals; import java.util.Map; import javax.xml.namespace.QName; -import javax.xml.ws.Service; -import javax.xml.ws.soap.SOAPBinding; +import jakarta.xml.ws.Service; +import jakarta.xml.ws.soap.SOAPBinding; import org.junit.Before; import org.junit.Test; diff --git a/apache-cxf-modules/cxf-jaxrs-implementation/pom.xml b/apache-cxf-modules/cxf-jaxrs-implementation/pom.xml index cc5eba4025..8418853b1e 100644 --- a/apache-cxf-modules/cxf-jaxrs-implementation/pom.xml +++ b/apache-cxf-modules/cxf-jaxrs-implementation/pom.xml @@ -16,12 +16,28 @@ org.apache.cxf cxf-rt-frontend-jaxrs - ${cxf.version} + 4.0.0 org.apache.cxf cxf-rt-transports-http-jetty - ${cxf.version} + 4.0.0 + + + jakarta.xml.ws + jakarta.xml.ws-api + ${jakarta-xml.version} + + + jakarta.jws + jakarta.jws-api + ${jakarta-jws.version} + + + jakarta.platform + jakarta.jakartaee-web-api + ${jakarta-platform.version} + compile org.apache.httpcomponents @@ -50,6 +66,9 @@ 4.5.2 + 4.0.0 + 3.0.0 + 9.0.0 \ No newline at end of file diff --git a/apache-cxf-modules/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/Course.java b/apache-cxf-modules/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/Course.java index dba9b9c661..9f2ba2e837 100644 --- a/apache-cxf-modules/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/Course.java +++ b/apache-cxf-modules/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/Course.java @@ -1,8 +1,8 @@ package com.baeldung.cxf.jaxrs.implementation; -import javax.ws.rs.*; -import javax.ws.rs.core.Response; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.Response; +import jakarta.xml.bind.annotation.XmlRootElement; import java.util.ArrayList; import java.util.List; diff --git a/apache-cxf-modules/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/CourseRepository.java b/apache-cxf-modules/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/CourseRepository.java index a2fd6be435..e527180440 100644 --- a/apache-cxf-modules/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/CourseRepository.java +++ b/apache-cxf-modules/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/CourseRepository.java @@ -1,7 +1,7 @@ package com.baeldung.cxf.jaxrs.implementation; -import javax.ws.rs.*; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.Response; import java.util.ArrayList; import java.util.HashMap; import java.util.List; diff --git a/apache-cxf-modules/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/Student.java b/apache-cxf-modules/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/Student.java index bd3dad0f5e..f6c4e32cdd 100644 --- a/apache-cxf-modules/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/Student.java +++ b/apache-cxf-modules/cxf-jaxrs-implementation/src/main/java/com/baeldung/cxf/jaxrs/implementation/Student.java @@ -1,6 +1,6 @@ package com.baeldung.cxf.jaxrs.implementation; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "Student") public class Student { diff --git a/apache-cxf-modules/cxf-jaxrs-implementation/src/test/java/com/baeldung/cxf/jaxrs/implementation/ServiceLiveTest.java b/apache-cxf-modules/cxf-jaxrs-implementation/src/test/java/com/baeldung/cxf/jaxrs/implementation/ServiceLiveTest.java index 29c34ae16b..a9f71930f2 100644 --- a/apache-cxf-modules/cxf-jaxrs-implementation/src/test/java/com/baeldung/cxf/jaxrs/implementation/ServiceLiveTest.java +++ b/apache-cxf-modules/cxf-jaxrs-implementation/src/test/java/com/baeldung/cxf/jaxrs/implementation/ServiceLiveTest.java @@ -7,7 +7,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; -import javax.xml.bind.JAXB; +import jakarta.xml.bind.JAXB; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpDelete; diff --git a/apache-cxf-modules/cxf-spring/pom.xml b/apache-cxf-modules/cxf-spring/pom.xml index ebbebd7f3b..1c87ae4bfb 100644 --- a/apache-cxf-modules/cxf-spring/pom.xml +++ b/apache-cxf-modules/cxf-spring/pom.xml @@ -40,10 +40,22 @@ spring-webmvc ${spring.version} + + com.sun.xml.ws + jaxws-ri + 2.3.3 + pom + javax.servlet javax.servlet-api - ${javax.servlet-api.version} + 4.0.1 + provided + + + javax.servlet + jstl + 1.2 @@ -103,8 +115,9 @@ - 4.3.4.RELEASE + 5.3.25 1.6.1 + 3.3.2 \ No newline at end of file diff --git a/apache-cxf-modules/sse-jaxrs/sse-jaxrs-client/pom.xml b/apache-cxf-modules/sse-jaxrs/sse-jaxrs-client/pom.xml index 26c8a87c2b..ce2b0059c3 100644 --- a/apache-cxf-modules/sse-jaxrs/sse-jaxrs-client/pom.xml +++ b/apache-cxf-modules/sse-jaxrs/sse-jaxrs-client/pom.xml @@ -23,6 +23,11 @@ cxf-rt-rs-sse ${cxf-version} + + jakarta.ws.rs + jakarta.ws.rs-api + ${jakarta-ws.version} + @@ -55,7 +60,8 @@ - 3.2.0 + 4.0.0 + 3.1.0 \ No newline at end of file diff --git a/apache-cxf-modules/sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientApp.java b/apache-cxf-modules/sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientApp.java index 5d42b3a243..af9a9c7691 100644 --- a/apache-cxf-modules/sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientApp.java +++ b/apache-cxf-modules/sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientApp.java @@ -1,10 +1,10 @@ package com.baeldung.sse.jaxrs.client; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.sse.InboundSseEvent; -import javax.ws.rs.sse.SseEventSource; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.sse.InboundSseEvent; +import jakarta.ws.rs.sse.SseEventSource; import java.util.function.Consumer; public class SseClientApp { diff --git a/apache-cxf-modules/sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientBroadcastApp.java b/apache-cxf-modules/sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientBroadcastApp.java index 9afc187a6d..4e3c236437 100644 --- a/apache-cxf-modules/sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientBroadcastApp.java +++ b/apache-cxf-modules/sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientBroadcastApp.java @@ -1,10 +1,10 @@ package com.baeldung.sse.jaxrs.client; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.sse.InboundSseEvent; -import javax.ws.rs.sse.SseEventSource; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.sse.InboundSseEvent; +import jakarta.ws.rs.sse.SseEventSource; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; diff --git a/apache-cxf-modules/sse-jaxrs/sse-jaxrs-server/pom.xml b/apache-cxf-modules/sse-jaxrs/sse-jaxrs-server/pom.xml index 0467fd9e5d..3bd3e5cb27 100644 --- a/apache-cxf-modules/sse-jaxrs/sse-jaxrs-server/pom.xml +++ b/apache-cxf-modules/sse-jaxrs/sse-jaxrs-server/pom.xml @@ -15,16 +15,14 @@ - javax.ws.rs - javax.ws.rs-api - ${rs-api.version} - provided + jakarta.ws.rs + jakarta.ws.rs-api + ${jakarta-ws.version} - javax.enterprise - cdi-api - ${cdi-api.version} - provided + jakarta.enterprise + jakarta.enterprise.cdi-api + ${jakarta-cdi-api} javax.json.bind @@ -37,6 +35,11 @@ ${project.artifactId} + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + net.wasdev.wlp.maven.plugins liberty-maven-plugin @@ -78,9 +81,10 @@ 2.4.2 false 18.0.0.2 - 2.1 - 2.0 + 3.1.0 + 4.0.1 1.0 + 3.3.2 \ No newline at end of file diff --git a/apache-cxf-modules/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/AppConfig.java b/apache-cxf-modules/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/AppConfig.java index 058d19f045..fdd1af632c 100644 --- a/apache-cxf-modules/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/AppConfig.java +++ b/apache-cxf-modules/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/AppConfig.java @@ -1,7 +1,7 @@ package com.baeldung.sse.jaxrs; -import javax.ws.rs.ApplicationPath; -import javax.ws.rs.core.Application; +import jakarta.ws.rs.ApplicationPath; +import jakarta.ws.rs.core.Application; @ApplicationPath("sse") public class AppConfig extends Application { diff --git a/apache-cxf-modules/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/SseResource.java b/apache-cxf-modules/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/SseResource.java index 1f60168a1b..3e211f109b 100644 --- a/apache-cxf-modules/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/SseResource.java +++ b/apache-cxf-modules/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/SseResource.java @@ -1,15 +1,15 @@ package com.baeldung.sse.jaxrs; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.ws.rs.*; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.sse.OutboundSseEvent; -import javax.ws.rs.sse.Sse; -import javax.ws.rs.sse.SseBroadcaster; -import javax.ws.rs.sse.SseEventSink; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.sse.OutboundSseEvent; +import jakarta.ws.rs.sse.Sse; +import jakarta.ws.rs.sse.SseBroadcaster; +import jakarta.ws.rs.sse.SseEventSink; @ApplicationScoped @Path("stock") diff --git a/apache-cxf-modules/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/StockService.java b/apache-cxf-modules/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/StockService.java index 15818ead5d..721ef35678 100644 --- a/apache-cxf-modules/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/StockService.java +++ b/apache-cxf-modules/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/StockService.java @@ -1,11 +1,11 @@ package com.baeldung.sse.jaxrs; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.context.Initialized; -import javax.enterprise.event.Event; -import javax.enterprise.event.Observes; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.Initialized; +import jakarta.enterprise.event.Event; +import jakarta.enterprise.event.Observes; +import jakarta.inject.Inject; +import jakarta.inject.Named; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; 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 d5051060c4..21d2bedd24 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 @@ -23,8 +23,8 @@ public class GsonSerializeUnitTest { ActorGson rudyYoungblood = new ActorGson("nm2199632", sdf.parse("21-09-1982"), Arrays.asList("Apocalypto", "Beatdown", "Wind Walkers")); Movie movie = new Movie("tt0472043", "Mel Gibson", Arrays.asList(rudyYoungblood)); - String expectedOutput = "{\"imdbId\":\"tt0472043\",\"director\":\"Mel Gibson\",\"actors\":[{\"imdbId\":\"nm2199632\",\"dateOfBirth\":\"Sep 21, 1982 12:00:00 AM\",\"filmography\":[\"Apocalypto\",\"Beatdown\",\"Wind Walkers\"]}]}"; - Assert.assertEquals(new Gson().toJson(movie), expectedOutput); + String expectedOutput = "{\"imdbId\":\"tt0472043\",\"director\":\"Mel Gibson\",\"actors\":[{\"imdbId\":\"nm2199632\",\"dateOfBirth\":\"Sep 21, 1982, 12:00:00 AM\",\"filmography\":[\"Apocalypto\",\"Beatdown\",\"Wind Walkers\"]}]}"; + Assert.assertEquals(expectedOutput, new Gson().toJson(movie)); } @Test diff --git a/json-modules/gson/src/test/java/com/baeldung/gson/serialization/test/GsonSerializationUnitTest.java b/json-modules/gson/src/test/java/com/baeldung/gson/serialization/test/GsonSerializationUnitTest.java index 3b8912d259..13fea27b24 100644 --- a/json-modules/gson/src/test/java/com/baeldung/gson/serialization/test/GsonSerializationUnitTest.java +++ b/json-modules/gson/src/test/java/com/baeldung/gson/serialization/test/GsonSerializationUnitTest.java @@ -1,7 +1,7 @@ package com.baeldung.gson.serialization.test; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; + import java.lang.reflect.Type; import java.util.Collection; @@ -88,7 +88,7 @@ public class GsonSerializationUnitTest { String jsonDate = gson.toJson(sourceDate, sourceDateType); System.out.println("jsonDate:\n" + jsonDate); - String expectedResult = "\"Jan 1, 2000 12:00:00 AM\""; + String expectedResult = "\"Jan 1, 2000, 12:00:00 AM\""; assertEquals(expectedResult, jsonDate); } diff --git a/json-modules/json-2/pom.xml b/json-modules/json-2/pom.xml index ee58ab8b25..82fe689ebf 100644 --- a/json-modules/json-2/pom.xml +++ b/json-modules/json-2/pom.xml @@ -3,7 +3,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 json-2 0.0.1-SNAPSHOT @@ -119,6 +118,11 @@ RELEASE test + + javax.annotation + javax.annotation-api + 1.3.2 + diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index 85edf8b69a..a3e3f4f539 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -58,6 +58,11 @@ crunch-core ${org.apache.crunch.crunch-core.version} + + org.javassist + javassist + ${javassist.version} + org.apache.hadoop hadoop-client @@ -138,6 +143,15 @@ + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + org.apache.maven.plugins maven-assembly-plugin @@ -166,6 +180,8 @@ + 11 + 11 2.3 3.1 1.2.2 @@ -178,6 +194,7 @@ 1.0.0 2.2.0 1.6.0.1 + 3.29.2-GA \ No newline at end of file diff --git a/libraries-data/src/test/java/com/baeldung/crunch/StopWordFilterUnitTest.java b/libraries-data/src/test/java/com/baeldung/crunch/StopWordFilterUnitTest.java index fffefc2bfb..0bb03016d8 100644 --- a/libraries-data/src/test/java/com/baeldung/crunch/StopWordFilterUnitTest.java +++ b/libraries-data/src/test/java/com/baeldung/crunch/StopWordFilterUnitTest.java @@ -7,6 +7,7 @@ import static org.junit.Assert.assertTrue; import org.apache.crunch.FilterFn; import org.apache.crunch.PCollection; import org.apache.crunch.impl.mem.MemPipeline; +import org.junit.Ignore; import org.junit.Test; import com.google.common.collect.ImmutableList; diff --git a/libraries-data/src/test/java/com/baeldung/crunch/ToUpperCaseWithCounterFnUnitTest.java b/libraries-data/src/test/java/com/baeldung/crunch/ToUpperCaseWithCounterFnUnitTest.java index 76294d273d..00c508e605 100644 --- a/libraries-data/src/test/java/com/baeldung/crunch/ToUpperCaseWithCounterFnUnitTest.java +++ b/libraries-data/src/test/java/com/baeldung/crunch/ToUpperCaseWithCounterFnUnitTest.java @@ -6,6 +6,7 @@ import org.apache.crunch.PCollection; import org.apache.crunch.impl.mem.MemPipeline; import org.apache.crunch.types.writable.Writables; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import com.google.common.collect.ImmutableList; diff --git a/patterns-modules/enterprise-patterns/pom.xml b/patterns-modules/enterprise-patterns/pom.xml index 2c59ae2536..0e9edbff67 100644 --- a/patterns-modules/enterprise-patterns/pom.xml +++ b/patterns-modules/enterprise-patterns/pom.xml @@ -65,7 +65,7 @@ 3.7.4 - 2.2.2.RELEASE + 2.7.8 2.17.1 diff --git a/patterns-modules/front-controller/pom.xml b/patterns-modules/front-controller/pom.xml index 84de94cee3..c30a7a666c 100644 --- a/patterns-modules/front-controller/pom.xml +++ b/patterns-modules/front-controller/pom.xml @@ -25,10 +25,12 @@ org.apache.maven.plugins maven-war-plugin + ${maven-war-plugin.version} org.eclipse.jetty jetty-maven-plugin + ${jetty-maven-plugin.version} /front-controller @@ -38,4 +40,9 @@ + + 3.3.2 + 11.0.13 + + \ No newline at end of file diff --git a/patterns-modules/intercepting-filter/pom.xml b/patterns-modules/intercepting-filter/pom.xml index 8028454ee2..cbce56cd6c 100644 --- a/patterns-modules/intercepting-filter/pom.xml +++ b/patterns-modules/intercepting-filter/pom.xml @@ -30,6 +30,7 @@ org.apache.maven.plugins maven-war-plugin + ${maven-war-plugin.version} false @@ -46,4 +47,8 @@ + + 3.3.2 + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index ff29bacfa4..47a1484307 100644 --- a/pom.xml +++ b/pom.xml @@ -330,7 +330,6 @@ parent-spring-5 parent-java - apache-cxf-modules azure checker-plugin @@ -364,15 +363,12 @@ jmh jsf - json-modules kubernetes-modules language-interop libraries-3 - libraries-data - libraries-data-db libraries-security @@ -393,7 +389,6 @@ osgi orika - patterns-modules performance-tests persistence-modules @@ -446,8 +441,6 @@ parent-spring-5 parent-java - saas-modules - server-modules spf4j spring-4 spring-aop @@ -584,7 +577,6 @@ parent-spring-5 parent-java - apache-cxf-modules azure checker-plugin @@ -615,14 +607,13 @@ jmh jsf - json-modules kubernetes-modules language-interop libraries-3 - libraries-data + libraries-data-db @@ -643,7 +634,6 @@ osgi orika - patterns-modules performance-tests persistence-modules @@ -688,8 +678,7 @@ parent-spring-5 parent-java - saas-modules - server-modules + spf4j spring-4 spring-batch @@ -845,9 +834,17 @@ + patterns-modules + json-modules + libraries-data + saas-modules + server-modules + apache-cxf-modules + spring-aop jmeter spring-aop-2 + algorithms-modules apache-libraries apache-poi @@ -1072,6 +1069,12 @@ + patterns-modules + json-modules + libraries-data + saas-modules + server-modules + apache-cxf-modules algorithms-modules apache-libraries apache-poi diff --git a/saas-modules/sentry-servlet/pom.xml b/saas-modules/sentry-servlet/pom.xml index c86fcbce03..2e4f95b5fb 100644 --- a/saas-modules/sentry-servlet/pom.xml +++ b/saas-modules/sentry-servlet/pom.xml @@ -15,6 +15,7 @@ 6.11.0 1.10.4 + 3.3.2 diff --git a/server-modules/wildfly/pom.xml b/server-modules/wildfly/pom.xml index eaec4d176c..af742c7bd3 100644 --- a/server-modules/wildfly/pom.xml +++ b/server-modules/wildfly/pom.xml @@ -13,7 +13,7 @@ com.baeldung parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-2 + ../../parent-boot-2 @@ -63,6 +63,7 @@ org.apache.maven.plugins maven-war-plugin + ${maven-war-plugin.version} @@ -74,4 +75,8 @@ + + 3.3.2 + + \ No newline at end of file From 5bc3c69737a84a2f541c12310c8116ca79d1fa5b Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Mon, 27 Feb 2023 12:37:41 +0200 Subject: [PATCH 549/592] JAVA-18133 Upgrade drools module to JDK 11 (#13543) Co-authored-by: n --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 47a1484307..8cda06c6b7 100644 --- a/pom.xml +++ b/pom.xml @@ -584,7 +584,6 @@ core-java-modules couchbase - drools gradle-modules/gradle/maven-to-gradle From b161aeec27cf4126d9f72c4f61c206634d6fa7dd Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Mon, 27 Feb 2023 12:38:14 +0200 Subject: [PATCH 550/592] JAVA-18264 Update article "A Guide to MongoDB with Java" (#13466) * JAVA-18264 Update article "A Guide to MongoDB with Java" * JAVA-18264 Update with suggestion * JAVA-18264 Additional updates * JAVA-18264 Format pom.xml --------- Co-authored-by: timis1 --- persistence-modules/java-mongodb/pom.xml | 22 ++--- .../main/java/com/baeldung/MongoExample.java | 85 ++++++++++-------- .../java/com/baeldung/bsontojson/Book.java | 4 +- .../baeldung/mongo/CollectionExistence.java | 12 +-- .../mongo/objectid/RetrieveIdExample.java | 5 +- .../mongo/update/MultipleFieldsExample.java | 5 +- .../baeldung/mongo/update/UpdateFields.java | 6 +- .../mongo/update/UpdateMultipleFields.java | 23 ++--- .../com/baeldung/morphia/domain/Book.java | 3 +- .../com/baeldung/tagging/TagRepository.java | 5 +- .../test/java/com/baeldung/AppLiveTest.java | 87 +++++++------------ .../bsontojson/BsonToJsonLiveTest.java | 41 +++++---- .../JSONDateFormatEpochTimeConverter.java | 18 ++++ .../mongo/CollectionExistenceLiveTest.java | 22 ++--- .../morphia/MorphiaIntegrationTest.java | 85 ++++++++---------- .../com/baeldung/tagging/TaggingLiveTest.java | 4 +- .../baeldung/update/UpdateFieldLiveTest.java | 5 +- .../update/UpdateMultipleFieldsLiveTest.java | 5 +- persistence-modules/pom.xml | 3 +- pom.xml | 6 +- 20 files changed, 222 insertions(+), 224 deletions(-) create mode 100644 persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/JSONDateFormatEpochTimeConverter.java diff --git a/persistence-modules/java-mongodb/pom.xml b/persistence-modules/java-mongodb/pom.xml index 2e366d8368..844b9e5bcd 100644 --- a/persistence-modules/java-mongodb/pom.xml +++ b/persistence-modules/java-mongodb/pom.xml @@ -14,20 +14,14 @@ - - de.flapdoodle.embedmongo - de.flapdoodle.embedmongo - ${flapdoodle.version} - test - org.mongodb - mongo-java-driver + mongodb-driver-sync ${mongo.version} dev.morphia.morphia - core + morphia-core ${morphia.version} @@ -42,12 +36,18 @@ ${testcontainers.version} test + + de.flapdoodle.embed + de.flapdoodle.embed.mongo + ${flapdoodle.version} + test + - 3.12.1 - 1.11 - 1.5.3 + 4.8.2 + 4.4.1 + 2.0.0 \ No newline at end of file diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/MongoExample.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/MongoExample.java index 9af1e1f6a4..ef4003fa82 100644 --- a/persistence-modules/java-mongodb/src/main/java/com/baeldung/MongoExample.java +++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/MongoExample.java @@ -1,53 +1,64 @@ package com.baeldung; -import com.mongodb.BasicDBObject; -import com.mongodb.DB; -import com.mongodb.DBCollection; -import com.mongodb.DBCursor; -import com.mongodb.MongoClient; +import java.util.ArrayList; + +import org.bson.Document; + +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; public class MongoExample { public static void main(String[] args) { + try (MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017")) { - MongoClient mongoClient = new MongoClient("localhost", 27017); + MongoDatabase database = mongoClient.getDatabase("myMongoDb"); - DB database = mongoClient.getDB("myMongoDb"); + // print existing databases + mongoClient.listDatabaseNames().forEach(System.out::println); - // print existing databases - mongoClient.getDatabaseNames().forEach(System.out::println); + boolean collectionExists = mongoClient.getDatabase("myMongoDb").listCollectionNames() + .into(new ArrayList<>()).contains("customers"); + if (!collectionExists) { + database.createCollection("customers"); + } - database.createCollection("customers", null); + // print all collections in customers database + database.listCollectionNames().forEach(System.out::println); - // print all collections in customers database - database.getCollectionNames().forEach(System.out::println); + // create data + MongoCollection collection = database.getCollection("customers"); + Document document = new Document(); + document.put("name", "Shubham"); + document.put("company", "Baeldung"); + collection.insertOne(document); - // create data - DBCollection collection = database.getCollection("customers"); - BasicDBObject document = new BasicDBObject(); - document.put("name", "Shubham"); - document.put("company", "Baeldung"); - collection.insert(document); + // update data + Document query = new Document(); + query.put("name", "Shubham"); + Document newDocument = new Document(); + newDocument.put("name", "John"); + Document updateObject = new Document(); + updateObject.put("$set", newDocument); + collection.updateOne(query, updateObject); - // update data - BasicDBObject query = new BasicDBObject(); - query.put("name", "Shubham"); - BasicDBObject newDocument = new BasicDBObject(); - newDocument.put("name", "John"); - BasicDBObject updateObject = new BasicDBObject(); - updateObject.put("$set", newDocument); - collection.update(query, updateObject); + // read data + Document searchQuery = new Document(); + searchQuery.put("name", "John"); + FindIterable cursor = collection.find(searchQuery); + try (final MongoCursor cursorIterator = cursor.cursor()) { + while (cursorIterator.hasNext()) { + System.out.println(cursorIterator.next()); + } + } - // read data - BasicDBObject searchQuery = new BasicDBObject(); - searchQuery.put("name", "John"); - DBCursor cursor = collection.find(searchQuery); - while (cursor.hasNext()) { - System.out.println(cursor.next()); + // delete data + Document deleteQuery = new Document(); + deleteQuery.put("name", "John"); + collection.deleteOne(deleteQuery); } - - // delete data - BasicDBObject deleteQuery = new BasicDBObject(); - deleteQuery.put("name", "John"); - collection.remove(deleteQuery); } } diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/bsontojson/Book.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/bsontojson/Book.java index 44e4ecb539..c57f759a95 100644 --- a/persistence-modules/java-mongodb/src/main/java/com/baeldung/bsontojson/Book.java +++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/bsontojson/Book.java @@ -1,11 +1,9 @@ package com.baeldung.bsontojson; -import java.time.LocalDate; import java.time.LocalDateTime; import java.util.HashSet; import java.util.Set; -import dev.morphia.annotations.Embedded; import dev.morphia.annotations.Entity; import dev.morphia.annotations.Field; import dev.morphia.annotations.Id; @@ -25,7 +23,7 @@ public class Book { @Property private String title; private String author; - @Embedded + private Publisher publisher; @Property("price") private double cost; diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/CollectionExistence.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/CollectionExistence.java index 074913af4e..c94a7c042a 100644 --- a/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/CollectionExistence.java +++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/CollectionExistence.java @@ -4,8 +4,8 @@ import java.util.ArrayList; import org.bson.Document; -import com.mongodb.DB; -import com.mongodb.MongoClient; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; @@ -18,7 +18,7 @@ public class CollectionExistence { public static void setUp() { if (mongoClient == null) { - mongoClient = new MongoClient("localhost", 27017); + mongoClient = MongoClients.create("mongodb://localhost:27017"); } databaseName = "baeldung"; testCollectionName = "student"; @@ -26,9 +26,9 @@ public class CollectionExistence { public static void collectionExistsSolution() { - DB db = mongoClient.getDB(databaseName); + MongoDatabase db = mongoClient.getDatabase(databaseName); - System.out.println("collectionName " + testCollectionName + db.collectionExists(testCollectionName)); + System.out.println("collectionName " + testCollectionName + db.listCollectionNames().into(new ArrayList<>()).contains(testCollectionName)); } @@ -62,7 +62,7 @@ public class CollectionExistence { MongoCollection collection = database.getCollection(testCollectionName); - System.out.println(collection.count()); + System.out.println(collection.countDocuments()); } diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/objectid/RetrieveIdExample.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/objectid/RetrieveIdExample.java index 74279bbfcd..5ccabc9326 100644 --- a/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/objectid/RetrieveIdExample.java +++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/objectid/RetrieveIdExample.java @@ -5,7 +5,8 @@ import java.util.Date; import org.bson.Document; import org.bson.types.ObjectId; -import com.mongodb.MongoClient; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; @@ -13,7 +14,7 @@ public class RetrieveIdExample { public static void main(String[] args) { - try ( MongoClient mongoClient = new MongoClient("localhost", 27017) ) { + try ( MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017") ) { MongoDatabase database = mongoClient.getDatabase("myMongoDb"); MongoCollection collection = database.getCollection("example"); diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/MultipleFieldsExample.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/MultipleFieldsExample.java index ebc56cbfd0..9ad62bc1c7 100644 --- a/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/MultipleFieldsExample.java +++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/MultipleFieldsExample.java @@ -3,7 +3,8 @@ package com.baeldung.mongo.update; import org.bson.Document; import com.mongodb.BasicDBObject; -import com.mongodb.MongoClient; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.result.UpdateResult; @@ -16,7 +17,7 @@ public class MultipleFieldsExample { // Connect to cluster (default is localhost:27017) // - MongoClient mongoClient = new MongoClient("localhost", 27017); + MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017"); MongoDatabase database = mongoClient.getDatabase("baeldung"); MongoCollection collection = database.getCollection("employee"); diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/UpdateFields.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/UpdateFields.java index a1b051e74c..594d535245 100644 --- a/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/UpdateFields.java +++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/UpdateFields.java @@ -2,7 +2,8 @@ package com.baeldung.mongo.update; import org.bson.Document; -import com.mongodb.MongoClient; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; @@ -83,10 +84,9 @@ public class UpdateFields { public static void setup() { if (mongoClient == null) { - mongoClient = new MongoClient("localhost", 27017); + mongoClient = MongoClients.create("mongodb://localhost:27017"); database = mongoClient.getDatabase("baeldung"); collection = database.getCollection("student"); - } } diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/UpdateMultipleFields.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/UpdateMultipleFields.java index 96dd086ed7..08fdce68d6 100644 --- a/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/UpdateMultipleFields.java +++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/UpdateMultipleFields.java @@ -2,7 +2,8 @@ package com.baeldung.mongo.update; import org.bson.Document; -import com.mongodb.MongoClient; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; @@ -16,19 +17,19 @@ public class UpdateMultipleFields { // // Connect to cluster // + try (MongoClient mongoClient = MongoClients.create("mongodb://localhost:27007");) { + MongoDatabase database = mongoClient.getDatabase("baeldung"); + MongoCollection collection = database.getCollection("employee"); - MongoClient mongoClient = new MongoClient("localhost", 27007); - MongoDatabase database = mongoClient.getDatabase("baeldung"); - MongoCollection collection = database.getCollection("employee"); + // + // Update query + // - // - // Update query - // + UpdateResult updateResult = collection.updateMany(Filters.eq("employee_id", 794875), Updates.combine(Updates.set("department_id", 4), Updates.set("job", "Sales Manager"))); - UpdateResult updateResult = collection.updateMany(Filters.eq("employee_id", 794875), Updates.combine(Updates.set("department_id", 4), Updates.set("job", "Sales Manager"))); - - System.out.println("updateResult:- " + updateResult); - System.out.println("updateResult:- " + updateResult.getModifiedCount()); + System.out.println("updateResult:- " + updateResult); + System.out.println("updateResult:- " + updateResult.getModifiedCount()); + } } diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/morphia/domain/Book.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/morphia/domain/Book.java index 4ed2ab8580..b79550dcd1 100644 --- a/persistence-modules/java-mongodb/src/main/java/com/baeldung/morphia/domain/Book.java +++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/morphia/domain/Book.java @@ -1,6 +1,5 @@ package com.baeldung.morphia.domain; -import java.time.LocalDate; import java.time.LocalDateTime; import java.util.HashSet; import java.util.Set; @@ -25,7 +24,7 @@ public class Book { @Property private String title; private String author; - @Embedded + private Publisher publisher; @Property("price") private double cost; diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/tagging/TagRepository.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/tagging/TagRepository.java index d27d48c743..44b5d461bc 100644 --- a/persistence-modules/java-mongodb/src/main/java/com/baeldung/tagging/TagRepository.java +++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/tagging/TagRepository.java @@ -10,8 +10,9 @@ import org.bson.Document; import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; -import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; @@ -45,7 +46,7 @@ public class TagRepository implements Closeable { * Instantiates a new TagRepository by opening the DB connection. */ public TagRepository() { - mongoClient = new MongoClient("localhost", 27018); + mongoClient = MongoClients.create("mongodb://localhost:27018"); MongoDatabase database = mongoClient.getDatabase("blog"); collection = database.getCollection("posts"); } diff --git a/persistence-modules/java-mongodb/src/test/java/com/baeldung/AppLiveTest.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/AppLiveTest.java index 7692a37d03..2abecdbd48 100644 --- a/persistence-modules/java-mongodb/src/test/java/com/baeldung/AppLiveTest.java +++ b/persistence-modules/java-mongodb/src/test/java/com/baeldung/AppLiveTest.java @@ -2,71 +2,50 @@ package com.baeldung; import static org.junit.Assert.assertEquals; -import org.junit.After; -import org.junit.Before; +import org.bson.Document; import org.junit.Test; -import com.mongodb.BasicDBObject; -import com.mongodb.DB; -import com.mongodb.DBCollection; -import com.mongodb.DBCursor; -import com.mongodb.Mongo; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; -import de.flapdoodle.embedmongo.MongoDBRuntime; -import de.flapdoodle.embedmongo.MongodExecutable; -import de.flapdoodle.embedmongo.MongodProcess; -import de.flapdoodle.embedmongo.config.MongodConfig; -import de.flapdoodle.embedmongo.distribution.Version; -import de.flapdoodle.embedmongo.runtime.Network; +import de.flapdoodle.embed.mongo.distribution.Version; +import de.flapdoodle.embed.mongo.transitions.Mongod; +import de.flapdoodle.embed.mongo.transitions.RunningMongodProcess; +import de.flapdoodle.reverse.TransitionWalker; public class AppLiveTest { private static final String DB_NAME = "myMongoDb"; - private MongodExecutable mongodExe; - private MongodProcess mongod; - private Mongo mongo; - private DB db; - private DBCollection collection; - - @Before - public void setup() throws Exception { - // Creating Mongodbruntime instance - MongoDBRuntime runtime = MongoDBRuntime.getDefaultInstance(); - - // Creating MongodbExecutable - mongodExe = runtime.prepare(new MongodConfig(Version.V2_0_1, 12345, Network.localhostIsIPv6())); - - // Starting Mongodb - mongod = mongodExe.start(); - mongo = new Mongo("localhost", 12345); - - // Creating DB - db = mongo.getDB(DB_NAME); - - // Creating collection Object and adding values - collection = db.getCollection("customers"); - } - - @After - public void teardown() throws Exception { - mongod.stop(); - mongodExe.cleanup(); - } @Test public void testAddressPersistance() { - BasicDBObject contact = new BasicDBObject(); - contact.put("name", "John"); - contact.put("company", "Baeldung"); + try (TransitionWalker.ReachedState running = Mongod.instance().start(Version.V6_0_3)) { + try (MongoClient mongo = MongoClients.create("mongodb://" + running.current().getServerAddress().getHost() + ":" + running.current().getServerAddress().getPort())) { + // Creating DB + MongoDatabase db = mongo.getDatabase(DB_NAME); - // Inserting document - collection.insert(contact); - DBCursor cursorDoc = collection.find(); - BasicDBObject contact1 = new BasicDBObject(); - while (cursorDoc.hasNext()) { - contact1 = (BasicDBObject) cursorDoc.next(); - System.out.println(contact1); + // Creating collection Object and adding values + MongoCollection collection = db.getCollection("customers"); + + Document contact = new Document(); + contact.put("name", "John"); + contact.put("company", "Baeldung"); + + // Inserting document + collection.insertOne(contact); + FindIterable cursorDoc = collection.find(); + Document contact1 = new Document(); + final MongoCursor cursor = cursorDoc.cursor(); + while (cursor.hasNext()) { + contact1 = cursor.next(); + System.out.println(contact1); + } + assertEquals(contact1.get("name"), "John"); + } } - assertEquals(contact1.get("name"), "John"); } } \ No newline at end of file diff --git a/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonLiveTest.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonLiveTest.java index 0548119d7a..e2b53436b3 100644 --- a/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonLiveTest.java +++ b/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/BsonToJsonLiveTest.java @@ -1,5 +1,6 @@ package com.baeldung.bsontojson; +import static dev.morphia.query.experimental.filters.Filters.eq; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -14,10 +15,12 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import com.mongodb.MongoClient; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; import com.mongodb.client.MongoDatabase; import dev.morphia.Datastore; +import dev.morphia.DeleteOptions; import dev.morphia.Morphia; public class BsonToJsonLiveTest { @@ -27,9 +30,8 @@ public class BsonToJsonLiveTest { @BeforeClass public static void setUp() { - Morphia morphia = new Morphia(); - morphia.mapPackage("com.baeldung.bsontojson"); - datastore = morphia.createDatastore(new MongoClient(), DB_NAME); + datastore = Morphia.createDatastore(MongoClients.create(), DB_NAME); + datastore.getMapper().mapPackage("com.baeldung.bsontojson"); datastore.ensureIndexes(); datastore.save(new Book() @@ -44,25 +46,33 @@ public class BsonToJsonLiveTest { @AfterClass public static void tearDown() { - datastore.delete(datastore.createQuery(Book.class)); + datastore.find(Book.class) + .filter(eq("isbn", "isbn")) + .filter(eq("title", "title")) + .filter(eq("author", "author")) + .filter(eq("cost", "3.95")) + .delete(new DeleteOptions().multi(true)); } @Test public void givenBsonDocument_whenUsingStandardJsonTransformation_thenJsonDateIsObjectEpochTime() { String json; - try (MongoClient mongoClient = new MongoClient()) { + try (MongoClient mongoClient = MongoClients.create()) { MongoDatabase mongoDatabase = mongoClient.getDatabase(DB_NAME); Document bson = mongoDatabase.getCollection("Books").find().first(); - json = bson.toJson(); + json = bson.toJson(JsonWriterSettings + .builder() + .dateTimeConverter(new JSONDateFormatEpochTimeConverter()) + .build()); } String expectedJson = "{\"_id\": \"isbn\", " + - "\"className\": \"com.baeldung.bsontojson.Book\", " + + "\"_t\": \"Book\", " + "\"title\": \"title\", " + "\"author\": \"author\", " + "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + - "\"name\": \"publisher\"}, " + + "\"_t\": \"Publisher\", \"name\": \"publisher\"}, " + "\"price\": 3.95, " + "\"publishDate\": {\"$date\": 1577898812000}}"; @@ -71,12 +81,11 @@ public class BsonToJsonLiveTest { assertEquals(expectedJson, json); } - @Test public void givenBsonDocument_whenUsingRelaxedJsonTransformation_thenJsonDateIsObjectIsoDate() { String json; - try (MongoClient mongoClient = new MongoClient()) { + try (MongoClient mongoClient = MongoClients.create()) { MongoDatabase mongoDatabase = mongoClient.getDatabase(DB_NAME); Document bson = mongoDatabase.getCollection("Books").find().first(); json = bson.toJson(JsonWriterSettings @@ -86,11 +95,11 @@ public class BsonToJsonLiveTest { } String expectedJson = "{\"_id\": \"isbn\", " + - "\"className\": \"com.baeldung.bsontojson.Book\", " + + "\"_t\": \"Book\", " + "\"title\": \"title\", " + "\"author\": \"author\", " + "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + - "\"name\": \"publisher\"}, " + + "\"_t\": \"Publisher\", \"name\": \"publisher\"}, " + "\"price\": 3.95, " + "\"publishDate\": {\"$date\": \"2020-01-01T17:13:32Z\"}}"; @@ -103,7 +112,7 @@ public class BsonToJsonLiveTest { public void givenBsonDocument_whenUsingCustomJsonTransformation_thenJsonDateIsStringField() { String json; - try (MongoClient mongoClient = new MongoClient()) { + try (MongoClient mongoClient = MongoClients.create()) { MongoDatabase mongoDatabase = mongoClient.getDatabase(DB_NAME); Document bson = mongoDatabase.getCollection("Books").find().first(); json = bson.toJson(JsonWriterSettings @@ -113,11 +122,11 @@ public class BsonToJsonLiveTest { } String expectedJson = "{\"_id\": \"isbn\", " + - "\"className\": \"com.baeldung.bsontojson.Book\", " + + "\"_t\": \"Book\", " + "\"title\": \"title\", " + "\"author\": \"author\", " + "\"publisher\": {\"_id\": {\"$oid\": \"fffffffffffffffffffffffa\"}, " + - "\"name\": \"publisher\"}, " + + "\"_t\": \"Publisher\", \"name\": \"publisher\"}, " + "\"price\": 3.95, " + "\"publishDate\": \"2020-01-01T17:13:32Z\"}"; diff --git a/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/JSONDateFormatEpochTimeConverter.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/JSONDateFormatEpochTimeConverter.java new file mode 100644 index 0000000000..7f3a4f936f --- /dev/null +++ b/persistence-modules/java-mongodb/src/test/java/com/baeldung/bsontojson/JSONDateFormatEpochTimeConverter.java @@ -0,0 +1,18 @@ +package com.baeldung.bsontojson; + +import org.bson.json.Converter; +import org.bson.json.StrictJsonWriter; + +/** + * Convertor to epoch time + */ +public class JSONDateFormatEpochTimeConverter implements Converter { + + @Override + public void convert(Long value, StrictJsonWriter writer) { + writer.writeStartObject(); + writer.writeName("$date"); + writer.writeNumber(String.valueOf(value)); + writer.writeEndObject(); + } +} diff --git a/persistence-modules/java-mongodb/src/test/java/com/baeldung/mongo/CollectionExistenceLiveTest.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/mongo/CollectionExistenceLiveTest.java index ad839d1219..5be97bcb25 100644 --- a/persistence-modules/java-mongodb/src/test/java/com/baeldung/mongo/CollectionExistenceLiveTest.java +++ b/persistence-modules/java-mongodb/src/test/java/com/baeldung/mongo/CollectionExistenceLiveTest.java @@ -8,8 +8,8 @@ import org.bson.Document; import org.junit.Before; import org.junit.Test; -import com.mongodb.DB; -import com.mongodb.MongoClient; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; @@ -22,7 +22,7 @@ public class CollectionExistenceLiveTest { @Before public void setup() { if (mongoClient == null) { - mongoClient = new MongoClient("localhost", 27017); + mongoClient = MongoClients.create("mongodb://localhost:27017"); databaseName = "baeldung"; testCollectionName = "student"; @@ -58,28 +58,16 @@ public class CollectionExistenceLiveTest { } - @Test - public void givenCollectionExists_whenCollectionAlreadyExists_thenCheckingForCollectionExistence() { - - DB db = mongoClient.getDB(databaseName); - Boolean collectionStatus = db.collectionExists(testCollectionName); - - Boolean expectedStatus = true; - assertEquals(expectedStatus, collectionStatus); - - } - @Test public void givenListCollectionNames_whenCollectionAlreadyExists_thenCheckingForCollectionExistence() { MongoDatabase database = mongoClient.getDatabase(databaseName); boolean collectionExists = database.listCollectionNames() - .into(new ArrayList()) + .into(new ArrayList<>()) .contains(testCollectionName); Boolean expectedStatus = true; assertEquals(expectedStatus, collectionExists); - } @Test @@ -88,7 +76,7 @@ public class CollectionExistenceLiveTest { MongoDatabase database = mongoClient.getDatabase(databaseName); MongoCollection collection = database.getCollection(testCollectionName); - Boolean collectionExists = collection.count() > 0 ? true : false; + Boolean collectionExists = collection.countDocuments() > 0 ? true : false; Boolean expectedStatus = false; assertEquals(expectedStatus, collectionExists); diff --git a/persistence-modules/java-mongodb/src/test/java/com/baeldung/morphia/MorphiaIntegrationTest.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/morphia/MorphiaIntegrationTest.java index f508c5f525..d702c691d6 100644 --- a/persistence-modules/java-mongodb/src/test/java/com/baeldung/morphia/MorphiaIntegrationTest.java +++ b/persistence-modules/java-mongodb/src/test/java/com/baeldung/morphia/MorphiaIntegrationTest.java @@ -2,39 +2,44 @@ package com.baeldung.morphia; import static dev.morphia.aggregation.Group.grouping; import static dev.morphia.aggregation.Group.push; +import static dev.morphia.query.experimental.filters.Filters.eq; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.Iterator; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; import org.bson.types.ObjectId; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; import com.baeldung.morphia.domain.Author; import com.baeldung.morphia.domain.Book; import com.baeldung.morphia.domain.Publisher; -import com.mongodb.MongoClient; +import com.mongodb.client.MongoClients; +import com.mongodb.client.model.ReturnDocument; import dev.morphia.Datastore; +import dev.morphia.DeleteOptions; +import dev.morphia.ModifyOptions; import dev.morphia.Morphia; +import dev.morphia.query.FindOptions; import dev.morphia.query.Query; -import dev.morphia.query.UpdateOperations; +import dev.morphia.query.experimental.updates.UpdateOperators; -@Ignore public class MorphiaIntegrationTest { private static Datastore datastore; private static ObjectId id = new ObjectId(); - @BeforeClass + @BeforeClass public static void setUp() { - Morphia morphia = new Morphia(); - morphia.mapPackage("com.baeldung.morphia"); - datastore = morphia.createDatastore(new MongoClient(), "library"); + datastore = Morphia.createDatastore(MongoClients.create(), "library"); + datastore.getMapper().mapPackage("com.baeldung.morphia"); datastore.ensureIndexes(); } @@ -47,11 +52,11 @@ public class MorphiaIntegrationTest { datastore.save(companionBook); datastore.save(book); - List books = datastore.createQuery(Book.class) - .field("title") - .contains("Learning Java") - .find() - .toList(); + Query booksQuery = datastore.find(Book.class) + .filter(eq("title", "Learning Java")); + List books = StreamSupport + .stream(booksQuery.spliterator(), true) + .collect(Collectors.toList()); assertEquals(1, books.size()); assertEquals(book, books.get(0)); } @@ -61,19 +66,13 @@ public class MorphiaIntegrationTest { Publisher publisher = new Publisher(id, "Awsome Publisher"); Book book = new Book("9781565927186", "Learning Java", "Tom Kirkman", 3.95, publisher); datastore.save(book); - Query query = datastore.createQuery(Book.class) - .field("title") - .contains("Learning Java"); - UpdateOperations updates = datastore.createUpdateOperations(Book.class) - .inc("price", 1); - datastore.update(query, updates); - List books = datastore.createQuery(Book.class) - .field("title") - .contains("Learning Java") - .find() - .toList(); - assertEquals(4.95, books.get(0) - .getCost()); + + final Book execute = datastore.find(Book.class) + .filter(eq("title", "Learning Java")) + .modify(UpdateOperators.set("price", 4.95)) + .execute(new ModifyOptions().returnDocument(ReturnDocument.AFTER)); + + assertEquals(4.95, execute.getCost()); } @Test @@ -81,16 +80,12 @@ public class MorphiaIntegrationTest { Publisher publisher = new Publisher(id, "Awsome Publisher"); Book book = new Book("9781565927186", "Learning Java", "Tom Kirkman", 3.95, publisher); datastore.save(book); - Query query = datastore.createQuery(Book.class) - .field("title") - .contains("Learning Java"); - datastore.delete(query); - List books = datastore.createQuery(Book.class) - .field("title") - .contains("Learning Java") - .find() - .toList(); - assertEquals(0, books.size()); + datastore.find(Book.class) + .filter(eq("title", "Learning Java")) + .delete(new DeleteOptions().multi(true)); + Query books = datastore.find(Book.class) + .filter(eq("title", "Learning Java")); + assertFalse(books.iterator().hasNext()); } @Test @@ -107,7 +102,6 @@ public class MorphiaIntegrationTest { .out(Author.class); assertTrue(authors.hasNext()); - } @Test @@ -115,17 +109,12 @@ public class MorphiaIntegrationTest { Publisher publisher = new Publisher(id, "Awsome Publisher"); Book book = new Book("9781565927186", "Learning Java", "Tom Kirkman", 3.95, publisher); datastore.save(book); - List books = datastore.createQuery(Book.class) - .field("title") - .contains("Learning Java") - .project("title", true) - .find() - .toList(); - assertEquals(books.size(), 1); - assertEquals("Learning Java", books.get(0) - .getTitle()); - assertNull(books.get(0) - .getAuthor()); + List books = datastore.find(Book.class) + .filter(eq("title", "Learning Java")) + .iterator(new FindOptions().projection().include("title")).toList(); + assertEquals( 1, books.size()); + assertEquals("Learning Java", books.get(0).getTitle()); + assertNull(books.get(0).getAuthor()); } } diff --git a/persistence-modules/java-mongodb/src/test/java/com/baeldung/tagging/TaggingLiveTest.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/tagging/TaggingLiveTest.java index edd8e22775..2a7afbd753 100644 --- a/persistence-modules/java-mongodb/src/test/java/com/baeldung/tagging/TaggingLiveTest.java +++ b/persistence-modules/java-mongodb/src/test/java/com/baeldung/tagging/TaggingLiveTest.java @@ -100,9 +100,7 @@ public class TaggingLiveTest { results.forEach(System.out::println); Assert.assertEquals(1, results.size()); - results.forEach(post -> { - Assert.assertFalse(post.getTags().contains("MongoDB")); - }); + results.forEach(post -> Assert.assertFalse(post.getTags().contains("MongoDB"))); } /** diff --git a/persistence-modules/java-mongodb/src/test/java/com/baeldung/update/UpdateFieldLiveTest.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/update/UpdateFieldLiveTest.java index 47114e1f1a..ef725a9435 100644 --- a/persistence-modules/java-mongodb/src/test/java/com/baeldung/update/UpdateFieldLiveTest.java +++ b/persistence-modules/java-mongodb/src/test/java/com/baeldung/update/UpdateFieldLiveTest.java @@ -8,7 +8,8 @@ import org.bson.Document; import org.junit.BeforeClass; import org.junit.Test; -import com.mongodb.MongoClient; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; @@ -27,7 +28,7 @@ public class UpdateFieldLiveTest { @BeforeClass public static void setup() { if (mongoClient == null) { - mongoClient = new MongoClient("localhost", 27017); + mongoClient = MongoClients.create("mongodb://localhost:27017"); db = mongoClient.getDatabase("baeldung"); collection = db.getCollection("student"); diff --git a/persistence-modules/java-mongodb/src/test/java/com/baeldung/update/UpdateMultipleFieldsLiveTest.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/update/UpdateMultipleFieldsLiveTest.java index d06de23423..19edda5870 100644 --- a/persistence-modules/java-mongodb/src/test/java/com/baeldung/update/UpdateMultipleFieldsLiveTest.java +++ b/persistence-modules/java-mongodb/src/test/java/com/baeldung/update/UpdateMultipleFieldsLiveTest.java @@ -8,7 +8,8 @@ import org.junit.Before; import org.junit.Test; import com.mongodb.BasicDBObject; -import com.mongodb.MongoClient; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; @@ -23,7 +24,7 @@ public class UpdateMultipleFieldsLiveTest { @Before public void setup() { if (mongoClient == null) { - mongoClient = new MongoClient("localhost", 27017); + mongoClient = MongoClients.create("mongodb://localhost:27017"); db = mongoClient.getDatabase("baeldung"); collection = db.getCollection("employee"); diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 8c191b0abd..9606da4594 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -43,7 +43,8 @@ java-jpa java-jpa-2 java-jpa-3 - java-mongodb + + java-mongodb-2 java-mongodb-3 java-mongodb-queries diff --git a/pom.xml b/pom.xml index 8cda06c6b7..651ed36d1a 100644 --- a/pom.xml +++ b/pom.xml @@ -1014,7 +1014,7 @@ spring-5-webflux-2 spring-activiti spring-batch-2 - spring-boot-modules/spring-caching-2 + spring-boot-modules/spring-caching-2 spring-core-2 spring-core-3 spring-core-5 @@ -1034,6 +1034,7 @@ tensorflow-java xstream webrtc + persistence-modules/java-mongodb messaging-modules/spring-apache-camel @@ -1249,7 +1250,7 @@ spring-5-webflux-2 spring-activiti spring-batch-2 - spring-boot-modules/spring-caching-2 + spring-boot-modules/spring-caching-2 spring-core-2 spring-core-3 spring-core-5 @@ -1269,6 +1270,7 @@ tensorflow-java xstream webrtc + persistence-modules/java-mongodb libraries-2 messaging-modules/spring-apache-camel From c61004285c24ef0f24e2fe550266abe93c7349f0 Mon Sep 17 00:00:00 2001 From: exaucae Date: Mon, 27 Feb 2023 12:16:25 +0000 Subject: [PATCH 551/592] fix: use baeldung intellij formatter --- .../com/baeldung/java/panama/core/Greetings.java | 13 ++++++------- .../baeldung/java/panama/core/MemoryAllocation.java | 5 +---- .../com/baeldung/java/panama/core/MemoryLayout.java | 9 ++------- .../baeldung/java/panama/jextract/Greetings.java | 6 +++--- 4 files changed, 12 insertions(+), 21 deletions(-) diff --git a/java-panama/src/main/java/com/baeldung/java/panama/core/Greetings.java b/java-panama/src/main/java/com/baeldung/java/panama/core/Greetings.java index 7c210f1216..e6d596dbf0 100644 --- a/java-panama/src/main/java/com/baeldung/java/panama/core/Greetings.java +++ b/java-panama/src/main/java/com/baeldung/java/panama/core/Greetings.java @@ -5,7 +5,6 @@ import java.lang.invoke.MethodHandle; import static java.lang.foreign.ValueLayout.*; - public class Greetings { public static void main(String[] args) throws Throwable { @@ -20,14 +19,14 @@ public class Greetings { FunctionDescriptor descriptor = FunctionDescriptor.of(JAVA_INT, ADDRESS); MethodHandle methodHandle = loaderLookup.lookup(symbolName) - .or(() -> stdlibLookup.lookup(symbolName)) - .map(symbolSegment -> nativeLinker.downcallHandle(symbolSegment, descriptor)) - .orElse(null); + .or(() -> stdlibLookup.lookup(symbolName)) + .map(symbolSegment -> nativeLinker.downcallHandle(symbolSegment, descriptor)) + .orElse(null); - - if(methodHandle == null){ + if (methodHandle == null) { throw new NoSuchMethodError("Method Handle was not found"); - }; + } + ; try (MemorySession memorySession = MemorySession.openConfined()) { MemorySegment greetingSegment = memorySession.allocateUtf8String(greeting); diff --git a/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryAllocation.java b/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryAllocation.java index 710f1a1e87..557a0695cc 100644 --- a/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryAllocation.java +++ b/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryAllocation.java @@ -5,15 +5,12 @@ import java.lang.foreign.MemorySession; import java.lang.foreign.ValueLayout; import java.lang.foreign.SegmentAllocator; - - public class MemoryAllocation { public static void main(String[] args) throws Throwable { - try (MemorySession session = MemorySession.openConfined()) { - String[] greetingStrings = {"hello", "world", "panama", "baeldung"}; + String[] greetingStrings = { "hello", "world", "panama", "baeldung" }; SegmentAllocator allocator = SegmentAllocator.implicitAllocator(); MemorySegment offHeapSegment = allocator.allocateArray(ValueLayout.ADDRESS, greetingStrings.length); for (int i = 0; i < greetingStrings.length; i++) { diff --git a/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryLayout.java b/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryLayout.java index 620577f887..647247b54b 100644 --- a/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryLayout.java +++ b/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryLayout.java @@ -10,18 +10,13 @@ import static java.lang.foreign.MemoryLayout.sequenceLayout; import static java.lang.foreign.MemoryLayout.structLayout; import static java.lang.foreign.ValueLayout.*; - public class MemoryLayout { public static void main(String[] args) { - GroupLayout pointLayout = structLayout( - JAVA_DOUBLE.withName("x"), - JAVA_DOUBLE.withName("y") - ); + GroupLayout pointLayout = structLayout(JAVA_DOUBLE.withName("x"), JAVA_DOUBLE.withName("y")); - SequenceLayout ptsLayout = sequenceLayout(10, - pointLayout); + SequenceLayout ptsLayout = sequenceLayout(10, pointLayout); VarHandle xvarHandle = pointLayout.varHandle(PathElement.groupElement("x")); VarHandle yvarHandle = pointLayout.varHandle(PathElement.groupElement("y")); diff --git a/java-panama/src/main/java/com/baeldung/java/panama/jextract/Greetings.java b/java-panama/src/main/java/com/baeldung/java/panama/jextract/Greetings.java index 90d8e8f253..43b575d52a 100644 --- a/java-panama/src/main/java/com/baeldung/java/panama/jextract/Greetings.java +++ b/java-panama/src/main/java/com/baeldung/java/panama/jextract/Greetings.java @@ -2,7 +2,7 @@ package com.baeldung.java.panama.jextract; import java.lang.foreign.MemorySegment; import java.lang.foreign.MemorySession; -// Generate JExtract bingings before uncommenting +// Generate JExtract bindings before uncommenting // import static foreign.c.stdio_h.printf; public class Greetings { @@ -12,8 +12,8 @@ public class Greetings { try (MemorySession memorySession = MemorySession.openConfined()) { MemorySegment greetingSegment = memorySession.allocateUtf8String(greeting); - // Generate JExtract bingings before uncommenting - // printf(greetingSegment); + // Generate JExtract bingings before uncommenting + // printf(greetingSegment); } } } From b74bbc518c471b2545766120044c538f6aae51f9 Mon Sep 17 00:00:00 2001 From: exaucae Date: Mon, 27 Feb 2023 13:44:33 +0000 Subject: [PATCH 552/592] fix: correct imports --- .../com/baeldung/java/panama/core/Greetings.java | 12 ++++++++---- .../baeldung/java/panama/core/MemoryAllocation.java | 2 +- .../com/baeldung/java/panama/core/MemoryLayout.java | 10 ++++++---- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/java-panama/src/main/java/com/baeldung/java/panama/core/Greetings.java b/java-panama/src/main/java/com/baeldung/java/panama/core/Greetings.java index e6d596dbf0..1937bd65e9 100644 --- a/java-panama/src/main/java/com/baeldung/java/panama/core/Greetings.java +++ b/java-panama/src/main/java/com/baeldung/java/panama/core/Greetings.java @@ -1,9 +1,14 @@ package com.baeldung.java.panama.core; -import java.lang.foreign.*; -import java.lang.invoke.MethodHandle; +import static java.lang.foreign.ValueLayout.ADDRESS; +import static java.lang.foreign.ValueLayout.JAVA_INT; -import static java.lang.foreign.ValueLayout.*; +import java.lang.foreign.FunctionDescriptor; +import java.lang.foreign.Linker; +import java.lang.foreign.MemorySegment; +import java.lang.foreign.MemorySession; +import java.lang.foreign.SymbolLookup; +import java.lang.invoke.MethodHandle; public class Greetings { @@ -26,7 +31,6 @@ public class Greetings { if (methodHandle == null) { throw new NoSuchMethodError("Method Handle was not found"); } - ; try (MemorySession memorySession = MemorySession.openConfined()) { MemorySegment greetingSegment = memorySession.allocateUtf8String(greeting); diff --git a/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryAllocation.java b/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryAllocation.java index 557a0695cc..239b25b69e 100644 --- a/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryAllocation.java +++ b/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryAllocation.java @@ -2,8 +2,8 @@ package com.baeldung.java.panama.core; import java.lang.foreign.MemorySegment; import java.lang.foreign.MemorySession; -import java.lang.foreign.ValueLayout; import java.lang.foreign.SegmentAllocator; +import java.lang.foreign.ValueLayout; public class MemoryAllocation { diff --git a/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryLayout.java b/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryLayout.java index 647247b54b..612997e35e 100644 --- a/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryLayout.java +++ b/java-panama/src/main/java/com/baeldung/java/panama/core/MemoryLayout.java @@ -1,15 +1,17 @@ package com.baeldung.java.panama.core; +import static java.lang.foreign.MemoryLayout.sequenceLayout; +import static java.lang.foreign.MemoryLayout.structLayout; +import static java.lang.foreign.ValueLayout.JAVA_DOUBLE; +import static java.lang.foreign.ValueLayout.JAVA_FLOAT; +import static java.lang.foreign.ValueLayout.PathElement; + import java.lang.foreign.GroupLayout; import java.lang.foreign.MemorySegment; import java.lang.foreign.MemorySession; import java.lang.foreign.SequenceLayout; import java.lang.invoke.VarHandle; -import static java.lang.foreign.MemoryLayout.sequenceLayout; -import static java.lang.foreign.MemoryLayout.structLayout; -import static java.lang.foreign.ValueLayout.*; - public class MemoryLayout { public static void main(String[] args) { From 075540af10b90cea7e4d24d4b9882d76464c7d2f Mon Sep 17 00:00:00 2001 From: Kumar Prabhash Anand Date: Mon, 27 Feb 2023 18:24:20 +0100 Subject: [PATCH 553/592] BAEL-5294 added form-url-encoded data code (#13545) --- .../com/baeldung/core/client/FormClient.java | 37 +++++++++ .../defaulterrorhandling/model/FormData.java | 12 +++ .../core/client/FormClientUnitTest.java | 78 +++++++++++++++++++ 3 files changed, 127 insertions(+) create mode 100644 feign/src/main/java/com/baeldung/core/client/FormClient.java create mode 100644 feign/src/main/java/com/baeldung/core/defaulterrorhandling/model/FormData.java create mode 100644 feign/src/test/java/com/baeldung/core/client/FormClientUnitTest.java diff --git a/feign/src/main/java/com/baeldung/core/client/FormClient.java b/feign/src/main/java/com/baeldung/core/client/FormClient.java new file mode 100644 index 0000000000..074402aef3 --- /dev/null +++ b/feign/src/main/java/com/baeldung/core/client/FormClient.java @@ -0,0 +1,37 @@ +package com.baeldung.core.client; + +import java.util.Map; + +import org.springframework.beans.factory.ObjectFactory; +import org.springframework.boot.autoconfigure.http.HttpMessageConverters; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.cloud.openfeign.support.SpringEncoder; +import org.springframework.context.annotation.Bean; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import com.baeldung.core.defaulterrorhandling.model.FormData; + +import feign.codec.Encoder; +import feign.form.spring.SpringFormEncoder; + +@FeignClient(name = "form-client", url = "http://localhost:8085/api", configuration = FormFeignEncoderConfig.class) +public interface FormClient { + + @PostMapping(value = "/form", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) + void postFormData(@RequestBody FormData data); + + @PostMapping(value = "/form/map", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) + void postFormMapData(Map data); + +} + +class FormFeignEncoderConfig { + + @Bean + public Encoder encoder(ObjectFactory converters) { + return new SpringFormEncoder(new SpringEncoder(converters)); + } + +} \ No newline at end of file diff --git a/feign/src/main/java/com/baeldung/core/defaulterrorhandling/model/FormData.java b/feign/src/main/java/com/baeldung/core/defaulterrorhandling/model/FormData.java new file mode 100644 index 0000000000..6210451f2d --- /dev/null +++ b/feign/src/main/java/com/baeldung/core/defaulterrorhandling/model/FormData.java @@ -0,0 +1,12 @@ +package com.baeldung.core.defaulterrorhandling.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class FormData { + + int id; + String name; +} diff --git a/feign/src/test/java/com/baeldung/core/client/FormClientUnitTest.java b/feign/src/test/java/com/baeldung/core/client/FormClientUnitTest.java new file mode 100644 index 0000000000..b9c263b60b --- /dev/null +++ b/feign/src/test/java/com/baeldung/core/client/FormClientUnitTest.java @@ -0,0 +1,78 @@ +package com.baeldung.core.client; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.configureFor; +import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; +import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +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.http.HttpStatus; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import com.baeldung.core.defaulterrorhandling.model.FormData; +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.client.WireMock; + +import lombok.extern.slf4j.Slf4j; + +@ExtendWith(SpringExtension.class) +@SpringBootTest +@Slf4j +class FormClientUnitTest { + + private static WireMockServer wireMockServer; + + @Autowired + FormClient formClient; + + @BeforeAll + public static void startWireMockServer() { + wireMockServer = new WireMockServer(8085); + configureFor("localhost", 8085); + wireMockServer.start(); + + } + + @AfterAll + public static void stopWireMockServer() { + wireMockServer.stop(); + } + + @Test + public void givenFormData_whenPostFormDataCalled_thenReturnSuccess() { + FormData formData = new FormData(1, "baeldung"); + stubFor(WireMock.post(urlEqualTo("/api/form")) + .willReturn(aResponse().withStatus(HttpStatus.OK.value()))); + + formClient.postFormData(formData); + wireMockServer.verify(postRequestedFor(urlPathEqualTo("/api/form")) + .withHeader("Content-Type", equalTo("application/x-www-form-urlencoded; charset=UTF-8")) + .withRequestBody(equalTo("name=baeldung&id=1"))); + } + + @Test + public void givenFormMap_whenPostFormMapDataCalled_thenReturnSuccess() { + Map mapData = new HashMap<>(); + mapData.put("name", "baeldung"); + mapData.put("id", "1"); + stubFor(WireMock.post(urlEqualTo("/api/form/map")) + .willReturn(aResponse().withStatus(HttpStatus.OK.value()))); + + formClient.postFormMapData(mapData); + wireMockServer.verify(postRequestedFor(urlPathEqualTo("/api/form/map")) + .withHeader("Content-Type", equalTo("application/x-www-form-urlencoded; charset=UTF-8")) + .withRequestBody(equalTo("name=baeldung&id=1"))); + } + +} \ No newline at end of file From 463a5d4dc56867fb4335d9b7ec939dd0051ee444 Mon Sep 17 00:00:00 2001 From: Eugene Kovko <37694937+eukovko@users.noreply.github.com> Date: Mon, 27 Feb 2023 18:29:14 +0100 Subject: [PATCH 554/592] BAEL-6228-Pipeline-Design-Pattern-in-Java (#13547) --- .../functional/BiFunctionExample.java | 17 +++++++++ .../pipeline/functional/FunctionExample.java | 17 +++++++++ .../com/baeldung/pipeline/immutable/Pipe.java | 5 +++ .../baeldung/pipeline/immutable/Pipeline.java | 37 +++++++++++++++++++ .../com/baeldung/pipeline/pipes/Pipe.java | 9 +++++ .../com/baeldung/pipeline/PipeUnitTest.java | 20 ++++++++++ .../baeldung/pipeline/PipelineUnitTest.java | 24 ++++++++++++ 7 files changed, 129 insertions(+) create mode 100644 patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/functional/BiFunctionExample.java create mode 100644 patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/functional/FunctionExample.java create mode 100644 patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/immutable/Pipe.java create mode 100644 patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/immutable/Pipeline.java create mode 100644 patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/pipes/Pipe.java create mode 100644 patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/PipeUnitTest.java create mode 100644 patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/PipelineUnitTest.java diff --git a/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/functional/BiFunctionExample.java b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/functional/BiFunctionExample.java new file mode 100644 index 0000000000..8fedce3943 --- /dev/null +++ b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/functional/BiFunctionExample.java @@ -0,0 +1,17 @@ +package com.baeldung.pipeline.functional; + +import java.util.function.BiFunction; +import java.util.function.Function; + +public class BiFunctionExample { + + public static void main(String[] args) { + BiFunction add = Integer::sum; + BiFunction mul = (a, b) -> a * b; + Function toString = Object::toString; + BiFunction pipeline + = add.andThen(a -> mul.apply(a, 2)).andThen(toString); + String result = pipeline.apply(1, 2); + System.out.println(result); + } +} diff --git a/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/functional/FunctionExample.java b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/functional/FunctionExample.java new file mode 100644 index 0000000000..eb393af0ac --- /dev/null +++ b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/functional/FunctionExample.java @@ -0,0 +1,17 @@ +package com.baeldung.pipeline.functional; + +import java.util.function.Function; + +public class FunctionExample { + + public static void main(String[] args) { + Function square = s -> s * s; + Function half = s -> s / 2; + Function toString = Object::toString; + Function pipeline = square.andThen(half) + .andThen(toString); + String result = pipeline.apply(5); + System.out.println(result); + } + +} diff --git a/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/immutable/Pipe.java b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/immutable/Pipe.java new file mode 100644 index 0000000000..6fdb4c71c3 --- /dev/null +++ b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/immutable/Pipe.java @@ -0,0 +1,5 @@ +package com.baeldung.pipeline.immutable; + +public interface Pipe { + OUT process(IN input); +} diff --git a/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/immutable/Pipeline.java b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/immutable/Pipeline.java new file mode 100644 index 0000000000..db46a26d7e --- /dev/null +++ b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/immutable/Pipeline.java @@ -0,0 +1,37 @@ +package com.baeldung.pipeline.immutable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; + +public class Pipeline { + + private Collection> pipes; + + private Pipeline(Pipe pipe) { + pipes = Collections.singletonList(pipe); + } + + private Pipeline(Collection> pipes) { + this.pipes = new ArrayList<>(pipes); + } + + public static Pipeline of(Pipe pipe) { + return new Pipeline<>(pipe); + } + + + public Pipeline withNextPipe(Pipe pipe) { + final ArrayList> newPipes = new ArrayList<>(pipes); + newPipes.add(pipe); + return new Pipeline<>(newPipes); + } + + public OUT process(IN input) { + Object output = input; + for (final Pipe pipe : pipes) { + output = pipe.process(output); + } + return (OUT) output; + } +} diff --git a/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/pipes/Pipe.java b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/pipes/Pipe.java new file mode 100644 index 0000000000..93f005fdd2 --- /dev/null +++ b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/pipes/Pipe.java @@ -0,0 +1,9 @@ +package com.baeldung.pipeline.pipes; + +public interface Pipe { + OUT process(IN input); + + default Pipe add(Pipe pipe) { + return input -> pipe.process(process(input)); + } +} diff --git a/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/PipeUnitTest.java b/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/PipeUnitTest.java new file mode 100644 index 0000000000..0e17d87fe2 --- /dev/null +++ b/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/PipeUnitTest.java @@ -0,0 +1,20 @@ +package com.baeldung.pipeline; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.baeldung.pipeline.pipes.Pipe; +import org.junit.jupiter.api.Test; + +class PipeUnitTest { + + @Test + void simplePipeTest() { + Pipe square = s -> s * s; + Pipe half = s -> s / 2; + Pipe toString = Object::toString; + Pipe pipeline = square.add(half).add(toString); + String result = pipeline.process(5); + String expected = "12"; + assertThat(result).isEqualTo(expected); + } +} \ No newline at end of file diff --git a/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/PipelineUnitTest.java b/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/PipelineUnitTest.java new file mode 100644 index 0000000000..e6ce47f0e8 --- /dev/null +++ b/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/PipelineUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.pipeline; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.baeldung.pipeline.immutable.Pipe; +import com.baeldung.pipeline.immutable.Pipeline; +import org.junit.jupiter.api.Test; + +class PipelineUnitTest { + + @Test + void simplePipelineTest() { + Pipe square = s -> s * s; + Pipe half = s -> s / 2; + Pipe toString = Object::toString; + Pipeline squarePipeline = Pipeline.of(square); + Pipeline squareAndHalfPipeline = squarePipeline.withNextPipe(half); + Pipeline squareHalfAndStringPipeline = squareAndHalfPipeline.withNextPipe(toString); + + String result = squareHalfAndStringPipeline.process(5); + String expected = "12"; + assertThat(result).isEqualTo(expected); + } +} \ No newline at end of file From 444cc4ac2d3d9423d23aa81a4ff6b1b0b55daa9d Mon Sep 17 00:00:00 2001 From: Kapil Khandelwal Date: Mon, 27 Feb 2023 23:19:45 +0530 Subject: [PATCH 555/592] BAEL-3746:- Get the Output of a Shell Command Executed Using Into a Variable in Jenkins Pipeline (#13544) --- .../pipeline-command-substitution-job | 13 +++++++++++++ .../output-job/pipeline-returnstatus-job | 17 +++++++++++++++++ .../output-job/pipeline-returnstdout-job | 13 +++++++++++++ .../output-job/pipeline-returnstdouttrim-job | 13 +++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 jenkins-modules/jenkins-jobs/output-job/pipeline-command-substitution-job create mode 100644 jenkins-modules/jenkins-jobs/output-job/pipeline-returnstatus-job create mode 100644 jenkins-modules/jenkins-jobs/output-job/pipeline-returnstdout-job create mode 100644 jenkins-modules/jenkins-jobs/output-job/pipeline-returnstdouttrim-job diff --git a/jenkins-modules/jenkins-jobs/output-job/pipeline-command-substitution-job b/jenkins-modules/jenkins-jobs/output-job/pipeline-command-substitution-job new file mode 100644 index 0000000000..acaacfa867 --- /dev/null +++ b/jenkins-modules/jenkins-jobs/output-job/pipeline-command-substitution-job @@ -0,0 +1,13 @@ +pipeline { + agent any + stages { + stage('Example') { + steps { + script { + def output = sh(script: "echo \$(ls)", returnStdout: true) + echo "Output: ${output}" + } + } + } + } +} diff --git a/jenkins-modules/jenkins-jobs/output-job/pipeline-returnstatus-job b/jenkins-modules/jenkins-jobs/output-job/pipeline-returnstatus-job new file mode 100644 index 0000000000..1b1dc7d315 --- /dev/null +++ b/jenkins-modules/jenkins-jobs/output-job/pipeline-returnstatus-job @@ -0,0 +1,17 @@ +pipeline { + agent any + stages { + stage('Example') { + steps { + script { + def status = sh(returnStatus: true, script: 'ls /test') + if (status != 0) { + echo "Error: Command exited with status ${status}" + } else { + echo "Command executed successfully" + } + } + } + } + } +} diff --git a/jenkins-modules/jenkins-jobs/output-job/pipeline-returnstdout-job b/jenkins-modules/jenkins-jobs/output-job/pipeline-returnstdout-job new file mode 100644 index 0000000000..ad00b30d92 --- /dev/null +++ b/jenkins-modules/jenkins-jobs/output-job/pipeline-returnstdout-job @@ -0,0 +1,13 @@ +pipeline { + agent any + stages { + stage('Example') { + steps { + script { + def output = sh(returnStdout: true, script: 'pwd') + echo "Output: ${output}" + } + } + } + } +} diff --git a/jenkins-modules/jenkins-jobs/output-job/pipeline-returnstdouttrim-job b/jenkins-modules/jenkins-jobs/output-job/pipeline-returnstdouttrim-job new file mode 100644 index 0000000000..d253173934 --- /dev/null +++ b/jenkins-modules/jenkins-jobs/output-job/pipeline-returnstdouttrim-job @@ -0,0 +1,13 @@ +pipeline { + agent any + stages { + stage('Example') { + steps { + script { + def output = sh(returnStdout: true, returnStdoutTrim: true, script: 'echo " hello "') + echo "Output: '${output}'" + } + } + } + } +} From c1564c38a00525dba71c93e9830ffa68cc2d84e1 Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Tue, 28 Feb 2023 06:11:01 +0100 Subject: [PATCH 556/592] BAEL-6076: Resolving Jackson JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token (#13495) --- .../java/com/baeldung/exceptions/Contact.java | 15 +++++++++ .../java/com/baeldung/exceptions/Person.java | 33 +++++++++++++++++++ .../baeldung/exceptions/PersonContact.java | 33 +++++++++++++++++++ .../exceptions/JacksonExceptionsUnitTest.java | 33 ++++++++++++++++--- 4 files changed, 109 insertions(+), 5 deletions(-) create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/Contact.java create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/Person.java create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/PersonContact.java diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/Contact.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/Contact.java new file mode 100644 index 0000000000..6417d60310 --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/Contact.java @@ -0,0 +1,15 @@ +package com.baeldung.exceptions; + +public class Contact { + + private String email; + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + +} diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/Person.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/Person.java new file mode 100644 index 0000000000..1572d7a71f --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/Person.java @@ -0,0 +1,33 @@ +package com.baeldung.exceptions; + +public class Person { + + private String firstName; + private String lastName; + private String contact; + + 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 getContact() { + return contact; + } + + public void setContact(String contact) { + this.contact = contact; + } + +} diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/PersonContact.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/PersonContact.java new file mode 100644 index 0000000000..0c75240d94 --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/exceptions/PersonContact.java @@ -0,0 +1,33 @@ +package com.baeldung.exceptions; + +public class PersonContact { + + private String firstName; + private String lastName; + private Contact contact; + + 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 Contact getContact() { + return contact; + } + + public void setContact(Contact contact) { + this.contact = contact; + } + +} diff --git a/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/exceptions/JacksonExceptionsUnitTest.java b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/exceptions/JacksonExceptionsUnitTest.java index 38ef3f9390..127d466436 100644 --- a/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/exceptions/JacksonExceptionsUnitTest.java +++ b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/exceptions/JacksonExceptionsUnitTest.java @@ -3,17 +3,14 @@ package com.baeldung.exceptions; import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.List; import org.junit.Test; -import com.baeldung.exceptions.User; -import com.baeldung.exceptions.UserWithPrivateFields; -import com.baeldung.exceptions.UserWithRoot; -import com.baeldung.exceptions.Zoo; -import com.baeldung.exceptions.ZooConfigured; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.core.JsonFactory; @@ -82,6 +79,32 @@ public class JacksonExceptionsUnitTest { .readValue(json); } + @Test + public void givenJsonObject_whenDeserializingIntoString_thenException() throws IOException { + final String json = "{\"firstName\":\"Azhrioun\",\"lastName\":\"Abderrahim\",\"contact\":{\"email\":\"azh@email.com\"}}"; + final ObjectMapper mapper = new ObjectMapper(); + + Exception exception = assertThrows(JsonMappingException.class, () -> mapper.reader() + .forType(Person.class) + .readValue(json)); + + assertTrue(exception.getMessage() + .contains("Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)")); + } + + @Test + public void givenJsonObject_whenDeserializingIntoObject_thenDeserialize() throws IOException { + final String json = "{\"firstName\":\"Azhrioun\",\"lastName\":\"Abderrahim\",\"contact\":{\"email\":\"azh@email.com\"}}"; + final ObjectMapper mapper = new ObjectMapper(); + + PersonContact person = mapper.reader() + .forType(PersonContact.class) + .readValue(json); + + assertEquals("azh@email.com", person.getContact() + .getEmail()); + } + @Test public void givenDefaultConstructor_whenDeserializing_thenCorrect() throws IOException { final String json = "{\"id\":1,\"name\":\"John\"}"; From 31ab20f33e8acaf90c418e27e190923b66020950 Mon Sep 17 00:00:00 2001 From: Cesare Date: Tue, 28 Feb 2023 10:09:51 +0100 Subject: [PATCH 557/592] reformat TodosController --- .../java/com/baeldung/sample/boundary/TodosController.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/boundary/TodosController.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/boundary/TodosController.java index 104dc80210..cf21303659 100644 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/boundary/TodosController.java +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/sample/boundary/TodosController.java @@ -40,7 +40,6 @@ public class TodosController { @GetMapping(value = {"/name"},produces = DEFAULT_MEDIA_TYPE) public List findAllName(){ return List.of("Hello", "World"); - } @@ -89,5 +88,4 @@ public class TodosController { service.delete(id); } - -} +} \ No newline at end of file From d93014284eb3183bff1b6edf7b61ecb61398d8f3 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 28 Feb 2023 19:46:43 +0200 Subject: [PATCH 558/592] Upgrading modules in chunks (#13537) * [JAVA-18166] Moved performance-tests module to jdk9-and-above-profile * [JAVA-18172] Moved security-modules module to jdk9-and-above-profile * [JAVA-18154] Moved libraries-server-2 module to jdk9-and-above-profile * [JAVA-18172] Upgraded maven-war-plugin version * [JAVA-18172] Upgraded maven-war-plugin version at parent module * [JAVA-18164] Moved orika module to jdk9-and-above profile * [JAVA-18164] Testing argLine configuration --- libraries-server-2/pom.xml | 1 + orika/pom.xml | 15 +++++++++++++++ pom.xml | 26 ++++++++++++++++---------- security-modules/pom.xml | 4 ++++ 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/libraries-server-2/pom.xml b/libraries-server-2/pom.xml index 7377fa3fa9..cf5d016d9f 100644 --- a/libraries-server-2/pom.xml +++ b/libraries-server-2/pom.xml @@ -73,6 +73,7 @@ 9.4.27.v20200227 8.1.11.v20170118 + 3.2.2 \ No newline at end of file diff --git a/orika/pom.xml b/orika/pom.xml index c18bb58a51..5ff898e6bd 100644 --- a/orika/pom.xml +++ b/orika/pom.xml @@ -21,6 +21,21 @@ + + + + org.apache.maven.plugins + maven-surefire-plugin + + + --add-opens java.base/java.lang=ALL-UNNAMED + --add-opens java.base/java.util=ALL-UNNAMED + + + + + + 1.5.0 diff --git a/pom.xml b/pom.xml index 651ed36d1a..0ec9e9efdd 100644 --- a/pom.xml +++ b/pom.xml @@ -372,7 +372,7 @@ libraries-data-db libraries-security - libraries-server-2 + logging-modules lombok-modules @@ -387,14 +387,10 @@ netflix-modules osgi - orika - performance-tests persistence-modules - security-modules - vavr-modules web-modules @@ -617,7 +613,7 @@ libraries-data-db libraries-security - libraries-server-2 + logging-modules lombok-modules @@ -631,14 +627,11 @@ netflix-modules osgi - orika - performance-tests + persistence-modules - security-modules - vavr-modules web-modules @@ -833,6 +826,11 @@ + performance-tests + security-modules + libraries-server-2 + orika + patterns-modules json-modules libraries-data @@ -840,6 +838,7 @@ server-modules apache-cxf-modules + spring-aop jmeter spring-aop-2 @@ -1069,12 +1068,19 @@ + + 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-poi diff --git a/security-modules/pom.xml b/security-modules/pom.xml index 70f29cecd7..ed88ef842e 100644 --- a/security-modules/pom.xml +++ b/security-modules/pom.xml @@ -25,4 +25,8 @@ sql-injection-samples + + 3.3.2 + + \ No newline at end of file From da08a212668739535bfc57117bb123725616736c Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 28 Feb 2023 23:38:13 +0530 Subject: [PATCH 559/592] JAVA-18103 Revert properties file name to fix integration test (#13555) --- ...ation.properties => application-disabling-keycloak.properties} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename spring-boot-modules/spring-boot-keycloak-2/src/main/resources/{application.properties => application-disabling-keycloak.properties} (100%) diff --git a/spring-boot-modules/spring-boot-keycloak-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-keycloak-2/src/main/resources/application-disabling-keycloak.properties similarity index 100% rename from spring-boot-modules/spring-boot-keycloak-2/src/main/resources/application.properties rename to spring-boot-modules/spring-boot-keycloak-2/src/main/resources/application-disabling-keycloak.properties From 24d57f0ab6604b49806c465c4fc249cb98abb63c Mon Sep 17 00:00:00 2001 From: Kilian Schneider <48420258+Basler182@users.noreply.github.com> Date: Tue, 28 Feb 2023 22:57:57 +0100 Subject: [PATCH 560/592] BAEL-6207 (#13557) * BAEL-6207 IDD * Update pom.xml * Rename HelpRequestServiceTest.java to HelpRequestServiceUnitTest.java * Update HelpRequestServiceUnitTest.java --- patterns-modules/idd/README.md | 1 + patterns-modules/idd/pom.xml | 29 ++++++++++++ .../baeldung/idd/CreateHelpRequestDTO.java | 15 ++++++ .../java/com/baeldung/idd/HelpRequestDTO.java | 13 +++++ .../com/baeldung/idd/HelpRequestService.java | 11 +++++ .../baeldung/idd/HelpRequestServiceImpl.java | 24 ++++++++++ .../com/baeldung/idd/HelpRequestStatus.java | 6 +++ .../baeldung/idd/UpdateHelpRequestDTO.java | 14 ++++++ .../idd/HelpRequestServiceUnitTest.java | 47 +++++++++++++++++++ patterns-modules/pom.xml | 3 +- 10 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 patterns-modules/idd/README.md create mode 100644 patterns-modules/idd/pom.xml create mode 100644 patterns-modules/idd/src/main/java/com/baeldung/idd/CreateHelpRequestDTO.java create mode 100644 patterns-modules/idd/src/main/java/com/baeldung/idd/HelpRequestDTO.java create mode 100644 patterns-modules/idd/src/main/java/com/baeldung/idd/HelpRequestService.java create mode 100644 patterns-modules/idd/src/main/java/com/baeldung/idd/HelpRequestServiceImpl.java create mode 100644 patterns-modules/idd/src/main/java/com/baeldung/idd/HelpRequestStatus.java create mode 100644 patterns-modules/idd/src/main/java/com/baeldung/idd/UpdateHelpRequestDTO.java create mode 100644 patterns-modules/idd/src/test/java/com/baeldung/idd/HelpRequestServiceUnitTest.java diff --git a/patterns-modules/idd/README.md b/patterns-modules/idd/README.md new file mode 100644 index 0000000000..e320af31b4 --- /dev/null +++ b/patterns-modules/idd/README.md @@ -0,0 +1 @@ +### Relevant Articles: \ No newline at end of file diff --git a/patterns-modules/idd/pom.xml b/patterns-modules/idd/pom.xml new file mode 100644 index 0000000000..02795089e0 --- /dev/null +++ b/patterns-modules/idd/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + idd + 1.0 + idd + + + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + + + + jar + + + com.baeldung + patterns-modules + 1.0.0-SNAPSHOT + + + \ No newline at end of file diff --git a/patterns-modules/idd/src/main/java/com/baeldung/idd/CreateHelpRequestDTO.java b/patterns-modules/idd/src/main/java/com/baeldung/idd/CreateHelpRequestDTO.java new file mode 100644 index 0000000000..87084474db --- /dev/null +++ b/patterns-modules/idd/src/main/java/com/baeldung/idd/CreateHelpRequestDTO.java @@ -0,0 +1,15 @@ +package com.baeldung.idd; + +public class CreateHelpRequestDTO { + + private final HelpRequestStatus status; + + public CreateHelpRequestDTO(HelpRequestStatus status) { + this.status = status; + } + + public HelpRequestStatus getStatus() { + return status; + } + +} diff --git a/patterns-modules/idd/src/main/java/com/baeldung/idd/HelpRequestDTO.java b/patterns-modules/idd/src/main/java/com/baeldung/idd/HelpRequestDTO.java new file mode 100644 index 0000000000..2ad0c5f100 --- /dev/null +++ b/patterns-modules/idd/src/main/java/com/baeldung/idd/HelpRequestDTO.java @@ -0,0 +1,13 @@ +package com.baeldung.idd; + +public class HelpRequestDTO { + private HelpRequestStatus status; + + public HelpRequestStatus getStatus() { + return status; + } + + public HelpRequestDTO(HelpRequestStatus status) { + this.status = status; + } +} diff --git a/patterns-modules/idd/src/main/java/com/baeldung/idd/HelpRequestService.java b/patterns-modules/idd/src/main/java/com/baeldung/idd/HelpRequestService.java new file mode 100644 index 0000000000..02c0b2531c --- /dev/null +++ b/patterns-modules/idd/src/main/java/com/baeldung/idd/HelpRequestService.java @@ -0,0 +1,11 @@ +package com.baeldung.idd; + +import java.util.List; + +public interface HelpRequestService { + HelpRequestDTO createHelpRequest(CreateHelpRequestDTO createHelpRequestDTO); + + List findAllByStatus(HelpRequestStatus status); + + HelpRequestDTO updateHelpRequest(UpdateHelpRequestDTO updateHelpRequestDTO); +} diff --git a/patterns-modules/idd/src/main/java/com/baeldung/idd/HelpRequestServiceImpl.java b/patterns-modules/idd/src/main/java/com/baeldung/idd/HelpRequestServiceImpl.java new file mode 100644 index 0000000000..8ffed62078 --- /dev/null +++ b/patterns-modules/idd/src/main/java/com/baeldung/idd/HelpRequestServiceImpl.java @@ -0,0 +1,24 @@ +package com.baeldung.idd; + +import java.util.List; + +public class HelpRequestServiceImpl implements HelpRequestService { + + @Override + public HelpRequestDTO createHelpRequest(CreateHelpRequestDTO createHelpRequestDTO) { + // here goes the implementation + return new HelpRequestDTO(createHelpRequestDTO.getStatus()); + } + + @Override + public List findAllByStatus(HelpRequestStatus status) { + // here goes the implementation + return List.of(new HelpRequestDTO(status), new HelpRequestDTO(status)); + } + + @Override + public HelpRequestDTO updateHelpRequest(UpdateHelpRequestDTO updateHelpRequestDTO) { + // here goes the implementation + return new HelpRequestDTO(updateHelpRequestDTO.getStatus()); + } +} diff --git a/patterns-modules/idd/src/main/java/com/baeldung/idd/HelpRequestStatus.java b/patterns-modules/idd/src/main/java/com/baeldung/idd/HelpRequestStatus.java new file mode 100644 index 0000000000..adb2fb5cc3 --- /dev/null +++ b/patterns-modules/idd/src/main/java/com/baeldung/idd/HelpRequestStatus.java @@ -0,0 +1,6 @@ +package com.baeldung.idd; + +public enum HelpRequestStatus { + OPEN, IN_PROGRESS, CLOSED +} + diff --git a/patterns-modules/idd/src/main/java/com/baeldung/idd/UpdateHelpRequestDTO.java b/patterns-modules/idd/src/main/java/com/baeldung/idd/UpdateHelpRequestDTO.java new file mode 100644 index 0000000000..04a46e3d27 --- /dev/null +++ b/patterns-modules/idd/src/main/java/com/baeldung/idd/UpdateHelpRequestDTO.java @@ -0,0 +1,14 @@ +package com.baeldung.idd; + +public class UpdateHelpRequestDTO { + + private final HelpRequestStatus status; + + public UpdateHelpRequestDTO(HelpRequestStatus status) { + this.status = status; + } + + public HelpRequestStatus getStatus() { + return status; + } +} diff --git a/patterns-modules/idd/src/test/java/com/baeldung/idd/HelpRequestServiceUnitTest.java b/patterns-modules/idd/src/test/java/com/baeldung/idd/HelpRequestServiceUnitTest.java new file mode 100644 index 0000000000..7bfacf8a48 --- /dev/null +++ b/patterns-modules/idd/src/test/java/com/baeldung/idd/HelpRequestServiceUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung.idd; + +import org.assertj.core.api.Assertions; +import org.junit.Test; + +import java.util.List; + +public class HelpRequestServiceUnitTest { + + HelpRequestService testHelpRequestService = new HelpRequestService() { + @Override + public HelpRequestDTO createHelpRequest(CreateHelpRequestDTO createHelpRequestDTO) { + return new HelpRequestDTO(HelpRequestStatus.OPEN); + } + + @Override + public List findAllByStatus(HelpRequestStatus status) { + return List.of(new HelpRequestDTO(HelpRequestStatus.OPEN)); + } + + @Override + public HelpRequestDTO updateHelpRequest(UpdateHelpRequestDTO updateHelpRequestDTO) { + return new HelpRequestDTO(HelpRequestStatus.OPEN); + } + }; + + @Test + public void givenHelpRequest_whenCreateHelpRequest_thenHelpRequestIsCreated() { + // given + CreateHelpRequestDTO createHelpRequestDTO = new CreateHelpRequestDTO(HelpRequestStatus.OPEN); + + // when + HelpRequestDTO helpRequestDTO = testHelpRequestService.createHelpRequest(createHelpRequestDTO); + + // then + Assertions.assertThat(helpRequestDTO).isNotNull(); + Assertions.assertThat(helpRequestDTO.getStatus()).isEqualTo(HelpRequestStatus.OPEN); + } + + @Test + public void givenHelpRequestList_whenFindAllByStatus_shouldContainOnlyStatus() { + HelpRequestService helpRequestService = new HelpRequestServiceImpl(); + List allByStatusOpen = helpRequestService.findAllByStatus(HelpRequestStatus.OPEN); + Assertions.assertThat(allByStatusOpen).extracting(HelpRequestDTO::getStatus).containsOnly(HelpRequestStatus.OPEN); + } + +} diff --git a/patterns-modules/pom.xml b/patterns-modules/pom.xml index 26d9a76aee..5a99b539be 100644 --- a/patterns-modules/pom.xml +++ b/patterns-modules/pom.xml @@ -31,6 +31,7 @@ clean-architecture enterprise-patterns coupling + idd @@ -71,4 +72,4 @@ 9.4.0.v20161208 - \ No newline at end of file + From b4d18fd2274269addc96a0084a8dd22eb6cd1519 Mon Sep 17 00:00:00 2001 From: ch4mpy Date: Thu, 16 Feb 2023 08:47:54 -1000 Subject: [PATCH 561/592] https://jira.baeldung.com/browse/BAEL-6223 --- pom.xml | 1 + .../spring-security-oauth2-testing/README.md | 7 + .../spring-security-oauth2-testing/pom.xml | 32 ++++ .../reactive-resource-server/pom.xml | 58 ++++++++ .../ReactiveResourceServerApplication.java | 124 ++++++++++++++++ .../src/main/resources/application.yaml | 6 + .../com/baeldung/MessageServiceUnitTest.java | 79 ++++++++++ ...ourceServerApplicationIntegrationTest.java | 109 ++++++++++++++ ...pringAddonsGreetingControllerUnitTest.java | 123 ++++++++++++++++ ...ecurityTestGreetingControllerUnitTest.java | 138 ++++++++++++++++++ .../servlet-resource-server/pom.xml | 58 ++++++++ .../ServletResourceServerApplication.java | 116 +++++++++++++++ .../src/main/resources/application.properties | 1 + .../com/baeldung/MessageServiceUnitTest.java | 79 ++++++++++ ...ourceServerApplicationIntegrationTest.java | 114 +++++++++++++++ ...pringAddonsGreetingControllerUnitTest.java | 131 +++++++++++++++++ ...ecurityTestGreetingControllerUnitTest.java | 124 ++++++++++++++++ 17 files changed, 1300 insertions(+) create mode 100644 spring-security-modules/spring-security-oauth2-testing/README.md create mode 100644 spring-security-modules/spring-security-oauth2-testing/pom.xml create mode 100644 spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/pom.xml create mode 100644 spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/main/java/com/baeldung/ReactiveResourceServerApplication.java create mode 100644 spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/main/resources/application.yaml create mode 100644 spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/MessageServiceUnitTest.java create mode 100644 spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/ReactiveResourceServerApplicationIntegrationTest.java create mode 100644 spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringAddonsGreetingControllerUnitTest.java create mode 100644 spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java create mode 100644 spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/pom.xml create mode 100644 spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/main/java/com/baeldung/ServletResourceServerApplication.java create mode 100644 spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/main/resources/application.properties create mode 100644 spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/MessageServiceUnitTest.java create mode 100644 spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/ServletResourceServerApplicationIntegrationTest.java create mode 100644 spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringAddonsGreetingControllerUnitTest.java create mode 100644 spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java diff --git a/pom.xml b/pom.xml index 0ec9e9efdd..345cd7979a 100644 --- a/pom.xml +++ b/pom.xml @@ -1023,6 +1023,7 @@ spring-kafka spring-native + spring-security-modules/spring-security-oauth2-testing spring-protobuf spring-quartz diff --git a/spring-security-modules/spring-security-oauth2-testing/README.md b/spring-security-modules/spring-security-oauth2-testing/README.md new file mode 100644 index 0000000000..82728ff450 --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/README.md @@ -0,0 +1,7 @@ +## Spring-Security 6 OAuth2 testing samples + +This module contains articles about testing spring-security 6 access-control with OAuth2 + +## Relevant articles: + +- [Testing Spring OAuth2 Access-Control](https://drafts.baeldung.com/?p=154767&preview=true) diff --git a/spring-security-modules/spring-security-oauth2-testing/pom.xml b/spring-security-modules/spring-security-oauth2-testing/pom.xml new file mode 100644 index 0000000000..f634b6105c --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + spring-security-oauth2-testing + spring-security-oauth2-testing + pom + spring-security 6 oauth testing sample project + + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 + + + 6.0.14 + + + + + com.c4-soft.springaddons + spring-addons-oauth2-test + ${spring-addons.version} + + + + + reactive-resource-server + servlet-resource-server + + \ No newline at end of file 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 new file mode 100644 index 0000000000..c1fa6b7c6d --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + com.baeldung + spring-security-oauth2-testing + 0.0.1-SNAPSHOT + + com.baeldung.spring-security-modules.testing + reactive-resource-server + reactive-resource-server + Demo project for Spring Boot reactive resource-server + + 17 + + + + org.springframework.boot + spring-boot-starter-oauth2-resource-server + + + org.springframework.boot + spring-boot-starter-webflux + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + com.c4-soft.springaddons + spring-addons-oauth2-test + test + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + \ No newline at end of file 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 new file mode 100644 index 0000000000..608038331a --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/main/java/com/baeldung/ReactiveResourceServerApplication.java @@ -0,0 +1,124 @@ +package com.baeldung; + +import java.nio.charset.Charset; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.convert.converter.Converter; +import org.springframework.core.io.buffer.DataBufferUtils; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; +import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity; +import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +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.web.server.SecurityWebFilterChain; +import org.springframework.security.web.server.context.NoOpServerSecurityContextRepository; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; +import reactor.core.publisher.Mono; + +@SpringBootApplication +public class ReactiveResourceServerApplication { + + public static void main(String[] args) { + SpringApplication.run(ReactiveResourceServerApplication.class, args); + } + + @Configuration + @EnableWebFluxSecurity + @EnableReactiveMethodSecurity + public 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 -> { + final var response = exchange.getResponse(); + 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())); + return response.writeWith(Mono.just(buffer)).doOnError(error -> DataBufferUtils.release(buffer)); + })); + + http.authorizeExchange().pathMatchers("/secured-route").hasRole("AUTHORIZED_PERSONNEL").anyExchange().authenticated(); + + return http.build(); + } + + static interface AuthoritiesConverter extends Converter>> { + } + + @Bean + AuthoritiesConverter realmRoles2AuthoritiesConverter() { + return (Jwt jwt) -> { + 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()); + }; + } + } + + @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"))); + } + + @PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')") + public Mono getSecret() { + return Mono.just("Only authorized personnel can read that"); + } + } + + @RestController + @RequiredArgsConstructor + public class GreetingController { + private final MessageService messageService; + + @GetMapping("/greet") + public Mono> greet() { + return messageService.greet().map(ResponseEntity::ok); + } + + @GetMapping("/secured-route") + public Mono> securedRoute() { + return messageService.getSecret().map(ResponseEntity::ok); + } + + @GetMapping("/secured-method") + @PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')") + public Mono> securedMethod() { + return messageService.getSecret().map(ResponseEntity::ok); + } + } + +} diff --git a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/main/resources/application.yaml b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/main/resources/application.yaml new file mode 100644 index 0000000000..01e655e1b3 --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/main/resources/application.yaml @@ -0,0 +1,6 @@ +spring: + security: + oauth2: + resourceserver: + jwt: + issuer-uri: https://localhost:8443/realms/master 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 new file mode 100644 index 0000000000..92896754ef --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/MessageServiceUnitTest.java @@ -0,0 +1,79 @@ +package com.baeldung; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Import; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; +import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity; +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({ MessageService.class }) +@ExtendWith(SpringExtension.class) +@EnableReactiveMethodSecurity +class MessageServiceUnitTest { + @Autowired + MessageService messageService; + + /*----------------------------------------------------------------------------*/ + /* greet() */ + /* Expects a JwtAuthenticationToken to be retrieved from the security-context */ + /*----------------------------------------------------------------------------*/ + + @Test + void givenSecurityContextIsEmpty_whenGreet_thenThrowsAuthenticationCredentialsNotFoundException() { + assertThrows(AuthenticationCredentialsNotFoundException.class, () -> messageService.greet().block()); + } + + @Test + @WithAnonymousUser + void givenUserIsNotAuthenticated_whenGreet_thenThrowsClassCastException() { + assertThrows(ClassCastException.class, () -> messageService.greet().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().block()); + } + + @Test + @WithMockUser(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, username = "ch4mpy") + void givenSecurityContextIsPopulatedWithUsernamePasswordAuthenticationToken_whenGreet_thenThrowsClassCastException() { + assertThrows(ClassCastException.class, () -> messageService.greet().block()); + } + + /*--------------------------------------------------------------------*/ + /* getSecret() */ + /* is secured with "@PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')")" */ + /*--------------------------------------------------------------------*/ + + @Test + @WithAnonymousUser + void givenUserIsNotAuthenticated_whenGetSecret_thenThrowsAccessDeniedException() { + assertThrows(AccessDeniedException.class, () -> messageService.getSecret().block()); + } + + @Test + @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) + void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecret_thenReturnSecret() { + assertEquals("Only authorized personnel can read that", messageService.getSecret().block()); + } + + @Test + @WithMockJwtAuth(authorities = { "admin" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) + void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecret_thenThrowsAccessDeniedException() { + assertThrows(AccessDeniedException.class, () -> messageService.getSecret().block()); + } + +} 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 new file mode 100644 index 0000000000..e3c45883c2 --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/ReactiveResourceServerApplicationIntegrationTest.java @@ -0,0 +1,109 @@ +package com.baeldung; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient; +import org.springframework.boot.test.context.SpringBootTest; +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; + +@SpringBootTest(webEnvironment = WebEnvironment.MOCK) +@AutoConfigureWebTestClient +class ReactiveResourceServerApplicationIntegrationTest { + @Autowired + WebTestClient api; + + /*-----------------------------------------------------------------------------*/ + /* /greet */ + /* This end-point secured with ".anyRequest().authenticated()" in SecurityConf */ + /*-----------------------------------------------------------------------------*/ + + @Test + @WithAnonymousUser + void givenUserIsNotAuthenticated_whenGetGreet_thenUnauthorized() throws Exception { + // @formatter:off + api.get().uri("/greet").exchange() + .expectStatus().isUnauthorized(); + // @formatter:on + } + + @Test + @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) + void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { + // @formatter:off + api.get().uri("/greet").exchange() + .expectStatus().isOk() + .expectBody(String.class).isEqualTo("Hello ch4mpy! You are granted with [admin, ROLE_AUTHORIZED_PERSONNEL]."); + // @formatter:on + } + + /*---------------------------------------------------------------------------------------------------------------------*/ + /* /secured-route */ + /* This end-point is secured with ".requestMatchers("/secured-route").hasRole("AUTHORIZED_PERSONNEL")" in SecurityConf */ + /*---------------------------------------------------------------------------------------------------------------------*/ + + @Test + @WithAnonymousUser + void givenUserIsNotAuthenticated_whenGetSecuredRoute_thenUnauthorized() throws Exception { + // @formatter:off + api.get().uri("/secured-route").exchange() + .expectStatus().isUnauthorized(); + // @formatter:on + } + + @Test + @WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL") + void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenOk() throws Exception { + // @formatter:off + api.get().uri("/secured-route").exchange() + .expectStatus().isOk() + .expectBody(String.class).isEqualTo("Only authorized personnel can read that"); + // @formatter:on + } + + @Test + @WithMockJwtAuth("admin") + void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception { + // @formatter:off + api.get().uri("/secured-route").exchange() + .expectStatus().isForbidden(); + // @formatter:on + } + + /*---------------------------------------------------------------------------------------------------------*/ + /* /secured-method */ + /* This end-point is secured with "@PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')")" on @Controller method */ + /*---------------------------------------------------------------------------------------------------------*/ + + @Test + @WithAnonymousUser + void givenUserIsNotAuthenticated_whenGetSecuredMethod_thenUnauthorized() throws Exception { + // @formatter:off + api.get().uri("/secured-method").exchange() + .expectStatus().isUnauthorized(); + // @formatter:on + } + + @Test + @WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL") + void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenOk() throws Exception { + // @formatter:off + api.get().uri("/secured-method").exchange() + .expectStatus().isOk() + .expectBody(String.class).isEqualTo("Only authorized personnel can read that"); + // @formatter:on + } + + @Test + @WithMockJwtAuth("admin") + void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception { + // @formatter:off + api.get().uri("/secured-method").exchange() + .expectStatus().isForbidden(); + // @formatter:on + } +} 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 new file mode 100644 index 0000000000..e28136dd25 --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringAddonsGreetingControllerUnitTest.java @@ -0,0 +1,123 @@ +package com.baeldung; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.jupiter.api.Test; +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.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 reactor.core.publisher.Mono; + +@WebFluxTest(controllers = GreetingController.class, properties = { "server.ssl.enabled=false" }) +class SpringAddonsGreetingControllerUnitTest { + + @MockBean + MessageService messageService; + + @Autowired + WebTestClient api; + + /*-----------------------------------------------------------------------------*/ + /* /greet */ + /* This end-point secured with ".anyRequest().authenticated()" in SecurityConf */ + /*-----------------------------------------------------------------------------*/ + + @Test + @WithAnonymousUser + void givenUserIsNotAuthenticated_whenGetGreet_thenUnauthorized() throws Exception { + api.get().uri("/greet").exchange().expectStatus().isUnauthorized(); + } + + @Test + @WithMockJwtAuth(claims = @OpenIdClaims(preferredUsername = "Tonton Pirate")) + void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { + final var greeting = "Whatever the service returns"; + when(messageService.greet()).thenReturn(Mono.just(greeting)); + + // @formatter:off + api.get().uri("/greet").exchange() + .expectStatus().isOk() + .expectBody(String.class).isEqualTo(greeting); + // @formatter:on + + verify(messageService, times(1)).greet(); + } + + /*---------------------------------------------------------------------------------------------------------------------*/ + /* /secured-route */ + /* This end-point is secured with ".requestMatchers("/secured-route").hasRole("AUTHORIZED_PERSONNEL")" in SecurityConf */ + /*---------------------------------------------------------------------------------------------------------------------*/ + + @Test + @WithAnonymousUser + void givenUserIsNotAuthenticated_whenGetSecuredRoute_thenUnauthorized() throws Exception { + api.get().uri("/secured-route").exchange().expectStatus().isUnauthorized(); + } + + @Test + @WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL") + void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenOk() throws Exception { + final var secret = "Secret!"; + when(messageService.getSecret()).thenReturn(Mono.just(secret)); + + // @formatter:off + api.get().uri("/secured-route").exchange() + .expectStatus().isOk() + .expectBody(String.class).isEqualTo(secret); + // @formatter:on + } + + @Test + @WithMockJwtAuth("admin") + void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception { + // @formatter:off + api.get().uri("/secured-route").exchange() + .expectStatus().isForbidden(); + // @formatter:on + } + + /*---------------------------------------------------------------------------------------------------------*/ + /* /secured-method */ + /* This end-point is secured with "@PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')")" on @Controller method */ + /*---------------------------------------------------------------------------------------------------------*/ + + @Test + @WithAnonymousUser + void givenUserIsNotAuthenticated_whenGetSecuredMethod_thenUnauthorized() throws Exception { + api.get().uri("/secured-method").exchange().expectStatus().isUnauthorized(); + } + + @Test + @WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL") + void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenOk() throws Exception { + final var secret = "Secret!"; + when(messageService.getSecret()).thenReturn(Mono.just(secret)); + + // @formatter:off + api.get().uri("/secured-method").exchange() + .expectStatus().isOk() + .expectBody(String.class).isEqualTo(secret); + // @formatter:on + } + + @Test + @WithMockJwtAuth("admin") + void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception { + // @formatter:off + api.get().uri("/secured-method").exchange() + .expectStatus().isForbidden(); + // @formatter:on + } + +} + diff --git a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java new file mode 100644 index 0000000000..291a405e29 --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java @@ -0,0 +1,138 @@ +package com.baeldung; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.springframework.security.test.web.reactive.server.SecurityMockServerConfigurers.mockAuthentication; +import static org.springframework.security.test.web.reactive.server.SecurityMockServerConfigurers.mockJwt; + +import org.junit.jupiter.api.Test; +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.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.test.web.reactive.server.WebTestClient; + +import com.baeldung.ReactiveResourceServerApplication.GreetingController; +import com.baeldung.ReactiveResourceServerApplication.MessageService; + +import reactor.core.publisher.Mono; + +@WebFluxTest(controllers = GreetingController.class, properties = { "server.ssl.enabled=false" }) +class SpringSecurityTestGreetingControllerUnitTest { + private static final AnonymousAuthenticationToken ANONYMOUS_AUTHENTICATION = new AnonymousAuthenticationToken( + "anonymous", + "anonymousUser", + AuthorityUtils.createAuthorityList("ROLE_ANONYMOUS")); + + @MockBean + MessageService messageService; + + @Autowired + WebTestClient api; + + /*-----------------------------------------------------------------------------*/ + /* /greet */ + /* This end-point secured with ".anyRequest().authenticated()" in SecurityConf */ + /*-----------------------------------------------------------------------------*/ + + @Test + void givenUserIsNotAuthenticated_whenGetGreet_thenUnauthorized() throws Exception { + // @formatter:off + api.mutateWith(mockAuthentication(ANONYMOUS_AUTHENTICATION)) + .get().uri("/greet").exchange() + .expectStatus().isUnauthorized(); + // @formatter:on + } + + @Test + void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { + final var greeting = "Whatever the service returns"; + when(messageService.greet()).thenReturn(Mono.just(greeting)); + + // @formatter:off + api.mutateWith(mockJwt()) + .get().uri("/greet").exchange() + .expectStatus().isOk() + .expectBody(String.class).isEqualTo(greeting); + // @formatter:on + + verify(messageService, times(1)).greet(); + } + + /*---------------------------------------------------------------------------------------------------------------------*/ + /* /secured-route */ + /* This end-point is secured with ".requestMatchers("/secured-route").hasRole("AUTHORIZED_PERSONNEL")" in SecurityConf */ + /*---------------------------------------------------------------------------------------------------------------------*/ + + @Test + void givenUserIsNotAuthenticated_whenGetSecuredRoute_thenUnauthorized() throws Exception { + // @formatter:off + api.mutateWith(mockAuthentication(ANONYMOUS_AUTHENTICATION)) + .get().uri("/secured-route").exchange() + .expectStatus().isUnauthorized(); + // @formatter:on + } + + @Test + void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenOk() throws Exception { + final var secret = "Secret!"; + when(messageService.getSecret()).thenReturn(Mono.just(secret)); + + // @formatter:off + api.mutateWith(mockJwt().authorities(new SimpleGrantedAuthority("ROLE_AUTHORIZED_PERSONNEL"))) + .get().uri("/secured-route").exchange() + .expectStatus().isOk() + .expectBody(String.class).isEqualTo(secret); + // @formatter:on + } + + @Test + void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception { + // @formatter:off + api.mutateWith(mockJwt().authorities(new SimpleGrantedAuthority("admin"))) + .get().uri("/secured-route").exchange() + .expectStatus().isForbidden(); + // @formatter:on + } + + /*---------------------------------------------------------------------------------------------------------*/ + /* /secured-method */ + /* This end-point is secured with "@PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')")" on @Controller method */ + /*---------------------------------------------------------------------------------------------------------*/ + + @Test + void givenUserIsNotAuthenticated_whenGetSecuredMethod_thenUnauthorized() throws Exception { + // @formatter:off + api.mutateWith(mockAuthentication(ANONYMOUS_AUTHENTICATION)) + .get().uri("/secured-method").exchange() + .expectStatus().isUnauthorized(); + // @formatter:on + } + + @Test + void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenOk() throws Exception { + final var secret = "Secret!"; + when(messageService.getSecret()).thenReturn(Mono.just(secret)); + + // @formatter:off + api.mutateWith(mockJwt().authorities(new SimpleGrantedAuthority("ROLE_AUTHORIZED_PERSONNEL"))) + .get().uri("/secured-method").exchange() + .expectStatus().isOk() + .expectBody(String.class).isEqualTo(secret); + // @formatter:on + } + + @Test + void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception { + // @formatter:off + api.mutateWith(mockJwt().authorities(new SimpleGrantedAuthority("admin"))) + .get().uri("/secured-method").exchange() + .expectStatus().isForbidden(); + // @formatter:on + } + +} + 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 new file mode 100644 index 0000000000..8de154b934 --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + com.baeldung + spring-security-oauth2-testing + 0.0.1-SNAPSHOT + + com.baeldung.spring-security-modules.testing + servlet-resource-server + servlet-resource-server + Demo project for Spring Boot servlet resource-server + + 17 + + + + org.springframework.boot + spring-boot-starter-oauth2-resource-server + + + org.springframework.boot + spring-boot-starter-web + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + com.c4-soft.springaddons + spring-addons-oauth2-test + test + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + 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 new file mode 100644 index 0000000000..ba55944c29 --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/main/java/com/baeldung/ServletResourceServerApplication.java @@ -0,0 +1,116 @@ +package com.baeldung; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.convert.converter.Converter; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.core.GrantedAuthority; +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.JwtAuthenticationToken; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; + +@SpringBootApplication +public class ServletResourceServerApplication { + + public static void main(String[] args) { + SpringApplication.run(ServletResourceServerApplication.class, args); + } + + @Configuration + @EnableMethodSecurity + @EnableWebSecurity + static class SecurityConf { + @Bean + SecurityFilterChain filterChain(HttpSecurity http, Converter> authoritiesConverter) throws Exception { + // @formatter:off + 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()); + }); + + http.authorizeHttpRequests() + .requestMatchers("/secured-route").hasRole("AUTHORIZED_PERSONNEL") + .anyRequest().authenticated(); + // @formatter:on + + return http.build(); + } + + static interface AuthoritiesConverter extends Converter> { + } + + @Bean + AuthoritiesConverter realmRoles2AuthoritiesConverter() { + return (Jwt jwt) -> { + 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(); + }; + } + } + + @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()); + } + + @PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')") + public String getSecret() { + return "Only authorized personnel can read that"; + } + } + + @RestController + @RequiredArgsConstructor + public static class GreetingController { + private final MessageService messageService; + + @GetMapping("/greet") + public ResponseEntity greet() { + return ResponseEntity.ok(messageService.greet()); + } + + @GetMapping("/secured-route") + public ResponseEntity securedRoute() { + return ResponseEntity.ok(messageService.getSecret()); + } + + @GetMapping("/secured-method") + @PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')") + public ResponseEntity securedMethod() { + return ResponseEntity.ok(messageService.getSecret()); + } + } + +} diff --git a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/main/resources/application.properties b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/main/resources/application.properties new file mode 100644 index 0000000000..998f6303aa --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.security.oauth2.resourceserver.jwt.issuer-uri=https://localhost:8443/realms/master 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 new file mode 100644 index 0000000000..36be2df331 --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/MessageServiceUnitTest.java @@ -0,0 +1,79 @@ +package com.baeldung; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Import; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +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({ MessageService.class }) +@ExtendWith(SpringExtension.class) +@EnableMethodSecurity +class MessageServiceUnitTest { + @Autowired + MessageService messageService; + + /*----------------------------------------------------------------------------*/ + /* greet() */ + /* Expects a JwtAuthenticationToken to be retrieved from the security-context */ + /*----------------------------------------------------------------------------*/ + + @Test + void givenSecurityContextIsNotSet_whenGreet_thenThrowsAuthenticationCredentialsNotFoundException() { + assertThrows(AuthenticationCredentialsNotFoundException.class, () -> messageService.getSecret()); + } + + @Test + @WithAnonymousUser + void givenUserIsNotAuthenticated_whenGreet_thenThrowsAccessDeniedException() { + 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()); + } + + @Test + @WithMockUser(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, username = "ch4mpy") + void givenSecurityContextIsPopulatedWithUsernamePasswordAuthenticationToken_whenGreet_thenThrowsClassCastException() { + assertThrows(ClassCastException.class, () -> messageService.greet()); + } + + /*--------------------------------------------------------------------*/ + /* getSecret() */ + /* is secured with "@PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')")" */ + /*--------------------------------------------------------------------*/ + + @Test + @WithAnonymousUser + void givenUserIsNotAuthenticated_whenGetSecret_thenThrowsAccessDeniedException() { + assertThrows(AccessDeniedException.class, () -> messageService.getSecret()); + } + + @Test + @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) + void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecret_thenReturnSecret() { + assertEquals("Only authorized personnel can read that", messageService.getSecret()); + } + + @Test + @WithMockJwtAuth(authorities = { "admin" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) + void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecret_thenThrowsAccessDeniedException() { + assertThrows(AccessDeniedException.class, () -> messageService.getSecret()); + } + +} 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 new file mode 100644 index 0000000000..0c6504bff0 --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/ServletResourceServerApplicationIntegrationTest.java @@ -0,0 +1,114 @@ +package com.baeldung; + +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.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; + +@SpringBootTest(webEnvironment = WebEnvironment.MOCK) +@AutoConfigureMockMvc +class ServletResourceServerApplicationIntegrationTest { + @Autowired + MockMvc api; + + /*-----------------------------------------------------------------------------*/ + /* /greet */ + /* This end-point secured with ".anyRequest().authenticated()" in SecurityConf */ + /*-----------------------------------------------------------------------------*/ + + @Test + @WithAnonymousUser + void givenUserIsNotAuthenticated_whenGetGreet_thenUnauthorized() throws Exception { + // @formatter:off + api.perform(get("/greet")) + .andExpect(status().isUnauthorized()); + // @formatter:on + } + + @Test + @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) + void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { + // @formatter:off + api.perform(get("/greet")) + .andExpect(status().isOk()) + .andExpect(content().string("Hello ch4mpy! You are granted with [admin, ROLE_AUTHORIZED_PERSONNEL].")); + // @formatter:on + } + + /*---------------------------------------------------------------------------------------------------------------------*/ + /* /secured-route */ + /* This end-point is secured with ".requestMatchers("/secured-route").hasRole("AUTHORIZED_PERSONNEL")" in SecurityConf */ + /*---------------------------------------------------------------------------------------------------------------------*/ + + @Test + @WithAnonymousUser + void givenUserIsNotAuthenticated_whenGetSecuredRoute_thenUnauthorized() throws Exception { + // @formatter:off + api.perform(get("/secured-route")) + .andExpect(status().isUnauthorized()); + // @formatter:on + } + + @Test + @WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL") + void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenOk() throws Exception { + // @formatter:off + api.perform(get("/secured-route")) + .andExpect(status().isOk()) + .andExpect(content().string("Only authorized personnel can read that")); + // @formatter:on + } + + @Test + @WithMockJwtAuth("admin") + void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception { + // @formatter:off + api.perform(get("/secured-route")) + .andExpect(status().isForbidden()); + // @formatter:on + } + + /*---------------------------------------------------------------------------------------------------------*/ + /* /secured-method */ + /* This end-point is secured with "@PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')")" on @Controller method */ + /*---------------------------------------------------------------------------------------------------------*/ + + @Test + @WithAnonymousUser + void givenUserIsNotAuthenticated_whenGetSecuredMethod_thenUnauthorized() throws Exception { + // @formatter:off + api.perform(get("/secured-method")) + .andExpect(status().isUnauthorized()); + // @formatter:on + } + + @Test + @WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL") + void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenOk() throws Exception { + // @formatter:off + api.perform(get("/secured-method")) + .andExpect(status().isOk()) + .andExpect(content().string("Only authorized personnel can read that")); + // @formatter:on + } + + @Test + @WithMockJwtAuth("admin") + void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception { + // @formatter:off + api.perform(get("/secured-method")) + .andExpect(status().isForbidden()); + // @formatter:on + } + +} 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 new file mode 100644 index 0000000000..76902bb9b7 --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringAddonsGreetingControllerUnitTest.java @@ -0,0 +1,131 @@ +package com.baeldung; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +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.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +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.WithMockJwtAuth; + +@WebMvcTest(controllers = GreetingController.class, properties = { "server.ssl.enabled=false" }) +class SpringAddonsGreetingControllerUnitTest { + + @MockBean + MessageService messageService; + + @Autowired + MockMvc api; + + /*-----------------------------------------------------------------------------*/ + /* /greet */ + /* This end-point secured with ".anyRequest().authenticated()" in SecurityConf */ + /*-----------------------------------------------------------------------------*/ + + @Test + @WithAnonymousUser + void givenUserIsNotAuthenticated_whenGetGreet_thenUnauthorized() throws Exception { + // @formatter:off + api.perform(get("/greet")) + .andExpect(status().isUnauthorized()); + // @formatter:on + } + + @Test + @WithMockJwtAuth + void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { + final var greeting = "Whatever the service returns"; + when(messageService.greet()).thenReturn(greeting); + + // @formatter:off + api.perform(get("/greet")) + .andExpect(status().isOk()) + .andExpect(content().string(greeting)); + // @formatter:on + + verify(messageService, times(1)).greet(); + } + + /*---------------------------------------------------------------------------------------------------------------------*/ + /* /secured-route */ + /* This end-point is secured with ".requestMatchers("/secured-route").hasRole("AUTHORIZED_PERSONNEL")" in SecurityConf */ + /*---------------------------------------------------------------------------------------------------------------------*/ + + @Test + @WithAnonymousUser + void givenUserIsNotAuthenticated_whenGetSecuredRoute_thenUnauthorized() throws Exception { + // @formatter:off + api.perform(get("/secured-route")) + .andExpect(status().isUnauthorized()); + // @formatter:on + } + + @Test + @WithMockJwtAuth({ "admin", "ROLE_AUTHORIZED_PERSONNEL" }) + void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenOk() throws Exception { + final var secret = "Secret!"; + when(messageService.getSecret()).thenReturn(secret); + + // @formatter:off + api.perform(get("/secured-route")) + .andExpect(status().isOk()) + .andExpect(content().string(secret)); + // @formatter:on + } + + @Test + @WithMockJwtAuth({ "admin" }) + void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception { + // @formatter:off + api.perform(get("/secured-route")) + .andExpect(status().isForbidden()); + // @formatter:on + } + + /*---------------------------------------------------------------------------------------------------------*/ + /* /secured-method */ + /* This end-point is secured with "@PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')")" on @Controller method */ + /*---------------------------------------------------------------------------------------------------------*/ + + @Test + @WithAnonymousUser + void givenUserIsNotAuthenticated_whenGetSecuredMethod_thenUnauthorized() throws Exception { + // @formatter:off + api.perform(get("/secured-method")) + .andExpect(status().isUnauthorized()); + // @formatter:on + } + + @Test + @WithMockJwtAuth({ "admin", "ROLE_AUTHORIZED_PERSONNEL" }) + void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenOk() throws Exception { + final var secret = "Secret!"; + when(messageService.getSecret()).thenReturn(secret); + + // @formatter:off + api.perform(get("/secured-method")) + .andExpect(status().isOk()) + .andExpect(content().string(secret)); + // @formatter:on + } + + @Test + @WithMockJwtAuth(authorities = { "admin" }) + void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception { + // @formatter:off + api.perform(get("/secured-method")) + .andExpect(status().isForbidden()); + // @formatter:on + } + +} diff --git a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java new file mode 100644 index 0000000000..aa53dd7531 --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java @@ -0,0 +1,124 @@ +package com.baeldung; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.anonymous; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; +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.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.test.web.servlet.MockMvc; + +import com.baeldung.ServletResourceServerApplication.GreetingController; +import com.baeldung.ServletResourceServerApplication.MessageService; + +@WebMvcTest(controllers = GreetingController.class, properties = { "server.ssl.enabled=false" }) +class SpringSecurityTestGreetingControllerUnitTest { + + @MockBean + MessageService messageService; + + @Autowired + MockMvc api; + + /*-----------------------------------------------------------------------------*/ + /* /greet */ + /* This end-point secured with ".anyRequest().authenticated()" in SecurityConf */ + /*-----------------------------------------------------------------------------*/ + + @Test + void givenUserIsNotAuthenticated_whenGetGreet_thenUnauthorized() throws Exception { + // @formatter:off + api.perform(get("/greet").with(anonymous())) + .andExpect(status().isUnauthorized()); + // @formatter:on + } + + @Test + void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { + final var greeting = "Whatever the service returns"; + when(messageService.greet()).thenReturn(greeting); + + // @formatter:off + api.perform(get("/greet").with(jwt())) + .andExpect(status().isOk()) + .andExpect(content().string(greeting)); + // @formatter:on + + verify(messageService, times(1)).greet(); + } + + /*---------------------------------------------------------------------------------------------------------------------*/ + /* /secured-route */ + /* This end-point is secured with ".requestMatchers("/secured-route").hasRole("AUTHORIZED_PERSONNEL")" in SecurityConf */ + /*---------------------------------------------------------------------------------------------------------------------*/ + + @Test + void givenUserIsNotAuthenticated_whenGetSecuredRoute_thenUnauthorized() throws Exception { + // @formatter:off + api.perform(get("/secured-route").with(anonymous())) + .andExpect(status().isUnauthorized()); + // @formatter:on + } + + @Test + void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenOk() throws Exception { + final var secret = "Secret!"; + when(messageService.getSecret()).thenReturn(secret); + + // @formatter:off + api.perform(get("/secured-route").with(jwt().authorities(new SimpleGrantedAuthority("ROLE_AUTHORIZED_PERSONNEL")))) + .andExpect(status().isOk()) + .andExpect(content().string(secret)); + // @formatter:on + } + + @Test + void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception { + // @formatter:off + api.perform(get("/secured-route").with(jwt().authorities(new SimpleGrantedAuthority("admin")))) + .andExpect(status().isForbidden()); + // @formatter:on + } + + /*---------------------------------------------------------------------------------------------------------*/ + /* /secured-method */ + /* This end-point is secured with "@PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')")" on @Controller method */ + /*---------------------------------------------------------------------------------------------------------*/ + + @Test + void givenUserIsNotAuthenticated_whenGetSecuredMethod_thenUnauthorized() throws Exception { + // @formatter:off + api.perform(get("/secured-method").with(anonymous())) + .andExpect(status().isUnauthorized()); + // @formatter:on + } + + @Test + void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenOk() throws Exception { + final var secret = "Secret!"; + when(messageService.getSecret()).thenReturn(secret); + + // @formatter:off + api.perform(get("/secured-method").with(jwt().authorities(new SimpleGrantedAuthority("ROLE_AUTHORIZED_PERSONNEL")))) + .andExpect(status().isOk()) + .andExpect(content().string(secret)); + // @formatter:on + } + + @Test + void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception { + // @formatter:off + api.perform(get("/secured-method").with(jwt().authorities(new SimpleGrantedAuthority("admin")))) + .andExpect(status().isForbidden()); + // @formatter:on + } + +} From 66d71f0697a10aaabb74c90228870b6563e8d88a Mon Sep 17 00:00:00 2001 From: ch4mpy Date: Fri, 17 Feb 2023 12:18:02 -1000 Subject: [PATCH 562/592] Improve anonymous tests readability --- ...iveResourceServerApplicationIntegrationTest.java | 10 ++++++---- .../SpringAddonsGreetingControllerUnitTest.java | 10 ++++++---- ...pringSecurityTestGreetingControllerUnitTest.java | 13 +++++++++---- ...letResourceServerApplicationIntegrationTest.java | 4 +++- .../SpringAddonsGreetingControllerUnitTest.java | 5 ++++- ...pringSecurityTestGreetingControllerUnitTest.java | 7 ++++++- 6 files changed, 34 insertions(+), 15 deletions(-) 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 e3c45883c2..d464aa37ad 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 @@ -24,7 +24,7 @@ class ReactiveResourceServerApplicationIntegrationTest { @Test @WithAnonymousUser - void givenUserIsNotAuthenticated_whenGetGreet_thenUnauthorized() throws Exception { + void givenUserIsAnonymous_whenGetGreet_thenUnauthorized() throws Exception { // @formatter:off api.get().uri("/greet").exchange() .expectStatus().isUnauthorized(); @@ -32,7 +32,9 @@ class ReactiveResourceServerApplicationIntegrationTest { } @Test - @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) + @WithMockJwtAuth( + authorities = {"admin", "ROLE_AUTHORIZED_PERSONNEL"}, + claims = @OpenIdClaims(preferredUsername = "ch4mpy")) void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { // @formatter:off api.get().uri("/greet").exchange() @@ -48,7 +50,7 @@ class ReactiveResourceServerApplicationIntegrationTest { @Test @WithAnonymousUser - void givenUserIsNotAuthenticated_whenGetSecuredRoute_thenUnauthorized() throws Exception { + void givenUserIsAnonymous_whenGetSecuredRoute_thenUnauthorized() throws Exception { // @formatter:off api.get().uri("/secured-route").exchange() .expectStatus().isUnauthorized(); @@ -81,7 +83,7 @@ class ReactiveResourceServerApplicationIntegrationTest { @Test @WithAnonymousUser - void givenUserIsNotAuthenticated_whenGetSecuredMethod_thenUnauthorized() throws Exception { + void givenUserIsAnonymous_whenGetSecuredMethod_thenUnauthorized() throws Exception { // @formatter:off api.get().uri("/secured-method").exchange() .expectStatus().isUnauthorized(); 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 e28136dd25..38bbb4d0bd 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 @@ -34,12 +34,14 @@ class SpringAddonsGreetingControllerUnitTest { @Test @WithAnonymousUser - void givenUserIsNotAuthenticated_whenGetGreet_thenUnauthorized() throws Exception { + void givenUserIsAnonymous_whenGetGreet_thenUnauthorized() throws Exception { api.get().uri("/greet").exchange().expectStatus().isUnauthorized(); } @Test - @WithMockJwtAuth(claims = @OpenIdClaims(preferredUsername = "Tonton Pirate")) + @WithMockJwtAuth( + authorities = {"admin", "ROLE_AUTHORIZED_PERSONNEL"}, + claims = @OpenIdClaims(preferredUsername = "ch4mpy")) void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { final var greeting = "Whatever the service returns"; when(messageService.greet()).thenReturn(Mono.just(greeting)); @@ -60,7 +62,7 @@ class SpringAddonsGreetingControllerUnitTest { @Test @WithAnonymousUser - void givenUserIsNotAuthenticated_whenGetSecuredRoute_thenUnauthorized() throws Exception { + void givenUserIsAnonymous_whenGetSecuredRoute_thenUnauthorized() throws Exception { api.get().uri("/secured-route").exchange().expectStatus().isUnauthorized(); } @@ -93,7 +95,7 @@ class SpringAddonsGreetingControllerUnitTest { @Test @WithAnonymousUser - void givenUserIsNotAuthenticated_whenGetSecuredMethod_thenUnauthorized() throws Exception { + void givenUserIsAnonymous_whenGetSecuredMethod_thenUnauthorized() throws Exception { api.get().uri("/secured-method").exchange().expectStatus().isUnauthorized(); } diff --git a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java index 291a405e29..40ba700c21 100644 --- a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java @@ -6,6 +6,8 @@ import static org.mockito.Mockito.when; import static org.springframework.security.test.web.reactive.server.SecurityMockServerConfigurers.mockAuthentication; import static org.springframework.security.test.web.reactive.server.SecurityMockServerConfigurers.mockJwt; +import java.util.List; + import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; @@ -13,6 +15,7 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.oauth2.core.oidc.StandardClaimNames; import org.springframework.test.web.reactive.server.WebTestClient; import com.baeldung.ReactiveResourceServerApplication.GreetingController; @@ -39,7 +42,7 @@ class SpringSecurityTestGreetingControllerUnitTest { /*-----------------------------------------------------------------------------*/ @Test - void givenUserIsNotAuthenticated_whenGetGreet_thenUnauthorized() throws Exception { + void givenUserIsAnonymous_whenGetGreet_thenUnauthorized() throws Exception { // @formatter:off api.mutateWith(mockAuthentication(ANONYMOUS_AUTHENTICATION)) .get().uri("/greet").exchange() @@ -53,7 +56,9 @@ class SpringSecurityTestGreetingControllerUnitTest { when(messageService.greet()).thenReturn(Mono.just(greeting)); // @formatter:off - api.mutateWith(mockJwt()) + api.mutateWith(mockJwt() + .authorities(List.of(new SimpleGrantedAuthority("admin"), new SimpleGrantedAuthority("ROLE_AUTHORIZED_PERSONNEL"))) + .jwt(jwt -> jwt.claim(StandardClaimNames.PREFERRED_USERNAME, "ch4mpy"))) .get().uri("/greet").exchange() .expectStatus().isOk() .expectBody(String.class).isEqualTo(greeting); @@ -68,7 +73,7 @@ class SpringSecurityTestGreetingControllerUnitTest { /*---------------------------------------------------------------------------------------------------------------------*/ @Test - void givenUserIsNotAuthenticated_whenGetSecuredRoute_thenUnauthorized() throws Exception { + void givenUserIsAnonymous_whenGetSecuredRoute_thenUnauthorized() throws Exception { // @formatter:off api.mutateWith(mockAuthentication(ANONYMOUS_AUTHENTICATION)) .get().uri("/secured-route").exchange() @@ -104,7 +109,7 @@ class SpringSecurityTestGreetingControllerUnitTest { /*---------------------------------------------------------------------------------------------------------*/ @Test - void givenUserIsNotAuthenticated_whenGetSecuredMethod_thenUnauthorized() throws Exception { + void givenUserIsAnonymous_whenGetSecuredMethod_thenUnauthorized() throws Exception { // @formatter:off api.mutateWith(mockAuthentication(ANONYMOUS_AUTHENTICATION)) .get().uri("/secured-method").exchange() 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 0c6504bff0..eba908da75 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 @@ -36,7 +36,9 @@ class ServletResourceServerApplicationIntegrationTest { } @Test - @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) + @WithMockJwtAuth( + authorities = {"admin", "ROLE_AUTHORIZED_PERSONNEL"}, + claims = @OpenIdClaims(preferredUsername = "ch4mpy")) void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { // @formatter:off api.perform(get("/greet")) 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 76902bb9b7..f18ad85832 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 @@ -16,6 +16,7 @@ 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; @WebMvcTest(controllers = GreetingController.class, properties = { "server.ssl.enabled=false" }) @@ -42,7 +43,9 @@ class SpringAddonsGreetingControllerUnitTest { } @Test - @WithMockJwtAuth + @WithMockJwtAuth( + authorities = {"admin", "ROLE_AUTHORIZED_PERSONNEL"}, + claims = @OpenIdClaims(preferredUsername = "ch4mpy")) void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { final var greeting = "Whatever the service returns"; when(messageService.greet()).thenReturn(greeting); diff --git a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java index aa53dd7531..83a95cf508 100644 --- a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java @@ -9,11 +9,14 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import java.util.List; + import org.junit.jupiter.api.Test; 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.authority.SimpleGrantedAuthority; +import org.springframework.security.oauth2.core.oidc.StandardClaimNames; import org.springframework.test.web.servlet.MockMvc; import com.baeldung.ServletResourceServerApplication.GreetingController; @@ -47,7 +50,9 @@ class SpringSecurityTestGreetingControllerUnitTest { when(messageService.greet()).thenReturn(greeting); // @formatter:off - api.perform(get("/greet").with(jwt())) + api.perform(get("/greet").with(jwt() + .authorities(List.of(new SimpleGrantedAuthority("admin"), new SimpleGrantedAuthority("ROLE_AUTHORIZED_PERSONNEL"))) + .jwt(jwt -> jwt.claim(StandardClaimNames.PREFERRED_USERNAME, "ch4mpy")))) .andExpect(status().isOk()) .andExpect(content().string(greeting)); // @formatter:on From 26e401b2904ba4b2fcddada1b7e8a72ce185bfe2 Mon Sep 17 00:00:00 2001 From: ch4mpy Date: Sat, 25 Feb 2023 14:36:42 -1000 Subject: [PATCH 563/592] Baeldung source format --- .../spring-security-oauth2-testing/README.md | 7 -- .../spring-security-oauth2-testing/pom.xml | 58 ++++----- .../reactive-resource-server/pom.xml | 110 +++++++++--------- .../ReactiveResourceServerApplication.java | 68 +++++++---- .../com/baeldung/MessageServiceUnitTest.java | 21 ++-- ...ourceServerApplicationIntegrationTest.java | 87 +++++++------- ...pringAddonsGreetingControllerUnitTest.java | 79 ++++++++----- ...ecurityTestGreetingControllerUnitTest.java | 100 ++++++++-------- .../servlet-resource-server/pom.xml | 110 +++++++++--------- .../ServletResourceServerApplication.java | 44 ++++--- ...ourceServerApplicationIntegrationTest.java | 30 +---- ...pringAddonsGreetingControllerUnitTest.java | 22 +--- ...ecurityTestGreetingControllerUnitTest.java | 23 +--- 13 files changed, 384 insertions(+), 375 deletions(-) delete mode 100644 spring-security-modules/spring-security-oauth2-testing/README.md diff --git a/spring-security-modules/spring-security-oauth2-testing/README.md b/spring-security-modules/spring-security-oauth2-testing/README.md deleted file mode 100644 index 82728ff450..0000000000 --- a/spring-security-modules/spring-security-oauth2-testing/README.md +++ /dev/null @@ -1,7 +0,0 @@ -## Spring-Security 6 OAuth2 testing samples - -This module contains articles about testing spring-security 6 access-control with OAuth2 - -## Relevant articles: - -- [Testing Spring OAuth2 Access-Control](https://drafts.baeldung.com/?p=154767&preview=true) diff --git a/spring-security-modules/spring-security-oauth2-testing/pom.xml b/spring-security-modules/spring-security-oauth2-testing/pom.xml index f634b6105c..93348cb48c 100644 --- a/spring-security-modules/spring-security-oauth2-testing/pom.xml +++ b/spring-security-modules/spring-security-oauth2-testing/pom.xml @@ -1,32 +1,32 @@ - 4.0.0 - spring-security-oauth2-testing - spring-security-oauth2-testing - pom - spring-security 6 oauth testing sample project - - com.baeldung - parent-boot-3 - 0.0.1-SNAPSHOT - ../../parent-boot-3 - - - 6.0.14 - - - - - com.c4-soft.springaddons - spring-addons-oauth2-test - ${spring-addons.version} - - - - - reactive-resource-server - servlet-resource-server - + 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-oauth2-testing + spring-security-oauth2-testing + pom + spring-security 6 oauth testing sample project + + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 + + + 6.1.0 + + + + + com.c4-soft.springaddons + spring-addons-oauth2-test + ${spring-addons.version} + + + + + reactive-resource-server + servlet-resource-server + \ No newline at end of file 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 c1fa6b7c6d..86f73cfdbf 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 @@ -1,58 +1,58 @@ - 4.0.0 - - com.baeldung - spring-security-oauth2-testing - 0.0.1-SNAPSHOT - - com.baeldung.spring-security-modules.testing - reactive-resource-server - reactive-resource-server - Demo project for Spring Boot reactive resource-server - - 17 - - - - org.springframework.boot - spring-boot-starter-oauth2-resource-server - - - org.springframework.boot - spring-boot-starter-webflux - - - org.projectlombok - lombok - true - - - org.springframework.boot - spring-boot-starter-test - test - - - com.c4-soft.springaddons - spring-addons-oauth2-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - + 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-security-oauth2-testing + 0.0.1-SNAPSHOT + + com.baeldung.spring-security-modules.testing + reactive-resource-server + reactive-resource-server + Demo project for Spring Boot reactive resource-server + + 17 + + + + org.springframework.boot + spring-boot-starter-oauth2-resource-server + + + org.springframework.boot + spring-boot-starter-webflux + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + com.c4-soft.springaddons + spring-addons-oauth2-test + test + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + \ No newline at end of file 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 608038331a..500d876bc4 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 @@ -49,19 +49,32 @@ public class ReactiveResourceServerApplication { public 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 -> { - final var response = exchange.getResponse(); - 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())); - return response.writeWith(Mono.just(buffer)).doOnError(error -> DataBufferUtils.release(buffer)); - })); + 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 -> { + final var response = exchange.getResponse(); + 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())); + return response.writeWith(Mono.just(buffer)) + .doOnError(error -> DataBufferUtils.release(buffer)); + })); - http.authorizeExchange().pathMatchers("/secured-route").hasRole("AUTHORIZED_PERSONNEL").anyExchange().authenticated(); + http.authorizeExchange() + .pathMatchers("/secured-route") + .hasRole("AUTHORIZED_PERSONNEL") + .anyExchange() + .authenticated(); return http.build(); } @@ -72,10 +85,14 @@ public class ReactiveResourceServerApplication { @Bean AuthoritiesConverter 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 Mono.just(roles.stream() + .map(SimpleGrantedAuthority::new) + .map(GrantedAuthority.class::cast) + .toList()); }; } } @@ -84,13 +101,13 @@ public class ReactiveResourceServerApplication { 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(); + 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"))); } @PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')") @@ -106,18 +123,21 @@ public class ReactiveResourceServerApplication { @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 92896754ef..ecaf270f10 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 @@ -32,25 +32,29 @@ class MessageServiceUnitTest { @Test void givenSecurityContextIsEmpty_whenGreet_thenThrowsAuthenticationCredentialsNotFoundException() { - assertThrows(AuthenticationCredentialsNotFoundException.class, () -> messageService.greet().block()); + assertThrows(AuthenticationCredentialsNotFoundException.class, () -> messageService.greet() + .block()); } @Test @WithAnonymousUser void givenUserIsNotAuthenticated_whenGreet_thenThrowsClassCastException() { - assertThrows(ClassCastException.class, () -> messageService.greet().block()); + assertThrows(ClassCastException.class, () -> messageService.greet() + .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().block()); + assertEquals("Hello ch4mpy! You are granted with [admin, ROLE_AUTHORIZED_PERSONNEL].", messageService.greet() + .block()); } @Test @WithMockUser(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, username = "ch4mpy") void givenSecurityContextIsPopulatedWithUsernamePasswordAuthenticationToken_whenGreet_thenThrowsClassCastException() { - assertThrows(ClassCastException.class, () -> messageService.greet().block()); + assertThrows(ClassCastException.class, () -> messageService.greet() + .block()); } /*--------------------------------------------------------------------*/ @@ -61,19 +65,22 @@ class MessageServiceUnitTest { @Test @WithAnonymousUser void givenUserIsNotAuthenticated_whenGetSecret_thenThrowsAccessDeniedException() { - assertThrows(AccessDeniedException.class, () -> messageService.getSecret().block()); + assertThrows(AccessDeniedException.class, () -> messageService.getSecret() + .block()); } @Test @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecret_thenReturnSecret() { - assertEquals("Only authorized personnel can read that", messageService.getSecret().block()); + assertEquals("Only authorized personnel can read that", messageService.getSecret() + .block()); } @Test @WithMockJwtAuth(authorities = { "admin" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecret_thenThrowsAccessDeniedException() { - assertThrows(AccessDeniedException.class, () -> messageService.getSecret().block()); + assertThrows(AccessDeniedException.class, () -> messageService.getSecret() + .block()); } } 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 d464aa37ad..dd64eb2109 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 @@ -25,22 +25,23 @@ class ReactiveResourceServerApplicationIntegrationTest { @Test @WithAnonymousUser void givenUserIsAnonymous_whenGetGreet_thenUnauthorized() throws Exception { - // @formatter:off - api.get().uri("/greet").exchange() - .expectStatus().isUnauthorized(); - // @formatter:on + api.get() + .uri("/greet") + .exchange() + .expectStatus() + .isUnauthorized(); } @Test - @WithMockJwtAuth( - authorities = {"admin", "ROLE_AUTHORIZED_PERSONNEL"}, - claims = @OpenIdClaims(preferredUsername = "ch4mpy")) + @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { - // @formatter:off - api.get().uri("/greet").exchange() - .expectStatus().isOk() - .expectBody(String.class).isEqualTo("Hello ch4mpy! You are granted with [admin, ROLE_AUTHORIZED_PERSONNEL]."); - // @formatter:on + api.get() + .uri("/greet") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("Hello ch4mpy! You are granted with [admin, ROLE_AUTHORIZED_PERSONNEL]."); } /*---------------------------------------------------------------------------------------------------------------------*/ @@ -51,31 +52,35 @@ class ReactiveResourceServerApplicationIntegrationTest { @Test @WithAnonymousUser void givenUserIsAnonymous_whenGetSecuredRoute_thenUnauthorized() throws Exception { - // @formatter:off - api.get().uri("/secured-route").exchange() - .expectStatus().isUnauthorized(); - // @formatter:on + api.get() + .uri("/secured-route") + .exchange() + .expectStatus() + .isUnauthorized(); } @Test @WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL") void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenOk() throws Exception { - // @formatter:off - api.get().uri("/secured-route").exchange() - .expectStatus().isOk() - .expectBody(String.class).isEqualTo("Only authorized personnel can read that"); - // @formatter:on + api.get() + .uri("/secured-route") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("Only authorized personnel can read that"); } @Test @WithMockJwtAuth("admin") void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception { - // @formatter:off - api.get().uri("/secured-route").exchange() - .expectStatus().isForbidden(); - // @formatter:on + api.get() + .uri("/secured-route") + .exchange() + .expectStatus() + .isForbidden(); } - + /*---------------------------------------------------------------------------------------------------------*/ /* /secured-method */ /* This end-point is secured with "@PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')")" on @Controller method */ @@ -84,28 +89,32 @@ class ReactiveResourceServerApplicationIntegrationTest { @Test @WithAnonymousUser void givenUserIsAnonymous_whenGetSecuredMethod_thenUnauthorized() throws Exception { - // @formatter:off - api.get().uri("/secured-method").exchange() - .expectStatus().isUnauthorized(); - // @formatter:on + api.get() + .uri("/secured-method") + .exchange() + .expectStatus() + .isUnauthorized(); } @Test @WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL") void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenOk() throws Exception { - // @formatter:off - api.get().uri("/secured-method").exchange() - .expectStatus().isOk() - .expectBody(String.class).isEqualTo("Only authorized personnel can read that"); - // @formatter:on + api.get() + .uri("/secured-method") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("Only authorized personnel can read that"); } @Test @WithMockJwtAuth("admin") void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception { - // @formatter:off - api.get().uri("/secured-method").exchange() - .expectStatus().isForbidden(); - // @formatter:on + api.get() + .uri("/secured-method") + .exchange() + .expectStatus() + .isForbidden(); } } 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 38bbb4d0bd..0da6701781 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 @@ -35,22 +35,26 @@ class SpringAddonsGreetingControllerUnitTest { @Test @WithAnonymousUser void givenUserIsAnonymous_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")) + @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { final var greeting = "Whatever the service returns"; when(messageService.greet()).thenReturn(Mono.just(greeting)); - // @formatter:off - api.get().uri("/greet").exchange() - .expectStatus().isOk() - .expectBody(String.class).isEqualTo(greeting); - // @formatter:on + api.get() + .uri("/greet") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo(greeting); verify(messageService, times(1)).greet(); } @@ -63,7 +67,11 @@ class SpringAddonsGreetingControllerUnitTest { @Test @WithAnonymousUser void givenUserIsAnonymous_whenGetSecuredRoute_thenUnauthorized() throws Exception { - api.get().uri("/secured-route").exchange().expectStatus().isUnauthorized(); + api.get() + .uri("/secured-route") + .exchange() + .expectStatus() + .isUnauthorized(); } @Test @@ -72,22 +80,25 @@ class SpringAddonsGreetingControllerUnitTest { final var secret = "Secret!"; when(messageService.getSecret()).thenReturn(Mono.just(secret)); - // @formatter:off - api.get().uri("/secured-route").exchange() - .expectStatus().isOk() - .expectBody(String.class).isEqualTo(secret); - // @formatter:on + api.get() + .uri("/secured-route") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo(secret); } @Test @WithMockJwtAuth("admin") void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception { - // @formatter:off - api.get().uri("/secured-route").exchange() - .expectStatus().isForbidden(); - // @formatter:on + api.get() + .uri("/secured-route") + .exchange() + .expectStatus() + .isForbidden(); } - + /*---------------------------------------------------------------------------------------------------------*/ /* /secured-method */ /* This end-point is secured with "@PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')")" on @Controller method */ @@ -96,7 +107,11 @@ class SpringAddonsGreetingControllerUnitTest { @Test @WithAnonymousUser void givenUserIsAnonymous_whenGetSecuredMethod_thenUnauthorized() throws Exception { - api.get().uri("/secured-method").exchange().expectStatus().isUnauthorized(); + api.get() + .uri("/secured-method") + .exchange() + .expectStatus() + .isUnauthorized(); } @Test @@ -105,21 +120,23 @@ class SpringAddonsGreetingControllerUnitTest { final var secret = "Secret!"; when(messageService.getSecret()).thenReturn(Mono.just(secret)); - // @formatter:off - api.get().uri("/secured-method").exchange() - .expectStatus().isOk() - .expectBody(String.class).isEqualTo(secret); - // @formatter:on + api.get() + .uri("/secured-method") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo(secret); } @Test @WithMockJwtAuth("admin") void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception { - // @formatter:off - api.get().uri("/secured-method").exchange() - .expectStatus().isForbidden(); - // @formatter:on + api.get() + .uri("/secured-method") + .exchange() + .expectStatus() + .isForbidden(); } } - diff --git a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java index 40ba700c21..b15c1304e6 100644 --- a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java @@ -25,10 +25,7 @@ import reactor.core.publisher.Mono; @WebFluxTest(controllers = GreetingController.class, properties = { "server.ssl.enabled=false" }) class SpringSecurityTestGreetingControllerUnitTest { - private static final AnonymousAuthenticationToken ANONYMOUS_AUTHENTICATION = new AnonymousAuthenticationToken( - "anonymous", - "anonymousUser", - AuthorityUtils.createAuthorityList("ROLE_ANONYMOUS")); + private static final AnonymousAuthenticationToken ANONYMOUS_AUTHENTICATION = new AnonymousAuthenticationToken("anonymous", "anonymousUser", AuthorityUtils.createAuthorityList("ROLE_ANONYMOUS")); @MockBean MessageService messageService; @@ -43,11 +40,12 @@ class SpringSecurityTestGreetingControllerUnitTest { @Test void givenUserIsAnonymous_whenGetGreet_thenUnauthorized() throws Exception { - // @formatter:off api.mutateWith(mockAuthentication(ANONYMOUS_AUTHENTICATION)) - .get().uri("/greet").exchange() - .expectStatus().isUnauthorized(); - // @formatter:on + .get() + .uri("/greet") + .exchange() + .expectStatus() + .isUnauthorized(); } @Test @@ -55,14 +53,15 @@ class SpringSecurityTestGreetingControllerUnitTest { final var greeting = "Whatever the service returns"; when(messageService.greet()).thenReturn(Mono.just(greeting)); - // @formatter:off - api.mutateWith(mockJwt() - .authorities(List.of(new SimpleGrantedAuthority("admin"), new SimpleGrantedAuthority("ROLE_AUTHORIZED_PERSONNEL"))) - .jwt(jwt -> jwt.claim(StandardClaimNames.PREFERRED_USERNAME, "ch4mpy"))) - .get().uri("/greet").exchange() - .expectStatus().isOk() - .expectBody(String.class).isEqualTo(greeting); - // @formatter:on + api.mutateWith(mockJwt().authorities(List.of(new SimpleGrantedAuthority("admin"), new SimpleGrantedAuthority("ROLE_AUTHORIZED_PERSONNEL"))) + .jwt(jwt -> jwt.claim(StandardClaimNames.PREFERRED_USERNAME, "ch4mpy"))) + .get() + .uri("/greet") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo(greeting); verify(messageService, times(1)).greet(); } @@ -74,35 +73,39 @@ class SpringSecurityTestGreetingControllerUnitTest { @Test void givenUserIsAnonymous_whenGetSecuredRoute_thenUnauthorized() throws Exception { - // @formatter:off api.mutateWith(mockAuthentication(ANONYMOUS_AUTHENTICATION)) - .get().uri("/secured-route").exchange() - .expectStatus().isUnauthorized(); - // @formatter:on + .get() + .uri("/secured-route") + .exchange() + .expectStatus() + .isUnauthorized(); } - + @Test void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenOk() throws Exception { final var secret = "Secret!"; when(messageService.getSecret()).thenReturn(Mono.just(secret)); - - // @formatter:off + api.mutateWith(mockJwt().authorities(new SimpleGrantedAuthority("ROLE_AUTHORIZED_PERSONNEL"))) - .get().uri("/secured-route").exchange() - .expectStatus().isOk() - .expectBody(String.class).isEqualTo(secret); - // @formatter:on + .get() + .uri("/secured-route") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo(secret); } - + @Test void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception { - // @formatter:off api.mutateWith(mockJwt().authorities(new SimpleGrantedAuthority("admin"))) - .get().uri("/secured-route").exchange() - .expectStatus().isForbidden(); - // @formatter:on + .get() + .uri("/secured-route") + .exchange() + .expectStatus() + .isForbidden(); } - + /*---------------------------------------------------------------------------------------------------------*/ /* /secured-method */ /* This end-point is secured with "@PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')")" on @Controller method */ @@ -110,11 +113,12 @@ class SpringSecurityTestGreetingControllerUnitTest { @Test void givenUserIsAnonymous_whenGetSecuredMethod_thenUnauthorized() throws Exception { - // @formatter:off api.mutateWith(mockAuthentication(ANONYMOUS_AUTHENTICATION)) - .get().uri("/secured-method").exchange() - .expectStatus().isUnauthorized(); - // @formatter:on + .get() + .uri("/secured-method") + .exchange() + .expectStatus() + .isUnauthorized(); } @Test @@ -122,22 +126,24 @@ class SpringSecurityTestGreetingControllerUnitTest { final var secret = "Secret!"; when(messageService.getSecret()).thenReturn(Mono.just(secret)); - // @formatter:off api.mutateWith(mockJwt().authorities(new SimpleGrantedAuthority("ROLE_AUTHORIZED_PERSONNEL"))) - .get().uri("/secured-method").exchange() - .expectStatus().isOk() - .expectBody(String.class).isEqualTo(secret); - // @formatter:on + .get() + .uri("/secured-method") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo(secret); } @Test void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception { - // @formatter:off api.mutateWith(mockJwt().authorities(new SimpleGrantedAuthority("admin"))) - .get().uri("/secured-method").exchange() - .expectStatus().isForbidden(); - // @formatter:on + .get() + .uri("/secured-method") + .exchange() + .expectStatus() + .isForbidden(); } } - 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 8de154b934..271cc7dc18 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 @@ -1,58 +1,58 @@ - 4.0.0 - - com.baeldung - spring-security-oauth2-testing - 0.0.1-SNAPSHOT - - com.baeldung.spring-security-modules.testing - servlet-resource-server - servlet-resource-server - Demo project for Spring Boot servlet resource-server - - 17 - - - - org.springframework.boot - spring-boot-starter-oauth2-resource-server - - - org.springframework.boot - spring-boot-starter-web - - - org.projectlombok - lombok - true - - - org.springframework.boot - spring-boot-starter-test - test - - - com.c4-soft.springaddons - spring-addons-oauth2-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - + 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-security-oauth2-testing + 0.0.1-SNAPSHOT + + com.baeldung.spring-security-modules.testing + servlet-resource-server + servlet-resource-server + Demo project for Spring Boot servlet resource-server + + 17 + + + + org.springframework.boot + spring-boot-starter-oauth2-resource-server + + + org.springframework.boot + spring-boot-starter-web + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + com.c4-soft.springaddons + spring-addons-oauth2-test + test + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + 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 ba55944c29..a30c60eab0 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 @@ -44,18 +44,25 @@ public class ServletResourceServerApplication { static class SecurityConf { @Bean SecurityFilterChain filterChain(HttpSecurity http, Converter> authoritiesConverter) throws Exception { - // @formatter:off - 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()); - }); - + 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()); + }); + http.authorizeHttpRequests() - .requestMatchers("/secured-route").hasRole("AUTHORIZED_PERSONNEL") - .anyRequest().authenticated(); - // @formatter:on + .requestMatchers("/secured-route") + .hasRole("AUTHORIZED_PERSONNEL") + .anyRequest() + .authenticated(); return http.build(); } @@ -66,10 +73,14 @@ public class ServletResourceServerApplication { @Bean AuthoritiesConverter 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(); }; } } @@ -78,11 +89,10 @@ public class ServletResourceServerApplication { public static class MessageService { public String greet() { - final var who = (JwtAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); + 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()); + return "Hello %s! You are granted with %s.".formatted(claims.getOrDefault(StandardClaimNames.PREFERRED_USERNAME, claims.get(StandardClaimNames.SUB)), who.getAuthorities()); } @PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')") 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 eba908da75..60b74e93be 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 @@ -29,22 +29,16 @@ class ServletResourceServerApplicationIntegrationTest { @Test @WithAnonymousUser void givenUserIsNotAuthenticated_whenGetGreet_thenUnauthorized() throws Exception { - // @formatter:off api.perform(get("/greet")) .andExpect(status().isUnauthorized()); - // @formatter:on } @Test - @WithMockJwtAuth( - authorities = {"admin", "ROLE_AUTHORIZED_PERSONNEL"}, - claims = @OpenIdClaims(preferredUsername = "ch4mpy")) + @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { - // @formatter:off api.perform(get("/greet")) - .andExpect(status().isOk()) - .andExpect(content().string("Hello ch4mpy! You are granted with [admin, ROLE_AUTHORIZED_PERSONNEL].")); - // @formatter:on + .andExpect(status().isOk()) + .andExpect(content().string("Hello ch4mpy! You are granted with [admin, ROLE_AUTHORIZED_PERSONNEL].")); } /*---------------------------------------------------------------------------------------------------------------------*/ @@ -55,31 +49,25 @@ class ServletResourceServerApplicationIntegrationTest { @Test @WithAnonymousUser void givenUserIsNotAuthenticated_whenGetSecuredRoute_thenUnauthorized() throws Exception { - // @formatter:off api.perform(get("/secured-route")) .andExpect(status().isUnauthorized()); - // @formatter:on } @Test @WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL") void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenOk() throws Exception { - // @formatter:off api.perform(get("/secured-route")) - .andExpect(status().isOk()) - .andExpect(content().string("Only authorized personnel can read that")); - // @formatter:on + .andExpect(status().isOk()) + .andExpect(content().string("Only authorized personnel can read that")); } @Test @WithMockJwtAuth("admin") void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception { - // @formatter:off api.perform(get("/secured-route")) .andExpect(status().isForbidden()); - // @formatter:on } - + /*---------------------------------------------------------------------------------------------------------*/ /* /secured-method */ /* This end-point is secured with "@PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')")" on @Controller method */ @@ -88,29 +76,23 @@ class ServletResourceServerApplicationIntegrationTest { @Test @WithAnonymousUser void givenUserIsNotAuthenticated_whenGetSecuredMethod_thenUnauthorized() throws Exception { - // @formatter:off api.perform(get("/secured-method")) .andExpect(status().isUnauthorized()); - // @formatter:on } @Test @WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL") void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenOk() throws Exception { - // @formatter:off api.perform(get("/secured-method")) .andExpect(status().isOk()) .andExpect(content().string("Only authorized personnel can read that")); - // @formatter:on } @Test @WithMockJwtAuth("admin") void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception { - // @formatter:off api.perform(get("/secured-method")) .andExpect(status().isForbidden()); - // @formatter:on } } 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 f18ad85832..949a8aa04c 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 @@ -36,25 +36,19 @@ class SpringAddonsGreetingControllerUnitTest { @Test @WithAnonymousUser void givenUserIsNotAuthenticated_whenGetGreet_thenUnauthorized() throws Exception { - // @formatter:off api.perform(get("/greet")) .andExpect(status().isUnauthorized()); - // @formatter:on } @Test - @WithMockJwtAuth( - authorities = {"admin", "ROLE_AUTHORIZED_PERSONNEL"}, - claims = @OpenIdClaims(preferredUsername = "ch4mpy")) + @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { final var greeting = "Whatever the service returns"; when(messageService.greet()).thenReturn(greeting); - // @formatter:off api.perform(get("/greet")) .andExpect(status().isOk()) .andExpect(content().string(greeting)); - // @formatter:on verify(messageService, times(1)).greet(); } @@ -67,10 +61,8 @@ class SpringAddonsGreetingControllerUnitTest { @Test @WithAnonymousUser void givenUserIsNotAuthenticated_whenGetSecuredRoute_thenUnauthorized() throws Exception { - // @formatter:off api.perform(get("/secured-route")) .andExpect(status().isUnauthorized()); - // @formatter:on } @Test @@ -79,22 +71,18 @@ class SpringAddonsGreetingControllerUnitTest { final var secret = "Secret!"; when(messageService.getSecret()).thenReturn(secret); - // @formatter:off api.perform(get("/secured-route")) .andExpect(status().isOk()) .andExpect(content().string(secret)); - // @formatter:on } @Test @WithMockJwtAuth({ "admin" }) void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception { - // @formatter:off api.perform(get("/secured-route")) .andExpect(status().isForbidden()); - // @formatter:on } - + /*---------------------------------------------------------------------------------------------------------*/ /* /secured-method */ /* This end-point is secured with "@PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')")" on @Controller method */ @@ -103,10 +91,8 @@ class SpringAddonsGreetingControllerUnitTest { @Test @WithAnonymousUser void givenUserIsNotAuthenticated_whenGetSecuredMethod_thenUnauthorized() throws Exception { - // @formatter:off api.perform(get("/secured-method")) .andExpect(status().isUnauthorized()); - // @formatter:on } @Test @@ -115,20 +101,16 @@ class SpringAddonsGreetingControllerUnitTest { final var secret = "Secret!"; when(messageService.getSecret()).thenReturn(secret); - // @formatter:off api.perform(get("/secured-method")) .andExpect(status().isOk()) .andExpect(content().string(secret)); - // @formatter:on } @Test @WithMockJwtAuth(authorities = { "admin" }) void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception { - // @formatter:off api.perform(get("/secured-method")) .andExpect(status().isForbidden()); - // @formatter:on } } diff --git a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java index 83a95cf508..2bbd294401 100644 --- a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java @@ -38,10 +38,8 @@ class SpringSecurityTestGreetingControllerUnitTest { @Test void givenUserIsNotAuthenticated_whenGetGreet_thenUnauthorized() throws Exception { - // @formatter:off api.perform(get("/greet").with(anonymous())) .andExpect(status().isUnauthorized()); - // @formatter:on } @Test @@ -49,13 +47,10 @@ class SpringSecurityTestGreetingControllerUnitTest { final var greeting = "Whatever the service returns"; when(messageService.greet()).thenReturn(greeting); - // @formatter:off - api.perform(get("/greet").with(jwt() - .authorities(List.of(new SimpleGrantedAuthority("admin"), new SimpleGrantedAuthority("ROLE_AUTHORIZED_PERSONNEL"))) - .jwt(jwt -> jwt.claim(StandardClaimNames.PREFERRED_USERNAME, "ch4mpy")))) + api.perform(get("/greet").with(jwt().authorities(List.of(new SimpleGrantedAuthority("admin"), new SimpleGrantedAuthority("ROLE_AUTHORIZED_PERSONNEL"))) + .jwt(jwt -> jwt.claim(StandardClaimNames.PREFERRED_USERNAME, "ch4mpy")))) .andExpect(status().isOk()) .andExpect(content().string(greeting)); - // @formatter:on verify(messageService, times(1)).greet(); } @@ -67,10 +62,8 @@ class SpringSecurityTestGreetingControllerUnitTest { @Test void givenUserIsNotAuthenticated_whenGetSecuredRoute_thenUnauthorized() throws Exception { - // @formatter:off api.perform(get("/secured-route").with(anonymous())) .andExpect(status().isUnauthorized()); - // @formatter:on } @Test @@ -78,21 +71,17 @@ class SpringSecurityTestGreetingControllerUnitTest { final var secret = "Secret!"; when(messageService.getSecret()).thenReturn(secret); - // @formatter:off api.perform(get("/secured-route").with(jwt().authorities(new SimpleGrantedAuthority("ROLE_AUTHORIZED_PERSONNEL")))) .andExpect(status().isOk()) .andExpect(content().string(secret)); - // @formatter:on } @Test void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception { - // @formatter:off api.perform(get("/secured-route").with(jwt().authorities(new SimpleGrantedAuthority("admin")))) .andExpect(status().isForbidden()); - // @formatter:on } - + /*---------------------------------------------------------------------------------------------------------*/ /* /secured-method */ /* This end-point is secured with "@PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')")" on @Controller method */ @@ -100,10 +89,8 @@ class SpringSecurityTestGreetingControllerUnitTest { @Test void givenUserIsNotAuthenticated_whenGetSecuredMethod_thenUnauthorized() throws Exception { - // @formatter:off api.perform(get("/secured-method").with(anonymous())) .andExpect(status().isUnauthorized()); - // @formatter:on } @Test @@ -111,19 +98,15 @@ class SpringSecurityTestGreetingControllerUnitTest { final var secret = "Secret!"; when(messageService.getSecret()).thenReturn(secret); - // @formatter:off api.perform(get("/secured-method").with(jwt().authorities(new SimpleGrantedAuthority("ROLE_AUTHORIZED_PERSONNEL")))) .andExpect(status().isOk()) .andExpect(content().string(secret)); - // @formatter:on } @Test void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception { - // @formatter:off api.perform(get("/secured-method").with(jwt().authorities(new SimpleGrantedAuthority("admin")))) .andExpect(status().isForbidden()); - // @formatter:on } } From 5679db5cb82e15eec0b4240bddaae45f04cdbdc9 Mon Sep 17 00:00:00 2001 From: ch4mpy Date: Wed, 1 Mar 2023 14:20:41 -1000 Subject: [PATCH 564/592] BAEL-6223 : ul (CONFIGURATION) Move spring-security-oauth2-testing module declaration --- pom.xml | 1 - spring-security-modules/pom.xml | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 345cd7979a..0ec9e9efdd 100644 --- a/pom.xml +++ b/pom.xml @@ -1023,7 +1023,6 @@ spring-kafka spring-native - spring-security-modules/spring-security-oauth2-testing spring-protobuf spring-quartz diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml index 223f0894d5..6fb9f8ea0b 100644 --- a/spring-security-modules/pom.xml +++ b/spring-security-modules/pom.xml @@ -26,6 +26,7 @@ spring-security-oauth2-sso spring-security-oidc spring-security-okta + spring-security-oauth2-testing spring-security-saml spring-security-social-login spring-security-web-angular From 052dd5e64fa414114d30d965390d67b4872725fa Mon Sep 17 00:00:00 2001 From: ch4mpy Date: Wed, 1 Mar 2023 14:53:01 -1000 Subject: [PATCH 565/592] BAEL-6223 : ul (CONFIGURATION) Anonymous test methods naming --- .../src/test/java/com/baeldung/MessageServiceUnitTest.java | 4 ++-- .../ReactiveResourceServerApplicationIntegrationTest.java | 6 +++--- .../baeldung/SpringAddonsGreetingControllerUnitTest.java | 6 +++--- .../SpringSecurityTestGreetingControllerUnitTest.java | 6 +++--- .../src/test/java/com/baeldung/MessageServiceUnitTest.java | 4 ++-- .../ServletResourceServerApplicationIntegrationTest.java | 6 +++--- .../baeldung/SpringAddonsGreetingControllerUnitTest.java | 6 +++--- .../SpringSecurityTestGreetingControllerUnitTest.java | 6 +++--- 8 files changed, 22 insertions(+), 22 deletions(-) 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 ecaf270f10..97893bc1fb 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 @@ -38,7 +38,7 @@ class MessageServiceUnitTest { @Test @WithAnonymousUser - void givenUserIsNotAuthenticated_whenGreet_thenThrowsClassCastException() { + void givenUserIsAnonymous_whenGreet_thenThrowsClassCastException() { assertThrows(ClassCastException.class, () -> messageService.greet() .block()); } @@ -64,7 +64,7 @@ class MessageServiceUnitTest { @Test @WithAnonymousUser - void givenUserIsNotAuthenticated_whenGetSecret_thenThrowsAccessDeniedException() { + void givenUserIsAnonymous_whenGetSecret_thenThrowsAccessDeniedException() { assertThrows(AccessDeniedException.class, () -> messageService.getSecret() .block()); } 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 dd64eb2109..1ee6fc7e87 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 @@ -24,7 +24,7 @@ class ReactiveResourceServerApplicationIntegrationTest { @Test @WithAnonymousUser - void givenUserIsAnonymous_whenGetGreet_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetGreet_thenUnauthorized() throws Exception { api.get() .uri("/greet") .exchange() @@ -51,7 +51,7 @@ class ReactiveResourceServerApplicationIntegrationTest { @Test @WithAnonymousUser - void givenUserIsAnonymous_whenGetSecuredRoute_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetSecuredRoute_thenUnauthorized() throws Exception { api.get() .uri("/secured-route") .exchange() @@ -88,7 +88,7 @@ class ReactiveResourceServerApplicationIntegrationTest { @Test @WithAnonymousUser - void givenUserIsAnonymous_whenGetSecuredMethod_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetSecuredMethod_thenUnauthorized() throws Exception { api.get() .uri("/secured-method") .exchange() 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 0da6701781..6f55f287d8 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 @@ -34,7 +34,7 @@ class SpringAddonsGreetingControllerUnitTest { @Test @WithAnonymousUser - void givenUserIsAnonymous_whenGetGreet_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetGreet_thenUnauthorized() throws Exception { api.get() .uri("/greet") .exchange() @@ -66,7 +66,7 @@ class SpringAddonsGreetingControllerUnitTest { @Test @WithAnonymousUser - void givenUserIsAnonymous_whenGetSecuredRoute_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetSecuredRoute_thenUnauthorized() throws Exception { api.get() .uri("/secured-route") .exchange() @@ -106,7 +106,7 @@ class SpringAddonsGreetingControllerUnitTest { @Test @WithAnonymousUser - void givenUserIsAnonymous_whenGetSecuredMethod_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetSecuredMethod_thenUnauthorized() throws Exception { api.get() .uri("/secured-method") .exchange() diff --git a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java index b15c1304e6..e048481ce4 100644 --- a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java @@ -39,7 +39,7 @@ class SpringSecurityTestGreetingControllerUnitTest { /*-----------------------------------------------------------------------------*/ @Test - void givenUserIsAnonymous_whenGetGreet_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetGreet_thenUnauthorized() throws Exception { api.mutateWith(mockAuthentication(ANONYMOUS_AUTHENTICATION)) .get() .uri("/greet") @@ -72,7 +72,7 @@ class SpringSecurityTestGreetingControllerUnitTest { /*---------------------------------------------------------------------------------------------------------------------*/ @Test - void givenUserIsAnonymous_whenGetSecuredRoute_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetSecuredRoute_thenUnauthorized() throws Exception { api.mutateWith(mockAuthentication(ANONYMOUS_AUTHENTICATION)) .get() .uri("/secured-route") @@ -112,7 +112,7 @@ class SpringSecurityTestGreetingControllerUnitTest { /*---------------------------------------------------------------------------------------------------------*/ @Test - void givenUserIsAnonymous_whenGetSecuredMethod_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetSecuredMethod_thenUnauthorized() throws Exception { api.mutateWith(mockAuthentication(ANONYMOUS_AUTHENTICATION)) .get() .uri("/secured-method") 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 36be2df331..3c608d226e 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 @@ -37,7 +37,7 @@ class MessageServiceUnitTest { @Test @WithAnonymousUser - void givenUserIsNotAuthenticated_whenGreet_thenThrowsAccessDeniedException() { + void givenUserIsAnonymous_whenGreet_thenThrowsAccessDeniedException() { assertThrows(AccessDeniedException.class, () -> messageService.getSecret()); } @@ -60,7 +60,7 @@ class MessageServiceUnitTest { @Test @WithAnonymousUser - void givenUserIsNotAuthenticated_whenGetSecret_thenThrowsAccessDeniedException() { + void givenUserIsAnonymous_whenGetSecret_thenThrowsAccessDeniedException() { assertThrows(AccessDeniedException.class, () -> messageService.getSecret()); } 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 60b74e93be..5bb539741f 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 @@ -28,7 +28,7 @@ class ServletResourceServerApplicationIntegrationTest { @Test @WithAnonymousUser - void givenUserIsNotAuthenticated_whenGetGreet_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetGreet_thenUnauthorized() throws Exception { api.perform(get("/greet")) .andExpect(status().isUnauthorized()); } @@ -48,7 +48,7 @@ class ServletResourceServerApplicationIntegrationTest { @Test @WithAnonymousUser - void givenUserIsNotAuthenticated_whenGetSecuredRoute_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetSecuredRoute_thenUnauthorized() throws Exception { api.perform(get("/secured-route")) .andExpect(status().isUnauthorized()); } @@ -75,7 +75,7 @@ class ServletResourceServerApplicationIntegrationTest { @Test @WithAnonymousUser - void givenUserIsNotAuthenticated_whenGetSecuredMethod_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetSecuredMethod_thenUnauthorized() throws Exception { api.perform(get("/secured-method")) .andExpect(status().isUnauthorized()); } 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 949a8aa04c..9162768930 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 @@ -35,7 +35,7 @@ class SpringAddonsGreetingControllerUnitTest { @Test @WithAnonymousUser - void givenUserIsNotAuthenticated_whenGetGreet_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetGreet_thenUnauthorized() throws Exception { api.perform(get("/greet")) .andExpect(status().isUnauthorized()); } @@ -60,7 +60,7 @@ class SpringAddonsGreetingControllerUnitTest { @Test @WithAnonymousUser - void givenUserIsNotAuthenticated_whenGetSecuredRoute_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetSecuredRoute_thenUnauthorized() throws Exception { api.perform(get("/secured-route")) .andExpect(status().isUnauthorized()); } @@ -90,7 +90,7 @@ class SpringAddonsGreetingControllerUnitTest { @Test @WithAnonymousUser - void givenUserIsNotAuthenticated_whenGetSecuredMethod_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetSecuredMethod_thenUnauthorized() throws Exception { api.perform(get("/secured-method")) .andExpect(status().isUnauthorized()); } diff --git a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java index 2bbd294401..0e710bcc9f 100644 --- a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringSecurityTestGreetingControllerUnitTest.java @@ -37,7 +37,7 @@ class SpringSecurityTestGreetingControllerUnitTest { /*-----------------------------------------------------------------------------*/ @Test - void givenUserIsNotAuthenticated_whenGetGreet_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetGreet_thenUnauthorized() throws Exception { api.perform(get("/greet").with(anonymous())) .andExpect(status().isUnauthorized()); } @@ -61,7 +61,7 @@ class SpringSecurityTestGreetingControllerUnitTest { /*---------------------------------------------------------------------------------------------------------------------*/ @Test - void givenUserIsNotAuthenticated_whenGetSecuredRoute_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetSecuredRoute_thenUnauthorized() throws Exception { api.perform(get("/secured-route").with(anonymous())) .andExpect(status().isUnauthorized()); } @@ -88,7 +88,7 @@ class SpringSecurityTestGreetingControllerUnitTest { /*---------------------------------------------------------------------------------------------------------*/ @Test - void givenUserIsNotAuthenticated_whenGetSecuredMethod_thenUnauthorized() throws Exception { + void givenRequestIsAnonymous_whenGetSecuredMethod_thenUnauthorized() throws Exception { api.perform(get("/secured-method").with(anonymous())) .andExpect(status().isUnauthorized()); } From 769ca1793720209eea37b3d2f59099c4f10454eb Mon Sep 17 00:00:00 2001 From: ch4mpy Date: Wed, 1 Mar 2023 14:53:35 -1000 Subject: [PATCH 566/592] BAEL-6223 : ul (CONFIGURATION) Revert move spring-security-oauth2-testing module declaration --- pom.xml | 1 + spring-security-modules/pom.xml | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0ec9e9efdd..345cd7979a 100644 --- a/pom.xml +++ b/pom.xml @@ -1023,6 +1023,7 @@ spring-kafka spring-native + spring-security-modules/spring-security-oauth2-testing spring-protobuf spring-quartz diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml index 6fb9f8ea0b..223f0894d5 100644 --- a/spring-security-modules/pom.xml +++ b/spring-security-modules/pom.xml @@ -26,7 +26,6 @@ spring-security-oauth2-sso spring-security-oidc spring-security-okta - spring-security-oauth2-testing spring-security-saml spring-security-social-login spring-security-web-angular From 39260b32299243a451052f0f77afed6cfc1f3199 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 2 Mar 2023 18:31:13 +0200 Subject: [PATCH 567/592] [JAVA-18129] Upgraded dependencies versions (#13560) * [JAVA-18129] Upgraded dependencies versions * [JAVA-18129] Upgraded dependencies versions --- .../shipping-tracker/ShippingFunction/pom.xml | 4 ++-- .../aws-lambda/todo-reminder/ToDoFunction/pom.xml | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/pom.xml b/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/pom.xml index c36c81375d..24f2a76912 100644 --- a/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/pom.xml +++ b/aws-modules/aws-lambda/shipping-tracker/ShippingFunction/pom.xml @@ -69,8 +69,8 @@ - 1.8 - 1.8 + 11 + 11 5.4.21.Final 1.2.0 3.1.0 diff --git a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/pom.xml b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/pom.xml index cb6dd08d1e..0dd2e4d14a 100644 --- a/aws-modules/aws-lambda/todo-reminder/ToDoFunction/pom.xml +++ b/aws-modules/aws-lambda/todo-reminder/ToDoFunction/pom.xml @@ -1,6 +1,6 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 helloworld ToDoFunction @@ -101,16 +101,16 @@ - 1.8 - 1.8 + 11 + 11 1.2.1 3.6.0 - 1.1.0 + 1.2.1 1.2.0 2.13.2 11.2 - 5.0.1 - 1.2.0 + 5.1.0 + 2.0.2 4.1.0 3.19.0 5.8.1 From f558b0376bb15a18d76d848aea4639d50294ee03 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 2 Mar 2023 18:33:39 +0200 Subject: [PATCH 568/592] [JAVA-18124] Upgraded dependencies versions (#13564) --- apache-libraries/pom.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apache-libraries/pom.xml b/apache-libraries/pom.xml index b6418e6a04..c1def03bee 100644 --- a/apache-libraries/pom.xml +++ b/apache-libraries/pom.xml @@ -188,13 +188,13 @@ 1.8.2 2.45.0 - 1.1.2 - 1.1.0.Final - 1.2.0 + 2.0.6 + 2.0.1.Final + 1.2.15 3.10.0 - 1.2.1 - 1.2.1 - 1.2.1 + 1.2.15 + 1.2.15 + 1.2.15 1.8.4 2.1.1-incubating 3.4.11 From c625ca9866fd68da30bd6e9ca0258791d95019c1 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 2 Mar 2023 18:34:22 +0200 Subject: [PATCH 569/592] [JAVA-16377] Upgraded cxf-rt-databinding-aegis version (#13565) --- apache-cxf-modules/cxf-aegis/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apache-cxf-modules/cxf-aegis/pom.xml b/apache-cxf-modules/cxf-aegis/pom.xml index d013aabc65..6b9e026cdd 100644 --- a/apache-cxf-modules/cxf-aegis/pom.xml +++ b/apache-cxf-modules/cxf-aegis/pom.xml @@ -20,4 +20,8 @@ + + 4.0.0 + + \ No newline at end of file From 78fc83b30d6aab52a2378f4ff9cee11491517a7d Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 2 Mar 2023 18:35:08 +0200 Subject: [PATCH 570/592] [JAVA-18180] Fixed integration test (#13566) --- .../spring-5-reactive-client/pom.xml | 10 +--------- .../logging/WebClientLoggingIntegrationTest.java | 2 +- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/spring-reactive-modules/spring-5-reactive-client/pom.xml b/spring-reactive-modules/spring-5-reactive-client/pom.xml index 16581d53af..a0e5f7794e 100644 --- a/spring-reactive-modules/spring-5-reactive-client/pom.xml +++ b/spring-reactive-modules/spring-5-reactive-client/pom.xml @@ -136,14 +136,6 @@ JAR - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - @@ -189,7 +181,7 @@ 1.0 1.1.6 4.0.1 - 3.2.10.RELEASE + 3.5.3 2.26.0 diff --git a/spring-reactive-modules/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java b/spring-reactive-modules/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java index dabfd22056..e1eefe4d61 100644 --- a/spring-reactive-modules/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java +++ b/spring-reactive-modules/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java @@ -49,7 +49,7 @@ public class WebClientLoggingIntegrationTest { private String sampleResponseBody; @BeforeEach - private void setup() throws Exception { + void setup() throws Exception { post = new Post("Learn WebClient logging with Baeldung!", "", 1); sampleResponseBody = new ObjectMapper().writeValueAsString(post); From cfedf55a2916b2a3e33ec30e03033e7bb1ad684e Mon Sep 17 00:00:00 2001 From: Eugene Kovko <37694937+eukovko@users.noreply.github.com> Date: Thu, 2 Mar 2023 18:22:53 +0100 Subject: [PATCH 571/592] BAEL-6228 Updated test names (#13571) --- .../functional/BiFunctionExample.java | 17 -------------- .../pipeline/functional/FunctionExample.java | 17 -------------- .../pipeline/BiFunctionPipelineUnitTest.java | 22 +++++++++++++++++++ .../pipeline/FunctionPipelineUnitTest.java | 21 ++++++++++++++++++ .../com/baeldung/pipeline/PipeUnitTest.java | 2 +- .../baeldung/pipeline/PipelineUnitTest.java | 2 +- 6 files changed, 45 insertions(+), 36 deletions(-) delete mode 100644 patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/functional/BiFunctionExample.java delete mode 100644 patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/functional/FunctionExample.java create mode 100644 patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/BiFunctionPipelineUnitTest.java create mode 100644 patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/FunctionPipelineUnitTest.java diff --git a/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/functional/BiFunctionExample.java b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/functional/BiFunctionExample.java deleted file mode 100644 index 8fedce3943..0000000000 --- a/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/functional/BiFunctionExample.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.pipeline.functional; - -import java.util.function.BiFunction; -import java.util.function.Function; - -public class BiFunctionExample { - - public static void main(String[] args) { - BiFunction add = Integer::sum; - BiFunction mul = (a, b) -> a * b; - Function toString = Object::toString; - BiFunction pipeline - = add.andThen(a -> mul.apply(a, 2)).andThen(toString); - String result = pipeline.apply(1, 2); - System.out.println(result); - } -} diff --git a/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/functional/FunctionExample.java b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/functional/FunctionExample.java deleted file mode 100644 index eb393af0ac..0000000000 --- a/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/pipeline/functional/FunctionExample.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.pipeline.functional; - -import java.util.function.Function; - -public class FunctionExample { - - public static void main(String[] args) { - Function square = s -> s * s; - Function half = s -> s / 2; - Function toString = Object::toString; - Function pipeline = square.andThen(half) - .andThen(toString); - String result = pipeline.apply(5); - System.out.println(result); - } - -} diff --git a/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/BiFunctionPipelineUnitTest.java b/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/BiFunctionPipelineUnitTest.java new file mode 100644 index 0000000000..5f094ad6e8 --- /dev/null +++ b/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/BiFunctionPipelineUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.pipeline; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.function.BiFunction; +import java.util.function.Function; +import org.junit.jupiter.api.Test; + +class BiFunctionPipelineUnitTest { + + @Test + void whenCombiningFunctionAndBiFunctions_andInitializingPipeline_thenResultIsCorrect() { + BiFunction add = Integer::sum; + BiFunction mul = (a, b) -> a * b; + Function toString = Object::toString; + BiFunction pipeline = add.andThen(a -> mul.apply(a, 2)) + .andThen(toString); + String result = pipeline.apply(1, 2); + String expected = "6"; + assertEquals(expected, result); + } +} \ No newline at end of file diff --git a/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/FunctionPipelineUnitTest.java b/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/FunctionPipelineUnitTest.java new file mode 100644 index 0000000000..71bc14a5eb --- /dev/null +++ b/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/FunctionPipelineUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.pipeline; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.function.Function; +import org.junit.jupiter.api.Test; + +class FunctionPipelineUnitTest { + + @Test + void whenCombiningThreeFunctions_andInitializingPipeline_thenResultIsCorrect() { + Function square = s -> s * s; + Function half = s -> s / 2; + Function toString = Object::toString; + Function pipeline = square.andThen(half) + .andThen(toString); + String result = pipeline.apply(5); + String expected = "12"; + assertEquals(expected, result); + } +} \ No newline at end of file diff --git a/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/PipeUnitTest.java b/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/PipeUnitTest.java index 0e17d87fe2..6a3a988f89 100644 --- a/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/PipeUnitTest.java +++ b/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/PipeUnitTest.java @@ -8,7 +8,7 @@ import org.junit.jupiter.api.Test; class PipeUnitTest { @Test - void simplePipeTest() { + void whenCombiningThreePipes_andInitializingPipeline_thenResultIsCorrect() { Pipe square = s -> s * s; Pipe half = s -> s / 2; Pipe toString = Object::toString; diff --git a/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/PipelineUnitTest.java b/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/PipelineUnitTest.java index e6ce47f0e8..2cbafc6213 100644 --- a/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/PipelineUnitTest.java +++ b/patterns-modules/design-patterns-structural/src/test/java/com/baeldung/pipeline/PipelineUnitTest.java @@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test; class PipelineUnitTest { @Test - void simplePipelineTest() { + void whenCombiningThreePipes_andInitializingPipeline_thenResultIsCorrect() { Pipe square = s -> s * s; Pipe half = s -> s / 2; Pipe toString = Object::toString; From 184cdff59d0c5d8805ca3d3f432b381f3b27ac86 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 2 Mar 2023 22:53:50 +0530 Subject: [PATCH 572/592] Update README.md (#13556) --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 7ed1e6990a..b354a8f819 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,10 @@ Building a single module ==================== To build a specific module, run the command: `mvn clean install` in the module directory. +It can happen that your module is part of a parent module e.g. `parent-boot-1`,`parent-spring-5` etc, then you will need to build the parent module first so that you can build your module. +We have created a `parents` profile that you can use to build just the parent modules, just run the profile as: +`mvn clean install -Pparents` + Building modules from the root of the repository ==================== From 6624802960b3680b4b15e7c726a4233c15957fbb Mon Sep 17 00:00:00 2001 From: IfThen2 <57305322+IfThen2@users.noreply.github.com> Date: Thu, 2 Mar 2023 13:15:38 -0700 Subject: [PATCH 573/592] enum samples for bael6145 implementing toString() for enums (#13407) * enum samples for bael6145 implementing toString() for enums * updates from code review: FastFood1: return empty string instead of null when no matching enum found FastFood3: make enum name variable final * make member variable private final in FastFoot3 enum remove trailing comma in FastFoot2 enum --- .../com/baeldung/enumtostring/FastFood1.java | 25 ++++++++++++++++ .../com/baeldung/enumtostring/FastFood2.java | 28 ++++++++++++++++++ .../com/baeldung/enumtostring/FastFood3.java | 29 +++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enumtostring/FastFood1.java create mode 100644 core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enumtostring/FastFood2.java create mode 100644 core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enumtostring/FastFood3.java diff --git a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enumtostring/FastFood1.java b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enumtostring/FastFood1.java new file mode 100644 index 0000000000..26338fe46c --- /dev/null +++ b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enumtostring/FastFood1.java @@ -0,0 +1,25 @@ +package com.baeldung.enumtostring; + +public enum FastFood1 { + PIZZA, + BURGER, + TACO, + CHICKEN, + ; + + @Override + public String toString() { + switch (this) { + case PIZZA: + return "Pizza Pie"; + case BURGER: + return "Cheese Burger"; + case TACO: + return "Crunchy Taco"; + case CHICKEN: + return "Fried Chicken"; + default: + return ""; + } + } +} diff --git a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enumtostring/FastFood2.java b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enumtostring/FastFood2.java new file mode 100644 index 0000000000..8ca7166dec --- /dev/null +++ b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enumtostring/FastFood2.java @@ -0,0 +1,28 @@ +package com.baeldung.enumtostring; + +public enum FastFood2 { + PIZZA { + @Override + public String toString() { + return "Pizza Pie"; + } + }, + BURGER { + @Override + public String toString() { + return "Cheese Burger"; + } + }, + TACO { + @Override + public String toString() { + return "Crunchy Taco"; + } + }, + CHICKEN { + @Override + public String toString() { + return "Fried Chicken"; + } + } +} diff --git a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enumtostring/FastFood3.java b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enumtostring/FastFood3.java new file mode 100644 index 0000000000..f6db8f4095 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enumtostring/FastFood3.java @@ -0,0 +1,29 @@ +package com.baeldung.enumtostring; + +public enum FastFood3 { + PIZZA("Pizza Pie"), + BURGER("Cheese Burger"), + TACO("Crunchy Taco"), + CHICKEN("Fried Chicken"), + ; + + private final String prettyName; + + FastFood3(String prettyName) { + this.prettyName = prettyName; + } + + FastFood3 fromString(String prettyName) { + for (FastFood3 f : values()) { + if (f.prettyName.equals(prettyName)) { + return f; + } + } + return null; + } + + @Override + public String toString() { + return prettyName; + } +} From 20c137bdb1a8483a12a5ff859891d7537170c0e2 Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Date: Fri, 3 Mar 2023 15:54:15 +0200 Subject: [PATCH 574/592] JAVA-18145 Upgrade Jsf module to JDK 11 (#13491) * JAVA-18145 Upgrade Jsf module to JDK 11 * JAVA-18145 Deleted jsf module from pre-jdk9 profiles --- jsf/pom.xml | 11 +++++++++++ pom.xml | 6 ++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/jsf/pom.xml b/jsf/pom.xml index 88099ef9c4..4e17540557 100644 --- a/jsf/pom.xml +++ b/jsf/pom.xml @@ -15,6 +15,13 @@ + + + javax.annotation + javax.annotation-api + ${javax.annotation-api.version} + + com.sun.faces @@ -70,6 +77,10 @@ 2.2.14 3.0.0 + + 3.3.1 + + 1.3.1 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 345cd7979a..bc5e3b8e85 100644 --- a/pom.xml +++ b/pom.xml @@ -362,8 +362,6 @@ jmh - jsf - kubernetes-modules @@ -601,8 +599,6 @@ jhipster-5 jmh - jsf - kubernetes-modules @@ -978,6 +974,7 @@ java-native jsoup ksqldb + jsf libraries-2 libraries-7 libraries-apache-commons @@ -1220,6 +1217,7 @@ java-native jsoup + jsf ksqldb libraries-7 From 29656071c26dbd215ec3c844d94cec4bd7051adc Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 4 Mar 2023 10:41:08 +0800 Subject: [PATCH 575/592] Create README.md [skip ci] --- core-java-modules/core-java-collections-maps-6/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 core-java-modules/core-java-collections-maps-6/README.md diff --git a/core-java-modules/core-java-collections-maps-6/README.md b/core-java-modules/core-java-collections-maps-6/README.md new file mode 100644 index 0000000000..fc12a1bb25 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-6/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Copying All Keys and Values From One Hashmap Onto Another Without Replacing Existing Keys and Values](https://www.baeldung.com/java-copy-hashmap-no-changes) From f6855312039b5ce187721f4033e041b53147b043 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 4 Mar 2023 10:49:47 +0800 Subject: [PATCH 576/592] Update README.md [skip ci] --- core-java-modules/core-java-networking-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-networking-4/README.md b/core-java-modules/core-java-networking-4/README.md index daec647ebe..e614801468 100644 --- a/core-java-modules/core-java-networking-4/README.md +++ b/core-java-modules/core-java-networking-4/README.md @@ -2,3 +2,4 @@ - [Difference Between URI.create() and new URI()](https://www.baeldung.com/java-uri-create-and-new-uri) - [Validating URL in Java](https://www.baeldung.com/java-validate-url) - [Validating IPv4 Address in Java](https://www.baeldung.com/java-validate-ipv4-address) +- [Download a Webpage in Java](https://www.baeldung.com/java-download-webpage) From 762ce81aafe4f82aeb1c3c863bd2e556ad11a23d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 4 Mar 2023 10:56:06 +0800 Subject: [PATCH 577/592] Create README.md [skip ci] --- spring-boot-modules/spring-boot-3-test-pitfalls/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 spring-boot-modules/spring-boot-3-test-pitfalls/README.md diff --git a/spring-boot-modules/spring-boot-3-test-pitfalls/README.md b/spring-boot-modules/spring-boot-3-test-pitfalls/README.md new file mode 100644 index 0000000000..1290cbfcc7 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-test-pitfalls/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Pitfalls on Testing with Spring Boot](https://www.baeldung.com/spring-boot-testing-pitfalls) From 1bd1cf0a1272a955e749b28d3f59223493c74714 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 4 Mar 2023 10:57:59 +0800 Subject: [PATCH 578/592] Create README.md [skip ci] --- dependency-exclusion/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 dependency-exclusion/README.md diff --git a/dependency-exclusion/README.md b/dependency-exclusion/README.md new file mode 100644 index 0000000000..e9eee1be4d --- /dev/null +++ b/dependency-exclusion/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Exclude a Dependency in a Maven Plugin](https://www.baeldung.com/mvn-plugin-dependency-exclusion) From 56a30aea2a4a92abaa6b263fd52aeccf01bf4e4e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 4 Mar 2023 11:13:57 +0800 Subject: [PATCH 579/592] 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 0d79f006e1..5fa884a053 100644 --- a/spring-boot-modules/spring-boot-3/README.md +++ b/spring-boot-modules/spring-boot-3/README.md @@ -3,3 +3,4 @@ - [Spring Boot 3 and Spring Framework 6.0 – What’s New](https://www.baeldung.com/spring-boot-3-spring-6-new) - [Singleton Design Pattern vs Singleton Beans in Spring Boot](https://www.baeldung.com/spring-boot-singleton-vs-beans) +- [Migrate Application From Spring Boot 2 to Spring Boot 3](https://www.baeldung.com/spring-boot-3-migration) From bec630aec9227ccbdf0ce3e1732a1dba0d8423c5 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 4 Mar 2023 11:16:45 +0800 Subject: [PATCH 580/592] Create README.md [skip ci] --- spring-security-modules/spring-security-azuread/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 spring-security-modules/spring-security-azuread/README.md diff --git a/spring-security-modules/spring-security-azuread/README.md b/spring-security-modules/spring-security-azuread/README.md new file mode 100644 index 0000000000..8b4d6d9666 --- /dev/null +++ b/spring-security-modules/spring-security-azuread/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Authenticating Users with AzureAD in Spring Boot](https://www.baeldung.com/spring-boot-azuerad-authenticate-users) From 33ee2024dbe3af4f20762c8a8e5a00074c19b359 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 4 Mar 2023 11:21:38 +0800 Subject: [PATCH 581/592] Update README.md [skip ci] --- feign/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/feign/README.md b/feign/README.md index 8079c46e9e..3e733448fb 100644 --- a/feign/README.md +++ b/feign/README.md @@ -11,4 +11,5 @@ This module contains articles about Feign - [Feign Logging Configuration](https://www.baeldung.com/java-feign-logging) - [Retrieve Original Message From Feign ErrorDecoder](https://www.baeldung.com/feign-retrieve-original-message) - [RequestLine with Feign Client](https://www.baeldung.com/feign-requestline) -- [Propagating Exceptions With OpenFeign and Spring](https://www.baeldung.com/spring-openfeign-propagate-exception) \ No newline at end of file +- [Propagating Exceptions With OpenFeign and Spring](https://www.baeldung.com/spring-openfeign-propagate-exception) +- [Post form-url-encoded Data with Spring Cloud Feign](https://www.baeldung.com/spring-cloud-post-form-url-encoded-data) From 6159c229acd89340278c67d515fa5295f4e3de80 Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Sat, 4 Mar 2023 20:12:23 +0100 Subject: [PATCH 582/592] BAEL-6192: Get the Desktop Path in Java (#13581) --- .../baeldung/path/DesktopPathUnitTest.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 core-java-modules/core-java-nio-2/src/test/java/com/baeldung/path/DesktopPathUnitTest.java diff --git a/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/path/DesktopPathUnitTest.java b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/path/DesktopPathUnitTest.java new file mode 100644 index 0000000000..fe21d0a72f --- /dev/null +++ b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/path/DesktopPathUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.path; + +import org.junit.jupiter.api.Test; + +import java.io.File; + +import static org.junit.Assert.assertEquals; + +import javax.swing.filechooser.FileSystemView; + +public class DesktopPathUnitTest { + // Adapt DESKTOP_PATH variable to your own system path + // private static final String DESKTOP_PATH = "C:\\Users\\HRAF\\Desktop"; + + @Test + public void whenUsingGetUserHomeProperty_thenShouldEqualDesktopPath() { + String desktopPath = System.getProperty("user.home") + File.separator + "Desktop"; + // assertEquals(DESKTOP_PATH, desktopPath); + } + + @Test + public void whenUsingFileSystemViewGetHomeDirectory_thenShouldEqualDesktopPath() { + FileSystemView view = FileSystemView.getFileSystemView(); + File file = view.getHomeDirectory(); + String path = file.getPath(); + // assertEquals(DESKTOP_PATH, path); + } + +} From d62fd23eb91269b9807b2f66fb3795fbedb93dd7 Mon Sep 17 00:00:00 2001 From: Narendra Kangralkar Date: Sun, 5 Mar 2023 02:40:35 +0530 Subject: [PATCH 583/592] CS-1565: Check if the target sum exists (#13371) --- .../checktargetsum/CheckTargetSum.java | 58 +++++++++++++++++++ .../CheckTargetSumUnitTest.java | 46 +++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checktargetsum/CheckTargetSum.java create mode 100644 algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checktargetsum/CheckTargetSumUnitTest.java diff --git a/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checktargetsum/CheckTargetSum.java b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checktargetsum/CheckTargetSum.java new file mode 100644 index 0000000000..fdbde62301 --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/checktargetsum/CheckTargetSum.java @@ -0,0 +1,58 @@ +package com.baeldung.algorithms.checktargetsum; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public class CheckTargetSum { + public boolean isTargetSumExistNaive(int[] nums, int target) { + for (int i = 0; i < nums.length; i++) { + for (int j = i + 1; j < nums.length; j++) { + if (nums[i] + nums[j] == target) { + return true; + } + } + } + + return false; + } + + public boolean isTargetSumExistSorted(int[] nums, int target) { + Arrays.sort(nums); + + int start = 0; + int end = nums.length - 1; + + while (start < end) { + int sum = nums[start] + nums[end]; + + if (sum == target) { + return true; + } + + if (sum < target) { + start++; + } else { + end--; + } + } + + return false; + } + + public boolean isTargetSumExistHashSet(int[] nums, int target) { + Set hashSet = new HashSet<>(); + + for (int num : nums) { + int diff = target - num; + + if (hashSet.contains(diff)) { + return true; + } + + hashSet.add(num); + } + + return false; + } +} diff --git a/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checktargetsum/CheckTargetSumUnitTest.java b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checktargetsum/CheckTargetSumUnitTest.java new file mode 100644 index 0000000000..ff20ce112e --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/checktargetsum/CheckTargetSumUnitTest.java @@ -0,0 +1,46 @@ +package com.baeldung.algorithms.checktargetsum; + +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class CheckTargetSumUnitTest { + private CheckTargetSum checkTargetSum = new CheckTargetSum(); + + private int[] nums = new int[] { 10, 5, 15, 7, 14, 1, 9 }; + + private int existingTarget = 6; + + private int nonExistingTarget = 27; + + @Test + public void givenArrayOfIntegers_whenTargetSumNaive_thenPairExists() { + assertTrue(checkTargetSum.isTargetSumExistNaive(nums, existingTarget)); + } + + @Test + public void givenArrayOfIntegers_whenTargetSumNaive_thenPairDoesNotExists() { + assertFalse(checkTargetSum.isTargetSumExistNaive(nums, nonExistingTarget)); + } + + @Test + public void givenArrayOfIntegers_whenTargetSumSorted_thenPairExists() { + assertTrue(checkTargetSum.isTargetSumExistNaive(nums, existingTarget)); + } + + @Test + public void givenArrayOfIntegers_whenTargetSumSorted_thenPairDoesNotExists() { + assertFalse(checkTargetSum.isTargetSumExistNaive(nums, nonExistingTarget)); + } + + @Test + public void givenArrayOfIntegers_whenTargetSumHashSet_thenPairExists() { + assertTrue(checkTargetSum.isTargetSumExistNaive(nums, existingTarget)); + } + + @Test + public void givenArrayOfIntegers_whenTargetSumHashSet_thenPairDoesNotExists() { + assertFalse(checkTargetSum.isTargetSumExistNaive(nums, nonExistingTarget)); + } +} From 68c8aa2bb1dbdb3cef03ae938e3e80e50c4629f1 Mon Sep 17 00:00:00 2001 From: Avin Buricha Date: Sun, 5 Mar 2023 02:53:20 +0530 Subject: [PATCH 584/592] Article code (#13567) --- .../mongo/insert/InsertFieldIntoFilter.java | 74 +++++++++++++++++++ .../insert/InsertFieldIntoFilterLiveTest.java | 73 ++++++++++++++++++ .../src/test/resources/pet.json | 3 + 3 files changed, 150 insertions(+) create mode 100644 persistence-modules/java-mongodb-3/src/main/java/com/baeldung/mongo/insert/InsertFieldIntoFilter.java create mode 100644 persistence-modules/java-mongodb-3/src/test/java/com/baeldung/mongo/insert/InsertFieldIntoFilterLiveTest.java create mode 100644 persistence-modules/java-mongodb-3/src/test/resources/pet.json diff --git a/persistence-modules/java-mongodb-3/src/main/java/com/baeldung/mongo/insert/InsertFieldIntoFilter.java b/persistence-modules/java-mongodb-3/src/main/java/com/baeldung/mongo/insert/InsertFieldIntoFilter.java new file mode 100644 index 0000000000..aabc6aef18 --- /dev/null +++ b/persistence-modules/java-mongodb-3/src/main/java/com/baeldung/mongo/insert/InsertFieldIntoFilter.java @@ -0,0 +1,74 @@ +package com.baeldung.mongo.insert; + +import com.mongodb.MongoClient; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; +import org.bson.BsonDocument; +import org.bson.Document; +import org.bson.conversions.Bson; + +import static com.mongodb.client.model.Filters.*; + +public class InsertFieldIntoFilter { + + private static MongoClient mongoClient; + private static MongoDatabase database; + private static MongoCollection collection; + private static String collectionName; + private static String databaseName; + + public static void setUp() { + if (mongoClient == null) { + mongoClient = new MongoClient("localhost", 27017); + + databaseName = "baeldung"; + collectionName = "pet"; + + database = mongoClient.getDatabase(databaseName); + collection = database.getCollection(collectionName); + } + } + + public static void addFieldToExistingBsonFilter() { + + Bson existingFilter = and(eq("type", "Dog"), eq("gender", "Male")); + + Bson newFilter = and(existingFilter, gt("age", 5)); + FindIterable documents = collection.find(newFilter); + + MongoCursor cursor = documents.iterator(); + while (cursor.hasNext()) { + System.out.println(cursor.next()); + } + } + + + public static void addFieldToExistingBsonFilterUsingBsonDocument() { + + Bson existingFilter = eq("type", "Dog"); + BsonDocument existingBsonDocument = existingFilter.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry()); + + Bson newFilter = gt("age", 5); + BsonDocument newBsonDocument = newFilter.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry()); + + existingBsonDocument.append("age", newBsonDocument.get("age")); + + FindIterable documents = collection.find(existingBsonDocument); + + MongoCursor cursor = documents.iterator(); + while (cursor.hasNext()) { + System.out.println(cursor.next()); + } + } + + public static void main(String args[]) { + + setUp(); + + addFieldToExistingBsonFilter(); + + addFieldToExistingBsonFilterUsingBsonDocument(); + } +} diff --git a/persistence-modules/java-mongodb-3/src/test/java/com/baeldung/mongo/insert/InsertFieldIntoFilterLiveTest.java b/persistence-modules/java-mongodb-3/src/test/java/com/baeldung/mongo/insert/InsertFieldIntoFilterLiveTest.java new file mode 100644 index 0000000000..be4ed260d9 --- /dev/null +++ b/persistence-modules/java-mongodb-3/src/test/java/com/baeldung/mongo/insert/InsertFieldIntoFilterLiveTest.java @@ -0,0 +1,73 @@ +package com.baeldung.mongo.insert; + +import com.baeldung.mongo.find.FindOperationLiveTest; +import com.mongodb.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; +import org.bson.BsonDocument; +import org.bson.Document; +import org.bson.conversions.Bson; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +import static com.mongodb.client.model.Filters.*; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class InsertFieldIntoFilterLiveTest { + + private static MongoClient mongoClient; + private static MongoDatabase database; + private static MongoCollection collection; + private static final String DATASET_JSON = "/pet.json"; + + @BeforeClass + public static void setUp() throws IOException { + if (mongoClient == null) { + mongoClient = new MongoClient("localhost", 27017); + + database = mongoClient.getDatabase("baeldung"); + collection = database.getCollection("pet"); + + collection.drop(); + + InputStream is = FindOperationLiveTest.class.getResourceAsStream(DATASET_JSON); + BufferedReader reader = new BufferedReader(new InputStreamReader(is)); + reader.lines() + .forEach(line -> collection.insertOne(Document.parse(line))); + reader.close(); + } + } + + @Test + public void givenPetCollection_whenFetchingAfterAddingFieldToFilter_thenFindMatchingDocuments() { + Bson existingFilter = and(eq("type", "Dog"), eq("gender", "Male")); + + Bson newFilter = and(existingFilter, gt("age", 5)); + MongoCursor cursor = collection.find(newFilter).iterator(); + + assertNotNull(cursor); + assertTrue(cursor.hasNext()); + } + + @Test + public void givenPetCollection_whenFetchingAfterAddingFieldToFilterUsingBsonDocument_thenFindMatchingDocuments() { + Bson existingFilter = eq("type", "Dog"); + BsonDocument existingBsonDocument = existingFilter.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry()); + + Bson newFilter = gt("age", 5); + BsonDocument newBsonDocument = newFilter.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry()); + + existingBsonDocument.append("age", newBsonDocument.get("age")); + MongoCursor cursor = collection.find(existingBsonDocument).iterator(); + + assertNotNull(cursor); + assertTrue(cursor.hasNext()); + } +} diff --git a/persistence-modules/java-mongodb-3/src/test/resources/pet.json b/persistence-modules/java-mongodb-3/src/test/resources/pet.json new file mode 100644 index 0000000000..b31cf16718 --- /dev/null +++ b/persistence-modules/java-mongodb-3/src/test/resources/pet.json @@ -0,0 +1,3 @@ +{"petId":"P1","name":"Tom","age":3,"type":"Cat","gender":"Female"} +{"petId":"P2","name":"Max","age":4,"type":"Dog","gender":"Male"} +{"petId":"P3","name":"Milo","age":8,"type":"Dog","gender":"Male"} \ No newline at end of file From 101f848d996361689c9895deebd1401540cc39d4 Mon Sep 17 00:00:00 2001 From: Hamid Reza Sharifi Date: Sun, 5 Mar 2023 16:11:44 +0330 Subject: [PATCH 585/592] #BAEL-3027:fix bug (#13553) Co-authored-by: h_sharifi --- .../cloud/bootstrap/gateway/GatewayApplication.java | 9 ++------- .../cloud/bootstrap/svcbook/BookServiceApplication.java | 6 +++--- .../bootstrap/svcrating/RatingServiceApplication.java | 5 ++--- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java index 79785a3f20..8fc75e1ff6 100644 --- a/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java +++ b/spring-cloud-modules/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java @@ -1,7 +1,5 @@ package com.baeldung.spring.cloud.bootstrap.gateway; -import com.baeldung.spring.cloud.bootstrap.gateway.client.book.BooksClient; -import com.baeldung.spring.cloud.bootstrap.gateway.client.rating.RatingsClient; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.EurekaClient; import org.springframework.beans.factory.annotation.Autowired; @@ -19,8 +17,6 @@ import org.springframework.cloud.sleuth.zipkin.HttpZipkinSpanReporter; import org.springframework.cloud.sleuth.zipkin.ZipkinProperties; import org.springframework.cloud.sleuth.zipkin.ZipkinSpanReporter; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.FilterType; import org.springframework.web.client.RestTemplate; import zipkin.Span; @@ -69,11 +65,10 @@ public class GatewayApplication { @Override public void report(Span span) { InstanceInfo instance = eurekaClient.getNextServerFromEureka("zipkin", false); - if (!(baseUrl != null && instance.getHomePageUrl().equals(baseUrl))) { + if (baseUrl == null || !instance.getHomePageUrl().equals(baseUrl)) { baseUrl = instance.getHomePageUrl(); - delegate = new HttpZipkinSpanReporter(new RestTemplate(), baseUrl, zipkinProperties.getFlushInterval(), spanMetricReporter); - if (!span.name.matches(skipPattern)) delegate.report(span); } + delegate = new HttpZipkinSpanReporter(new RestTemplate(), baseUrl, zipkinProperties.getFlushInterval(), spanMetricReporter); if (!span.name.matches(skipPattern)) delegate.report(span); } }; 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/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java index 91fd23e32d..d787b5e407 100644 --- 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/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java @@ -42,11 +42,11 @@ public class BookServiceApplication { @Override public void report(Span span) { InstanceInfo instance = eurekaClient.getNextServerFromEureka("zipkin", false); - if (!(baseUrl != null && instance.getHomePageUrl().equals(baseUrl))) { + if (baseUrl == null || !instance.getHomePageUrl().equals(baseUrl)) { baseUrl = instance.getHomePageUrl(); - delegate = new HttpZipkinSpanReporter(new RestTemplate(), baseUrl, zipkinProperties.getFlushInterval(), spanMetricReporter); - if (!span.name.matches(skipPattern)) delegate.report(span); } + delegate = new HttpZipkinSpanReporter(new RestTemplate(), baseUrl, zipkinProperties.getFlushInterval(), spanMetricReporter); + if (!span.name.matches(skipPattern)) delegate.report(span); } }; } 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/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java index 8dacbaa79d..5a94f19472 100644 --- 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/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java @@ -51,11 +51,10 @@ public class RatingServiceApplication { @Override public void report(Span span) { InstanceInfo instance = eurekaClient.getNextServerFromEureka("zipkin", false); - if (!(baseUrl != null && instance.getHomePageUrl().equals(baseUrl))) { + if (baseUrl == null || !instance.getHomePageUrl().equals(baseUrl)) { baseUrl = instance.getHomePageUrl(); - delegate = new HttpZipkinSpanReporter(new RestTemplate(), baseUrl, zipkinProperties.getFlushInterval(), spanMetricReporter); - if (!span.name.matches(skipPattern)) delegate.report(span); } + delegate = new HttpZipkinSpanReporter(new RestTemplate(), baseUrl, zipkinProperties.getFlushInterval(), spanMetricReporter); if (!span.name.matches(skipPattern)) delegate.report(span); } }; From 1be13b84b8a59cb3cfd8cc4bb2c393b8d6306d38 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sun, 5 Mar 2023 15:22:58 +0200 Subject: [PATCH 586/592] [JAVA-18153] Moved libraries-security module to jdk9-and-above profile (#13569) --- libraries-security/pom.xml | 18 ++++++++++++++++++ pom.xml | 7 ++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/libraries-security/pom.xml b/libraries-security/pom.xml index 6d3bbcd26c..62c476a82c 100644 --- a/libraries-security/pom.xml +++ b/libraries-security/pom.xml @@ -96,8 +96,26 @@ + + org.glassfish.jaxb + jaxb-runtime + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + --add-opens java.base/java.lang=ALL-UNNAMED + + + + + + 5.6.0 1.3.1 diff --git a/pom.xml b/pom.xml index bc5e3b8e85..dcfa26abd5 100644 --- a/pom.xml +++ b/pom.xml @@ -369,7 +369,6 @@ libraries-3 libraries-data-db - libraries-security logging-modules lombok-modules @@ -605,10 +604,7 @@ language-interop libraries-3 - - libraries-data-db - libraries-security logging-modules lombok-modules @@ -822,6 +818,7 @@ + libraries-security performance-tests security-modules libraries-server-2 @@ -1066,7 +1063,7 @@ - + libraries-security performance-tests security-modules libraries-server-2 From 54183b517ec50fae7d722e1c8cf4a725dea48788 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sun, 5 Mar 2023 15:24:32 +0200 Subject: [PATCH 587/592] [JAVA-18127] Upgraded dependencies versions + opened packages (#13561) * [JAVA-18127] Upgraded dependencies versions + opened packages * [JAVA-18127] Clean up * [JAVA-18127] Clean up --- di-modules/cdi/pom.xml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/di-modules/cdi/pom.xml b/di-modules/cdi/pom.xml index bdba3429db..fd920c8ce1 100644 --- a/di-modules/cdi/pom.xml +++ b/di-modules/cdi/pom.xml @@ -42,10 +42,24 @@ + + + + org.apache.maven.plugins + maven-surefire-plugin + + + --add-opens java.base/java.lang=ALL-UNNAMED + + + + + + 2.0.SP1 - 3.0.5.Final - 1.9.2 + 3.1.6.Final + 1.9.19 \ No newline at end of file From d1f9e99783c1d73abe4585e6f3f944552fc94710 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sun, 5 Mar 2023 15:42:30 +0200 Subject: [PATCH 588/592] [JAVA-18809] Added argline arguments (#13575) --- libraries-data-2/pom.xml | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/libraries-data-2/pom.xml b/libraries-data-2/pom.xml index d5322267d0..f673ebd470 100644 --- a/libraries-data-2/pom.xml +++ b/libraries-data-2/pom.xml @@ -15,12 +15,12 @@ org.apache.flink - flink-connector-kafka-0.11_2.11 + flink-connector-kafka ${flink.version} org.apache.flink - flink-streaming-java_2.11 + flink-streaming-java ${flink.version} @@ -47,7 +47,7 @@ org.apache.flink - flink-test-utils_2.11 + flink-test-utils ${flink.version} test @@ -136,6 +136,21 @@ + + + + org.apache.maven.plugins + maven-surefire-plugin + + + --add-opens java.base/java.lang=ALL-UNNAMED + --add-opens java.base/java.util=ALL-UNNAMED + + + + + + nm-repo @@ -146,12 +161,12 @@ - 1.5.0 + 1.16.1 1.6.0 0.1.0 1.0.3 - 9.1.5.Final - 4.3.8.RELEASE + 14.0.6.Final + 5.3.25 4.0.0 1.1.0 3.0.0 From 3b3ab38baa7f3c6874447ee8f2ef813c33a32dba Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sun, 5 Mar 2023 15:44:42 +0200 Subject: [PATCH 589/592] [JAVA-18811] Upgraded spring version (#13578) --- akka-modules/spring-akka/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/akka-modules/spring-akka/pom.xml b/akka-modules/spring-akka/pom.xml index 7451a40b86..2201181435 100644 --- a/akka-modules/spring-akka/pom.xml +++ b/akka-modules/spring-akka/pom.xml @@ -43,7 +43,7 @@ - 4.3.4.RELEASE + 5.3.25 2.4.14 From 84567cf366b609b8fe8e2aab262d17aa44235c78 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sun, 5 Mar 2023 15:49:41 +0200 Subject: [PATCH 590/592] =?UTF-8?q?[JAVA-18151]=20Upgraded=20xstream=20ver?= =?UTF-8?q?sion=20+=20Opened=20packages=20+=20Upgraded=20ig=E2=80=A6=20(#1?= =?UTF-8?q?3570)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [JAVA-18151] Upgraded xstream version + Opened packages + Upgraded ignite version * [JAVA-18151] Added jvm arguments for use of proprietary sdk apis --- libraries-data/pom.xml | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index a3e3f4f539..6ba48a9d66 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/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 libraries-data libraries-data @@ -34,7 +34,7 @@ org.apache.ignite ignite-spring-data - ${ignite.version} + ${ignite-spring-data.version} com.google.code.gson @@ -138,18 +138,40 @@ com.googlecode.jmapper-framework jmapper-core ${jmapper.version} + + + com.thoughtworks.xstream + xstream + + + + com.thoughtworks.xstream + xstream + 1.4.16 + + org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} + maven-surefire-plugin - ${maven.compiler.source} - ${maven.compiler.target} + + --add-opens java.base/java.lang=ALL-UNNAMED + --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED + --add-opens java.base/jdk.internal.misc=ALL-UNNAMED + --add-opens java.base/sun.nio.ch=ALL-UNNAMED + --add-opens java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED + --add-opens jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED + --add-opens java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED + --add-opens java.base/java.io=ALL-UNNAMED + --add-opens java.base/java.nio=ALL-UNNAMED + --add-opens java.base/java.util=ALL-UNNAMED + --add-opens java.base/java.lang=ALL-UNNAMED + @@ -186,7 +208,8 @@ 3.1 1.2.2 3.3.1 - 2.4.0 + 2.14.0 + 2.9.1 2.9.1 1.1.1 1.5.0 From 5c7bfabbf077ee68a85ed40dba9d0a4b53227790 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sun, 5 Mar 2023 15:50:40 +0200 Subject: [PATCH 591/592] [JAVA-18810] Added missing libraries(jaxb) (#13576) --- libraries-data-io/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries-data-io/pom.xml b/libraries-data-io/pom.xml index 640bf1ba07..2e126610d4 100644 --- a/libraries-data-io/pom.xml +++ b/libraries-data-io/pom.xml @@ -46,9 +46,9 @@ ${google-sheets.version} - javax.xml.bind - jaxb-api - ${jaxb-api.version} + org.glassfish.jaxb + jaxb-runtime + ${jaxb-runtime.version} org.docx4j @@ -104,8 +104,8 @@ 4.1 1.23.0 v4-rev493-1.21.0 - 3.3.5 - 2.1 + 6.1.2 + 2.3.1 2.8.7 1.15 0.14.2 From 37ad9d43017755cae1d0b6ae13def0f7a2ef9b06 Mon Sep 17 00:00:00 2001 From: Kapil Khandelwal Date: Mon, 6 Mar 2023 08:49:44 +0530 Subject: [PATCH 592/592] BAEL-3622:- Running stages in parallel with Jenkins workflow / pipeline (#13580) --- .../parallel-stage-job/pipeline-parallel-job | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 jenkins-modules/jenkins-jobs/parallel-stage-job/pipeline-parallel-job diff --git a/jenkins-modules/jenkins-jobs/parallel-stage-job/pipeline-parallel-job b/jenkins-modules/jenkins-jobs/parallel-stage-job/pipeline-parallel-job new file mode 100644 index 0000000000..c44d61d099 --- /dev/null +++ b/jenkins-modules/jenkins-jobs/parallel-stage-job/pipeline-parallel-job @@ -0,0 +1,34 @@ +pipeline { + agent any + stages { + stage('Build') { + steps { + sh 'echo "Building the application"' + // Add commands to build application + } + } + stage('Test') { + parallel { + stage('Unit Tests') { + steps { + sh 'sleep 5s' + sh 'echo "Running unit tests"' + // Add commands to run unit tests + } + } + stage('Integration Tests') { + steps { + sh 'echo "Running integration tests"' + // Add commands to run integration tests + } + } + } + } + stage('Deploy') { + steps { + sh 'echo "Deploying the application"' + // Add commands to deploy application + } + } + } +}

    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%0DQRgI}$KNeb1i+C7T6 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 literal 0 HcmV?d00001 From 1f360ea65de945bc21377f680e07e887f19f646f Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 10 Jan 2023 01:27:11 +0530 Subject: [PATCH 230/592] JAVA-16567 Potential issue in An Overview of Identifiers in Hibernate/JPA article (#13248) --- .../baeldung/hibernate/pojo/OrderEntryIdClass.java | 11 +++++++++++ .../com/baeldung/hibernate/pojo/OrderEntryPK.java | 12 ++++++++++++ .../hibernate/IdentifiersIntegrationTest.java | 6 ++++++ 3 files changed, 29 insertions(+) diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryIdClass.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryIdClass.java index 18926640af..707713fe57 100644 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryIdClass.java +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryIdClass.java @@ -3,6 +3,7 @@ package com.baeldung.hibernate.pojo; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.IdClass; +import javax.persistence.ManyToOne; @Entity @IdClass(OrderEntryPK.class) @@ -11,6 +12,8 @@ public class OrderEntryIdClass { private long orderId; @Id private long productId; + @ManyToOne + private User user; public long getOrderId() { return orderId; @@ -28,4 +31,12 @@ public class OrderEntryIdClass { this.productId = productId; } + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + } diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryPK.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryPK.java index 637d590629..41ceb6ab25 100644 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryPK.java +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryPK.java @@ -4,6 +4,7 @@ import java.io.Serializable; import java.util.Objects; import javax.persistence.Embeddable; +import javax.persistence.ManyToOne; @Embeddable public class OrderEntryPK implements Serializable { @@ -11,6 +12,9 @@ public class OrderEntryPK implements Serializable { private long orderId; private long productId; + @ManyToOne + private User user; + public long getOrderId() { return orderId; } @@ -27,6 +31,14 @@ public class OrderEntryPK implements Serializable { this.productId = productId; } + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/IdentifiersIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/IdentifiersIntegrationTest.java index 6b54dc80a8..29d1273b37 100644 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/IdentifiersIntegrationTest.java +++ b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/IdentifiersIntegrationTest.java @@ -63,9 +63,12 @@ public class IdentifiersIntegrationTest { @Test public void whenSaveCompositeIdEntity_thenOk() { + User user = new User(); + OrderEntryPK entryPK = new OrderEntryPK(); entryPK.setOrderId(1L); entryPK.setProductId(30L); + entryPK.setUser(user); OrderEntry entry = new OrderEntry(); entry.setEntryId(entryPK); @@ -77,9 +80,12 @@ public class IdentifiersIntegrationTest { @Test public void whenSaveIdClassEntity_thenOk() { + User user = new User(); + OrderEntryIdClass entry = new OrderEntryIdClass(); entry.setOrderId(1L); entry.setProductId(30L); + entry.setUser(user); session.save(entry); assertThat(entry.getOrderId()).isEqualTo(1L); From 42fb696539b8918844c3588115ed4430a3640a29 Mon Sep 17 00:00:00 2001 From: freelansam <79205526+freelansam@users.noreply.github.com> Date: Tue, 10 Jan 2023 01:29:14 +0530 Subject: [PATCH 231/592] JAVA-16561: Fix references to parents (#13222) --- kubernetes-modules/kubernetes-spring/pom.xml | 8 ++++---- .../{DemoApplicationTests.java => SpringContextTest.java} | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) rename kubernetes-modules/kubernetes-spring/src/test/java/com/example/demo/{DemoApplicationTests.java => SpringContextTest.java} (85%) diff --git a/kubernetes-modules/kubernetes-spring/pom.xml b/kubernetes-modules/kubernetes-spring/pom.xml index 466808a6ce..01064fa384 100644 --- a/kubernetes-modules/kubernetes-spring/pom.xml +++ b/kubernetes-modules/kubernetes-spring/pom.xml @@ -10,10 +10,10 @@ Demo project for Spring Boot - org.springframework.boot - spring-boot-starter-parent - 2.7.5 - + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 diff --git a/kubernetes-modules/kubernetes-spring/src/test/java/com/example/demo/DemoApplicationTests.java b/kubernetes-modules/kubernetes-spring/src/test/java/com/example/demo/SpringContextTest.java similarity index 85% rename from kubernetes-modules/kubernetes-spring/src/test/java/com/example/demo/DemoApplicationTests.java rename to kubernetes-modules/kubernetes-spring/src/test/java/com/example/demo/SpringContextTest.java index 2778a6a7ea..86bb6c3038 100644 --- a/kubernetes-modules/kubernetes-spring/src/test/java/com/example/demo/DemoApplicationTests.java +++ b/kubernetes-modules/kubernetes-spring/src/test/java/com/example/demo/SpringContextTest.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest -class DemoApplicationTests { +class SpringContextTest { @Test void contextLoads() { From d2f52b059ff0c56381340da1bb8c4fad16213d1e Mon Sep 17 00:00:00 2001 From: Iniubong LA Date: Mon, 9 Jan 2023 21:05:23 +0000 Subject: [PATCH 232/592] arthurshur@gmail.com (#13265) * Creating a deep vs shallow copy of an object in Java * Creating a deep vs shallow copy of an object in Java * Baeldung article converting number bases * Baeldung article converting number bases --- core-java-modules/core-java-lang-5/README.md | 1 + .../ConvertNumberBases.java | 69 +++++++++++++++++++ .../deepshallowcopy/SchoolDeepCopy.java | 20 ++++++ .../deepshallowcopy/SchoolShallowCopy.java | 16 +++++ .../deepshallowcopy/StudentDeepCopy.java | 55 +++++++++++++++ .../deepshallowcopy/StudentShallowCopy.java | 53 ++++++++++++++ .../ConvertNumberBasesUnitTest.java | 20 ++++++ .../StudentDeepCopyUnitTest.java | 28 ++++++++ .../StudentShallowCopyUnitTest.java | 26 +++++++ 9 files changed, 288 insertions(+) create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/convertnumberbases/ConvertNumberBases.java create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/SchoolDeepCopy.java create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/SchoolShallowCopy.java create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/StudentDeepCopy.java create mode 100644 core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/StudentShallowCopy.java create mode 100644 core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertnumberbases/ConvertNumberBasesUnitTest.java create mode 100644 core-java-modules/core-java-lang-5/src/test/java/com/baeldung/deepshallowcopy/StudentDeepCopyUnitTest.java create mode 100644 core-java-modules/core-java-lang-5/src/test/java/com/baeldung/deepshallowcopy/StudentShallowCopyUnitTest.java diff --git a/core-java-modules/core-java-lang-5/README.md b/core-java-modules/core-java-lang-5/README.md index 6d610f40b9..5ae3955bc8 100644 --- a/core-java-modules/core-java-lang-5/README.md +++ b/core-java-modules/core-java-lang-5/README.md @@ -12,3 +12,4 @@ This module contains articles about core features in the Java language - [Infinity in Java](https://www.baeldung.com/java-infinity) - [Type Parameter vs Wildcard in Java Generics](https://www.baeldung.com/java-generics-type-parameter-vs-wildcard) - [Convert Between int and char in Java](https://www.baeldung.com/java-convert-int-char) +- diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/convertnumberbases/ConvertNumberBases.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/convertnumberbases/ConvertNumberBases.java new file mode 100644 index 0000000000..405504a965 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/convertnumberbases/ConvertNumberBases.java @@ -0,0 +1,69 @@ +package com.baeldung.convertnumberbases; + +public class ConvertNumberBases { + + public static String convertNumberToNewBase(String number, int base, int newBase){ + return Integer.toString(Integer.parseInt(number, base), newBase); + } + public static String convertNumberToNewBaseCustom(String num, int base, int newBase) { + int decimalNumber = convertFromAnyBaseToDecimal(num, base); + return convertFromDecimalToBaseX(decimalNumber, newBase); + } + + public static String convertFromDecimalToBaseX(int num, int newBase) { + + String result = ""; + int remainder; + while (num > 0) { + remainder = num % newBase; + if (newBase == 16) { + if (remainder == 10) + result += 'A'; + else if (remainder == 11) + result += 'B'; + else if (remainder == 12) + result += 'C'; + else if (remainder == 13) + result += 'D'; + else if (remainder == 14) + result += 'E'; + else if (remainder == 15) + result += 'F'; + else + result += remainder; + } else + result += remainder; + + num /= newBase; + } + return new StringBuffer(result).reverse().toString(); + } + + public static int convertFromAnyBaseToDecimal(String num, int base) { + + if (base < 2 || (base > 10 && base != 16)) + return -1; + + int val = 0; + int power = 1; + + for (int i = num.length() - 1; i >= 0; i--) { + int digit = charToDecimal(num.charAt(i)); + + if (digit < 0 || digit >= base) + return -1; + + val += digit * power; + power = power * base; + } + + return val; + } + + public static int charToDecimal(char c) { + if (c >= '0' && c <= '9') + return (int) c - '0'; + else + return (int) c - 'A' + 10; + } +} diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/SchoolDeepCopy.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/SchoolDeepCopy.java new file mode 100644 index 0000000000..eda88488f9 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/SchoolDeepCopy.java @@ -0,0 +1,20 @@ +package com.baeldung.deepshallowcopy; + +public class SchoolDeepCopy implements Cloneable{ + public String name; + public SchoolDeepCopy(String name){ + this.name = name; + } + + protected Object clone() throws CloneNotSupportedException{ + return super.clone(); + } + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/SchoolShallowCopy.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/SchoolShallowCopy.java new file mode 100644 index 0000000000..75258c1505 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/SchoolShallowCopy.java @@ -0,0 +1,16 @@ +package com.baeldung.deepshallowcopy; + +public class SchoolShallowCopy { + public String name; + public SchoolShallowCopy(String name){ + this.name = name; + } + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/StudentDeepCopy.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/StudentDeepCopy.java new file mode 100644 index 0000000000..293363b557 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/StudentDeepCopy.java @@ -0,0 +1,55 @@ +package com.baeldung.deepshallowcopy; + +public class StudentDeepCopy implements Cloneable{ + public String firstName; + public String lastName; + public String level; + public SchoolDeepCopy school; + + + public StudentDeepCopy(String firstName, String lastName, String level, SchoolDeepCopy school){ + this.firstName = firstName; + this.lastName = lastName; + this.level = level; + this.school = school; + } + + 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 getLevel() { + return level; + } + + public void setLevel(String level) { + this.level = level; + } + + public SchoolDeepCopy getSchool() { + return school; + } + + public void setSchool(SchoolDeepCopy school) { + this.school = school; + } + @Override + protected Object clone() throws CloneNotSupportedException { + StudentDeepCopy student = (StudentDeepCopy) super.clone(); + student.school = (SchoolDeepCopy) school.clone(); + return student; + } + +} diff --git a/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/StudentShallowCopy.java b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/StudentShallowCopy.java new file mode 100644 index 0000000000..cdb2c4be86 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/main/java/com/baeldung/deepshallowcopy/StudentShallowCopy.java @@ -0,0 +1,53 @@ +package com.baeldung.deepshallowcopy; + +public class StudentShallowCopy implements Cloneable{ + public String firstName; + public String lastName; + public String level; + public SchoolShallowCopy school; + + + public StudentShallowCopy(String firstName, String lastName, String level, SchoolShallowCopy school){ + this.firstName = firstName; + this.lastName = lastName; + this.level = level; + this.school = school; + } + + 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 getLevel() { + return level; + } + + public void setLevel(String level) { + this.level = level; + } + + public SchoolShallowCopy getSchool() { + return school; + } + + public void setSchool(SchoolShallowCopy school) { + this.school = school; + } + @Override + protected Object clone() throws CloneNotSupportedException { + return super.clone(); + } + +} diff --git a/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertnumberbases/ConvertNumberBasesUnitTest.java b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertnumberbases/ConvertNumberBasesUnitTest.java new file mode 100644 index 0000000000..109e1da1b2 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/convertnumberbases/ConvertNumberBasesUnitTest.java @@ -0,0 +1,20 @@ +package com.baeldung.convertnumberbases; + +import static com.baeldung.convertnumberbases.ConvertNumberBases.convertNumberToNewBase; +import static com.baeldung.convertnumberbases.ConvertNumberBases.convertNumberToNewBaseCustom; +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class ConvertNumberBasesUnitTest { + + @Test + void whenConvertingBase10NumberToBase5_ThenResultShouldBeDigitsInBase5() { + assertEquals(convertNumberToNewBase("89", 10, 5), "324"); + } + @Test + void whenConvertingBase2NumberToBase8_ThenResultShouldBeDigitsInBase8() { + assertEquals(convertNumberToNewBaseCustom("11001000", 2, 8), "310"); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/deepshallowcopy/StudentDeepCopyUnitTest.java b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/deepshallowcopy/StudentDeepCopyUnitTest.java new file mode 100644 index 0000000000..ce40898821 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/deepshallowcopy/StudentDeepCopyUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.deepshallowcopy; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class StudentDeepCopyUnitTest { + + + @Test + void whenDeepCopying_thenCopyObjectMakesCopyOfReferencedObjectInSourceObject(){ + SchoolDeepCopy ug = new SchoolDeepCopy("University of Ghana"); + StudentDeepCopy studentOne = new StudentDeepCopy("Abena", "Kojo","200L", ug ); + StudentDeepCopy studentTwo = null; + + try{ + studentTwo = (StudentDeepCopy) studentOne.clone(); + } catch (CloneNotSupportedException e){ + e.printStackTrace(); + } + + assertNotSame(studentOne.getSchool(),studentTwo.getSchool()); + studentTwo.getSchool().setName("University of Nigeria"); + assertNotEquals(studentOne.getSchool().getName(), studentTwo.getSchool().getName()); + + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/deepshallowcopy/StudentShallowCopyUnitTest.java b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/deepshallowcopy/StudentShallowCopyUnitTest.java new file mode 100644 index 0000000000..6c8c9d4992 --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/deepshallowcopy/StudentShallowCopyUnitTest.java @@ -0,0 +1,26 @@ +package com.baeldung.deepshallowcopy; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class StudentShallowCopyUnitTest { + + @Test + void whenShallowCopying_thenCopyObjectAndSourceObjectShareSameReferencedObject(){ + SchoolShallowCopy ug = new SchoolShallowCopy("University of Ghana"); + StudentShallowCopy studentOne = new StudentShallowCopy("Abena", "Kojo","200L", ug ); + StudentShallowCopy studentTwo = null; + + try{ + studentTwo = (StudentShallowCopy) studentOne.clone(); + } catch (CloneNotSupportedException e){ + e.printStackTrace(); + } + + assertSame(studentOne.getSchool(),studentTwo.getSchool()); + studentTwo.getSchool().setName("University of Nigeria"); + assertEquals(studentOne.getSchool().getName(), studentTwo.getSchool().getName()); + } + +} \ No newline at end of file From c3a0a729db3ae7d4a3b3bdbf35b0e9871a9295e8 Mon Sep 17 00:00:00 2001 From: cesarevalenti90 <50798547+cesarevalenti90@users.noreply.github.com> Date: Mon, 9 Jan 2023 22:16:44 +0100 Subject: [PATCH 233/592] fix retry test (#13267) Co-authored-by: Cesare --- .../baeldung/spring/kafka/KafkaRetryableIntegrationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-kafka/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java b/spring-kafka/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java index 029031923e..5417fee1ac 100644 --- a/spring-kafka/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java +++ b/spring-kafka/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java @@ -57,7 +57,7 @@ public class KafkaRetryableIntegrationTest { Greeting greeting = new Greeting("test1", "test2"); container.start(); template.send(TOPIC, objectMapper.writeValueAsString(greeting)); - assertThat(latch.await(10, TimeUnit.SECONDS)).isTrue(); + assertThat(latch.await(10, TimeUnit.SECONDS)).isFalse(); } @Test @@ -78,7 +78,7 @@ public class KafkaRetryableIntegrationTest { //this message will go on error Greeting greeting2 = new Greeting("test2", "test2"); template.send(TOPIC, objectMapper.writeValueAsString(greeting2)); - assertThat(latch.await(10, TimeUnit.SECONDS)).isTrue(); + assertThat(latch.getCount()).isEqualTo(1); } } From 03778c8f218b36a6002c081ccded8c124d794b90 Mon Sep 17 00:00:00 2001 From: lucaCambi77 Date: Tue, 10 Jan 2023 02:55:06 +0100 Subject: [PATCH 234/592] fix: wrong model package name [ BAEL-5987 ] (#13268) * feat: add jpa - spring data difference examples * fix: remove _ from package name * fix: model package name --- .../springdata/config/SpringDataJpaConfig.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/config/SpringDataJpaConfig.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/config/SpringDataJpaConfig.java index 57f9d2981f..923e923c88 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/config/SpringDataJpaConfig.java +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/config/SpringDataJpaConfig.java @@ -16,6 +16,7 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; +import com.baeldung.spring.data.persistence.springdatajpadifference.model.Employee; import com.baeldung.spring.data.persistence.springdatajpadifference.springdata.repository.EmployeeRepository; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -28,7 +29,8 @@ public class SpringDataJpaConfig { public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource); - em.setPackagesToScan("com.baeldung.spring.data.persistence.springdata_jpa_difference.model"); + em.setPackagesToScan(Employee.class.getPackage() + .getName()); JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); From 5825cf477522d897012d16047ab7f05f3f9fcb3a Mon Sep 17 00:00:00 2001 From: Martin Winandy Date: Wed, 11 Jan 2023 02:53:43 +0100 Subject: [PATCH 235/592] BAEL-6033: Add tinylog 2 examples (#13232) * BAEL-6033: Add tinylog 2 examples * BAEL-6033: Rename test methods of tinylog 2 in when-then style --- logging-modules/pom.xml | 1 + logging-modules/tinylog2/pom.xml | 33 +++++++++ .../com/baeldung/tinylog/TinylogExamples.java | 43 +++++++++++ .../src/main/resources/tinylog.properties | 13 ++++ .../tinylog/TinylogIntegrationTest.java | 72 +++++++++++++++++++ .../src/test/resources/tinylog.properties | 4 ++ 6 files changed, 166 insertions(+) create mode 100644 logging-modules/tinylog2/pom.xml create mode 100644 logging-modules/tinylog2/src/main/java/com/baeldung/tinylog/TinylogExamples.java create mode 100644 logging-modules/tinylog2/src/main/resources/tinylog.properties create mode 100644 logging-modules/tinylog2/src/test/java/com/baeldung/tinylog/TinylogIntegrationTest.java create mode 100644 logging-modules/tinylog2/src/test/resources/tinylog.properties diff --git a/logging-modules/pom.xml b/logging-modules/pom.xml index c7a770891d..5a1bd32288 100644 --- a/logging-modules/pom.xml +++ b/logging-modules/pom.xml @@ -19,6 +19,7 @@ log4j2 logback log-mdc + tinylog2 \ No newline at end of file diff --git a/logging-modules/tinylog2/pom.xml b/logging-modules/tinylog2/pom.xml new file mode 100644 index 0000000000..df9dcca7ab --- /dev/null +++ b/logging-modules/tinylog2/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + tinylog2 + 0.1-SNAPSHOT + tinylog2 + + + com.baeldung + logging-modules + 1.0.0-SNAPSHOT + + + + + org.tinylog + tinylog-api + ${tinylog.version} + + + org.tinylog + tinylog-impl + ${tinylog.version} + + + + + 2.5.0 + + + \ No newline at end of file diff --git a/logging-modules/tinylog2/src/main/java/com/baeldung/tinylog/TinylogExamples.java b/logging-modules/tinylog2/src/main/java/com/baeldung/tinylog/TinylogExamples.java new file mode 100644 index 0000000000..3e0e8d79d4 --- /dev/null +++ b/logging-modules/tinylog2/src/main/java/com/baeldung/tinylog/TinylogExamples.java @@ -0,0 +1,43 @@ +package com.baeldung.tinylog; + +import org.tinylog.Logger; + +public class TinylogExamples { + + public static void main(String[] args) { + /* Static text */ + + Logger.info("Hello World!"); + + /* Placeholders */ + + Logger.info("Hello {}!", "Alice"); + Logger.info("π = {0.00}", Math.PI); + + /* Lazy Logging */ + + Logger.debug("Expensive computation: {}", () -> compute()); // Visible in log files but not on the console + + /* Exceptions */ + + int a = 42; + int b = 0; + + try { + int i = a / b; + } catch (Exception ex) { + Logger.error(ex, "Cannot divide {} by {}", a, b); + } + + try { + int i = a / b; + } catch (Exception ex) { + Logger.error(ex); + } + } + + private static int compute() { + return 42; // In real applications, we would perform an expensive computation here + } + +} diff --git a/logging-modules/tinylog2/src/main/resources/tinylog.properties b/logging-modules/tinylog2/src/main/resources/tinylog.properties new file mode 100644 index 0000000000..303aac129a --- /dev/null +++ b/logging-modules/tinylog2/src/main/resources/tinylog.properties @@ -0,0 +1,13 @@ +writer1 = console +writer1.level = info +writer1.format = {date: HH:mm:ss.SSS} [{level}] {class}: {message} + +writer2 = rolling file +writer2.file = logs/myapp_{date: yyyy-MM-dd}_{count}.log +writer2.buffered = true +writer2.policies = startup, daily: 06:00 +writer2.format = {class} [{thread}] {level}: {message} +writer2.convert = gzip +writer2.backups = 100 + +writingthread = true diff --git a/logging-modules/tinylog2/src/test/java/com/baeldung/tinylog/TinylogIntegrationTest.java b/logging-modules/tinylog2/src/test/java/com/baeldung/tinylog/TinylogIntegrationTest.java new file mode 100644 index 0000000000..74637366e8 --- /dev/null +++ b/logging-modules/tinylog2/src/test/java/com/baeldung/tinylog/TinylogIntegrationTest.java @@ -0,0 +1,72 @@ +package com.baeldung.tinylog; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.tinylog.Logger; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TinylogIntegrationTest { + + private ByteArrayOutputStream consoleOutput = new ByteArrayOutputStream(); + + @BeforeEach + public void init() throws UnsupportedEncodingException { + System.setOut(new PrintStream(consoleOutput, false, "UTF-8")); + } + + @Test + public void whenLoggingStaticText_thenOutputIt() throws UnsupportedEncodingException { + Logger.info("Hello World!"); + + String outputLog = consoleOutput.toString("UTF-8"); + assertThat(outputLog).isEqualToIgnoringNewLines("Hello World!"); + } + + @Test + public void whenLoggingParamizedText_thenOutputItResolved() throws UnsupportedEncodingException { + Logger.info("Hello {}!", "Alice"); + + String outputLog = consoleOutput.toString("UTF-8"); + assertThat(outputLog).isEqualToIgnoringNewLines("Hello Alice!"); + } + + @Test + public void whenLoggingNumberWithFormatPattern_thenOutputItFormatted() throws UnsupportedEncodingException { + Logger.info("π = {0.00}", Math.PI); + + String outputLog = consoleOutput.toString("UTF-8"); + assertThat(outputLog).isEqualToIgnoringNewLines("π = 3.14"); + } + + @Test + public void whenLoggingExceptionWithMessage_thenOutputMessageAndException() throws UnsupportedEncodingException { + int a = 42; + int b = 0; + try { + int i = a / b; + } catch (Exception ex) { + Logger.error(ex, "Cannot divide {} by {}", a, b); + } + + String outputLog = consoleOutput.toString("UTF-8"); + assertThat(outputLog).startsWith("Cannot divide 42 by 0: java.lang.ArithmeticException"); + } + + @Test + public void whenLoggingExceptionWithoutMessage_thenOutputExceptionOnly() throws UnsupportedEncodingException { + try { + int i = 42 / 0; + } catch (Exception ex) { + Logger.error(ex); + } + + String outputLog = consoleOutput.toString("UTF-8"); + assertThat(outputLog).startsWith("java.lang.ArithmeticException"); + } + +} diff --git a/logging-modules/tinylog2/src/test/resources/tinylog.properties b/logging-modules/tinylog2/src/test/resources/tinylog.properties new file mode 100644 index 0000000000..4534555b06 --- /dev/null +++ b/logging-modules/tinylog2/src/test/resources/tinylog.properties @@ -0,0 +1,4 @@ +writer = console +writer.level = info +writer.stream = out +writer.format = {message} From 640d403db487cbc982872f2053cdd064ee10a175 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 11 Jan 2023 14:42:35 +0800 Subject: [PATCH 236/592] Update README.md [skip ci] --- libraries-files/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries-files/README.md b/libraries-files/README.md index 4157769a0d..feb09332df 100644 --- a/libraries-files/README.md +++ b/libraries-files/README.md @@ -2,3 +2,4 @@ ### Relevant Articles: - [How to Parse an INI File in Java](https://www.baeldung.com/java-parse-ini-file) +- [Using Watermarks with iText in Java](https://www.baeldung.com/java-watermarks-with-itext) From 27066cafa9ac7baf1a827cfcd4cff0cd994ae32e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 11 Jan 2023 14:46:12 +0800 Subject: [PATCH 237/592] Create README.md [skip ci] --- spring-boot-modules/spring-boot-3-observation/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 spring-boot-modules/spring-boot-3-observation/README.md diff --git a/spring-boot-modules/spring-boot-3-observation/README.md b/spring-boot-modules/spring-boot-3-observation/README.md new file mode 100644 index 0000000000..edfb23ce2b --- /dev/null +++ b/spring-boot-modules/spring-boot-3-observation/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Observability with Spring Boot 3](https://www.baeldung.com/spring-boot-3-observability) From 14594c2b94101b9875c08f7f61163d08bb0371b8 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 11 Jan 2023 14:48:42 +0800 Subject: [PATCH 238/592] Update README.md [skip ci] --- core-java-modules/core-java-security-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-security-3/README.md b/core-java-modules/core-java-security-3/README.md index 9d82e829e2..a5cfa5bdca 100644 --- a/core-java-modules/core-java-security-3/README.md +++ b/core-java-modules/core-java-security-3/README.md @@ -11,4 +11,5 @@ This module contains articles about core Java Security - [Generating a Secure AES Key in Java](https://www.baeldung.com/java-secure-aes-key) - [Computing an X509 Certificate’s Thumbprint in Java](https://www.baeldung.com/java-x509-certificate-thumbprint) - [Error: “trustAnchors parameter must be non-empty”](https://www.baeldung.com/java-trustanchors-parameter-must-be-non-empty) +- [Common Exceptions of Crypto APIs in Java](https://www.baeldung.com/java-crypto-apis-exceptions) - More articles: [[<-- prev]](/core-java-modules/core-java-security-2) From abb7b82e3e05a72d6da30e197f22676ec11a2147 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 11 Jan 2023 14:53:40 +0800 Subject: [PATCH 239/592] Update README.md [skip ci] --- persistence-modules/spring-data-jpa-query-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-data-jpa-query-3/README.md b/persistence-modules/spring-data-jpa-query-3/README.md index 268bce96ca..f49bb19217 100644 --- a/persistence-modules/spring-data-jpa-query-3/README.md +++ b/persistence-modules/spring-data-jpa-query-3/README.md @@ -6,6 +6,7 @@ This module contains articles about querying data using Spring Data JPA. - [Query Entities by Dates and Times with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-query-by-date) - [JPA and Hibernate – Criteria vs. JPQL vs. HQL Query](https://www.baeldung.com/jpql-hql-criteria-query) - [Joining Tables With Spring Data JPA Specifications](https://www.baeldung.com/spring-jpa-joining-tables) +- [NonUniqueResultException in Spring Data JPA](https://www.baeldung.com/spring-jpa-non-unique-result-exception) - More articles: [[<-- prev]](../spring-data-jpa-query-2) ### Eclipse Config From bc9b4ab88b1ee547fd3cc3d474ae0d845ae0ebca Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 11 Jan 2023 15:05:55 +0800 Subject: [PATCH 240/592] 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 b28b97cb09..4365fd12f9 100644 --- a/core-java-modules/core-java-arrays-convert/README.md +++ b/core-java-modules/core-java-arrays-convert/README.md @@ -6,3 +6,4 @@ This module contains articles about arrays conversion in Java - [Convert a Float to a Byte Array in Java](https://www.baeldung.com/java-convert-float-to-byte-array) - [Converting Between Stream and Array in Java](https://www.baeldung.com/java-stream-to-array) - [Convert a Byte Array to a Numeric Representation in Java](https://www.baeldung.com/java-byte-array-to-number) +- [Converting a String Array Into an int Array in Java](https://www.baeldung.com/java-convert-string-array-to-int-array) From ba0ec42d501c40be7450d8aa71384a560ceecf6d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 11 Jan 2023 15:10:47 +0800 Subject: [PATCH 241/592] Update README.md [skip ci] --- jenkins-modules/jenkins-jobs/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jenkins-modules/jenkins-jobs/README.md b/jenkins-modules/jenkins-jobs/README.md index 510aa60963..aa2edc0fe0 100644 --- a/jenkins-modules/jenkins-jobs/README.md +++ b/jenkins-modules/jenkins-jobs/README.md @@ -1,2 +1,3 @@ ## Relevant Articles - [Trigger Another Job from a Jenkins Pipeline](https://www.baeldung.com/ops/jenkins-pipeline-trigger-new-job) +- [Fixing the “No Such DSL method” Error in Jenkins Pipeline](https://www.baeldung.com/ops/jenkins-pipeline-no-such-dsl-method-error) From ff6ba7749293be83450af7cf4ffcf1e8cf690b51 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 11 Jan 2023 15:17:42 +0800 Subject: [PATCH 242/592] Update README.md [skip ci] --- gradle-modules/gradle-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle-modules/gradle-7/README.md b/gradle-modules/gradle-7/README.md index 19dfc7b15c..ef1e536229 100644 --- a/gradle-modules/gradle-7/README.md +++ b/gradle-modules/gradle-7/README.md @@ -2,3 +2,4 @@ ### Relevant Articles: - [How to Configure Conditional Dependencies in Gradle](https://www.baeldung.com/gradle-conditional-dependencies) +- [Working With Multiple Repositories in Gradle](https://www.baeldung.com/java-gradle-multiple-repositories) From b7cd83a56a0c3562237c3a228e0ab619d8a52f00 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 11 Jan 2023 15:19:44 +0800 Subject: [PATCH 243/592] Update README.md [skip ci] --- core-java-modules/core-java-io-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-io-4/README.md b/core-java-modules/core-java-io-4/README.md index 263077946d..738cbb5895 100644 --- a/core-java-modules/core-java-io-4/README.md +++ b/core-java-modules/core-java-io-4/README.md @@ -13,5 +13,6 @@ This module contains articles about core Java input and output (IO) - [Generate the MD5 Checksum for a File in Java](https://www.baeldung.com/java-md5-checksum-file) - [Getting the Filename From a String Containing an Absolute File Path](https://www.baeldung.com/java-filename-full-path) - [Mocking Java InputStream Object](https://www.baeldung.com/java-mocking-inputstream) +- [PrintStream vs PrintWriter in Java](https://www.baeldung.com/java-printstream-vs-printwriter) - [[<-- Prev]](/core-java-modules/core-java-io-3) From f64bcee853b7103859bef08f6b6cb63facb6ea47 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 11 Jan 2023 15:22:43 +0800 Subject: [PATCH 244/592] Update README.md [skip ci] --- persistence-modules/spring-data-jpa-repo-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-data-jpa-repo-2/README.md b/persistence-modules/spring-data-jpa-repo-2/README.md index 6403510e6f..f51e7135ae 100644 --- a/persistence-modules/spring-data-jpa-repo-2/README.md +++ b/persistence-modules/spring-data-jpa-repo-2/README.md @@ -6,4 +6,5 @@ - [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) - More articles: [[<-- prev]](../spring-data-jpa-repo) From 7670976877066a9df36a24f7b5749852ce3561d4 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 11 Jan 2023 15:27:56 +0800 Subject: [PATCH 245/592] Update README.md [skip ci] --- core-java-modules/core-java-reflection/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-reflection/README.md b/core-java-modules/core-java-reflection/README.md index 7c3ef69012..f68362611e 100644 --- a/core-java-modules/core-java-reflection/README.md +++ b/core-java-modules/core-java-reflection/README.md @@ -7,3 +7,4 @@ - [Dynamic Proxies in Java](http://www.baeldung.com/java-dynamic-proxies) - [What Causes java.lang.reflect.InvocationTargetException?](https://www.baeldung.com/java-lang-reflect-invocationtargetexception) - [How to Get a Name of a Method Being Executed?](http://www.baeldung.com/java-name-of-executing-method) +- [Getting Class Type From a String in Java](https://www.baeldung.com/java-get-class-object-from-string) From 5f3cd880345e4546ce2acbd3aecc20be5beceb27 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 11 Jan 2023 15:31:35 +0800 Subject: [PATCH 246/592] Update README.md [skip ci] --- spring-web-modules/spring-resttemplate-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-web-modules/spring-resttemplate-3/README.md b/spring-web-modules/spring-resttemplate-3/README.md index 68f6b8c5e4..52eba522a5 100644 --- a/spring-web-modules/spring-resttemplate-3/README.md +++ b/spring-web-modules/spring-resttemplate-3/README.md @@ -10,3 +10,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [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 b227ad01e300c9095f68df9e35a84cf005230a21 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 11 Jan 2023 15:35:30 +0800 Subject: [PATCH 247/592] Create README.md [skip ci] --- core-java-modules/core-java-19/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 core-java-modules/core-java-19/README.md diff --git a/core-java-modules/core-java-19/README.md b/core-java-modules/core-java-19/README.md new file mode 100644 index 0000000000..9663296da0 --- /dev/null +++ b/core-java-modules/core-java-19/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Record Patterns in Java 19](https://www.baeldung.com/java-19-record-patterns) From 57db2aa4259d1d00f497bdefe73d8210f320a9b5 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 11 Jan 2023 16:03:11 +0800 Subject: [PATCH 248/592] Create README.md [skip ci] --- saas-modules/sentry-servlet/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 saas-modules/sentry-servlet/README.md diff --git a/saas-modules/sentry-servlet/README.md b/saas-modules/sentry-servlet/README.md new file mode 100644 index 0000000000..b2f03453b5 --- /dev/null +++ b/saas-modules/sentry-servlet/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Quick Guide to Sentry](https://www.baeldung.com/ops/java-sentry) From 796970adb9b87f6c2f9c3b6f2f7e53b3d9153239 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Wed, 11 Jan 2023 16:10:10 +0800 Subject: [PATCH 249/592] Update README.md [skip ci] --- jenkins-modules/jenkins-jobs/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jenkins-modules/jenkins-jobs/README.md b/jenkins-modules/jenkins-jobs/README.md index aa2edc0fe0..7b33dc6d99 100644 --- a/jenkins-modules/jenkins-jobs/README.md +++ b/jenkins-modules/jenkins-jobs/README.md @@ -1,3 +1,4 @@ ## Relevant Articles - [Trigger Another Job from a Jenkins Pipeline](https://www.baeldung.com/ops/jenkins-pipeline-trigger-new-job) - [Fixing the “No Such DSL method” Error in Jenkins Pipeline](https://www.baeldung.com/ops/jenkins-pipeline-no-such-dsl-method-error) +- [Jenkins Pipeline – Change to Another Folder](https://www.baeldung.com/ops/jenkins-pipeline-change-to-another-folder) From dcbb336236e119946aaea6e84fe995da1009d9a0 Mon Sep 17 00:00:00 2001 From: Vartika Nigam <63852792+vnigam2702@users.noreply.github.com> Date: Wed, 11 Jan 2023 14:56:58 +0530 Subject: [PATCH 250/592] added an example of anonymous class and lambda expression (#13241) Co-authored-by: Vartika_Nigam --- .../anonymousclass/AnonymousClassExample.java | 13 +++++++++++++ .../lambdaexpression/LambdaExpressionExample.java | 9 +++++++++ 2 files changed, 22 insertions(+) create mode 100644 core-java-modules/core-java/src/main/java/com/baeldung/anonymousclass/AnonymousClassExample.java create mode 100644 core-java-modules/core-java/src/main/java/com/baeldung/lambdaexpression/LambdaExpressionExample.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/anonymousclass/AnonymousClassExample.java b/core-java-modules/core-java/src/main/java/com/baeldung/anonymousclass/AnonymousClassExample.java new file mode 100644 index 0000000000..a58dbf9864 --- /dev/null +++ b/core-java-modules/core-java/src/main/java/com/baeldung/anonymousclass/AnonymousClassExample.java @@ -0,0 +1,13 @@ +package com.baeldung.anonymousclass; + +public class AnonymousClassExample{ + + public static void main(String[] args){ + Thread t1 = new Thread(new Runnable(){ + @Override + public void run() { + System.out.println("Thread: "+Thread.currentThread().getName()+" started"); + } + }); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/lambdaexpression/LambdaExpressionExample.java b/core-java-modules/core-java/src/main/java/com/baeldung/lambdaexpression/LambdaExpressionExample.java new file mode 100644 index 0000000000..95128b934c --- /dev/null +++ b/core-java-modules/core-java/src/main/java/com/baeldung/lambdaexpression/LambdaExpressionExample.java @@ -0,0 +1,9 @@ +package com.baeldung.lambdaexpression; + +public class LambdaExpressionExample{ + + public static void main(String[] args){ + Thread t1 = new Thread(()->System.out.println("Thread: "+Thread.currentThread().getName()+" started")); + t1.start(); + } +} \ No newline at end of file From 4f5ae9020a16040bf701efa294eee7b9d6059bc4 Mon Sep 17 00:00:00 2001 From: Cesare Date: Wed, 11 Jan 2023 10:23:05 +0100 Subject: [PATCH 251/592] BAEL-6057 - Implementing Retry In Kafka Consumer (moved code example to new module) --- spring-kafka-2/README.md | 7 + spring-kafka-2/pom.xml | 70 ++++++++ .../com/baeldung/spring/kafka/Farewell.java | 37 +++++ .../com/baeldung/spring/kafka/Greeting.java | 37 +++++ .../spring/kafka/KafkaConsumerConfig.java | 152 ++++++++++++++++++ .../spring/kafka/KafkaProducerConfig.java | 67 ++++++++ .../spring/kafka/KafkaTopicConfig.java | 77 +++++++++ .../spring/kafka/MultiTypeKafkaListener.java | 32 ++++ .../kafka/RetryableApplicationKafkaApp.java | 0 .../src/main/resources/application.properties | 20 +++ spring-kafka-2/src/main/resources/logback.xml | 13 ++ .../kafka/KafkaRetryableIntegrationTest.java | 0 .../src/test/resources/application.yml | 14 ++ .../src/test/resources/logback-test.xml | 19 +++ .../spring/kafka/KafkaConsumerConfig.java | 35 +--- .../spring/kafka/MultiTypeKafkaListener.java | 6 - .../src/main/resources/application.properties | 3 - 17 files changed, 548 insertions(+), 41 deletions(-) create mode 100644 spring-kafka-2/README.md create mode 100644 spring-kafka-2/pom.xml create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/Farewell.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/Greeting.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaProducerConfig.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaTopicConfig.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java rename {spring-kafka => spring-kafka-2}/src/main/java/com/baeldung/spring/kafka/RetryableApplicationKafkaApp.java (100%) create mode 100644 spring-kafka-2/src/main/resources/application.properties create mode 100644 spring-kafka-2/src/main/resources/logback.xml rename {spring-kafka => spring-kafka-2}/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java (100%) create mode 100644 spring-kafka-2/src/test/resources/application.yml create mode 100644 spring-kafka-2/src/test/resources/logback-test.xml diff --git a/spring-kafka-2/README.md b/spring-kafka-2/README.md new file mode 100644 index 0000000000..9a5ce627dd --- /dev/null +++ b/spring-kafka-2/README.md @@ -0,0 +1,7 @@ +## Spring Kafka 2 + +This module contains articles about Spring with Kafka + +### Relevant articles + +- [Intro to Apache Kafka with Spring](https://www.baeldung.com/spring-kafka) diff --git a/spring-kafka-2/pom.xml b/spring-kafka-2/pom.xml new file mode 100644 index 0000000000..d51c2e300f --- /dev/null +++ b/spring-kafka-2/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + spring-kafka + spring-kafka + Intro to Kafka with Spring + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.kafka + spring-kafka + + + org.apache.kafka + kafka-streams + + + com.fasterxml.jackson.core + jackson-databind + + + org.projectlombok + lombok + + + org.springframework.kafka + spring-kafka-test + test + + + org.testcontainers + kafka + ${testcontainers-kafka.version} + test + + + org.testcontainers + junit-jupiter + ${testcontainers-kafka.version} + test + + + org.awaitility + awaitility + test + + + + + 1.16.2 + + + \ No newline at end of file diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/Farewell.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/Farewell.java new file mode 100644 index 0000000000..bbff315ad2 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/Farewell.java @@ -0,0 +1,37 @@ +package com.baeldung.spring.kafka; + +public class Farewell { + + private String message; + private Integer remainingMinutes; + + public Farewell() { + } + + public Farewell(String message, Integer remainingMinutes) { + this.message = message; + this.remainingMinutes = remainingMinutes; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getRemainingMinutes() { + return remainingMinutes; + } + + public void setRemainingMinutes(Integer remainingMinutes) { + this.remainingMinutes = remainingMinutes; + } + + @Override + public String toString() { + return message + ". In " + remainingMinutes + "!"; + } + +} diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/Greeting.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/Greeting.java new file mode 100644 index 0000000000..b4633e802a --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/Greeting.java @@ -0,0 +1,37 @@ +package com.baeldung.spring.kafka; + +public class Greeting { + + private String msg; + private String name; + + public Greeting() { + + } + + public Greeting(String msg, String name) { + this.msg = msg; + this.name = name; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return msg + ", " + name + "!"; + } +} diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java new file mode 100644 index 0000000000..463d3209ea --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java @@ -0,0 +1,152 @@ +package com.baeldung.spring.kafka; + +import java.net.SocketTimeoutException; +import java.util.HashMap; +import java.util.Map; + +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.context.annotation.Primary; +import org.springframework.kafka.annotation.EnableKafka; +import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; +import org.springframework.kafka.core.ConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaConsumerFactory; +import org.springframework.kafka.listener.ContainerProperties; +import org.springframework.kafka.listener.DefaultErrorHandler; +import org.springframework.kafka.support.converter.RecordMessageConverter; +import org.springframework.kafka.support.converter.StringJsonMessageConverter; +import org.springframework.kafka.support.mapping.DefaultJackson2JavaTypeMapper; +import org.springframework.kafka.support.mapping.Jackson2JavaTypeMapper; +import org.springframework.kafka.support.serializer.JsonDeserializer; +import org.springframework.util.backoff.BackOff; +import org.springframework.util.backoff.FixedBackOff; + +@EnableKafka +@Configuration +public class KafkaConsumerConfig { + + @Value(value = "${spring.kafka.bootstrap-servers}") + private String bootstrapAddress; + + @Value(value = "${kafka.backoff.interval}") + private Long interval; + + @Value(value = "${kafka.backoff.max_failure}") + private Long maxAttempts; + + public ConsumerFactory consumerFactory(String groupId) { + Map props = new HashMap<>(); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); + props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + props.put(ConsumerConfig.MAX_PARTITION_FETCH_BYTES_CONFIG, "20971520"); + props.put(ConsumerConfig.FETCH_MAX_BYTES_CONFIG, "20971520"); + return new DefaultKafkaConsumerFactory<>(props); + } + + public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory(String groupId) { + ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(consumerFactory(groupId)); + return factory; + } + + @Bean + public ConcurrentKafkaListenerContainerFactory fooKafkaListenerContainerFactory() { + return kafkaListenerContainerFactory("foo"); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory barKafkaListenerContainerFactory() { + return kafkaListenerContainerFactory("bar"); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory headersKafkaListenerContainerFactory() { + return kafkaListenerContainerFactory("headers"); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory partitionsKafkaListenerContainerFactory() { + return kafkaListenerContainerFactory("partitions"); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory longMessageKafkaListenerContainerFactory() { + return kafkaListenerContainerFactory("longMessage"); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory filterKafkaListenerContainerFactory() { + ConcurrentKafkaListenerContainerFactory factory = kafkaListenerContainerFactory("filter"); + factory.setRecordFilterStrategy(record -> record.value() + .contains("World")); + return factory; + } + + public ConsumerFactory greetingConsumerFactory() { + Map props = new HashMap<>(); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); + props.put(ConsumerConfig.GROUP_ID_CONFIG, "greeting"); + return new DefaultKafkaConsumerFactory<>(props, new StringDeserializer(), new JsonDeserializer<>(Greeting.class)); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory() { + ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(greetingConsumerFactory()); + return factory; + } + + @Bean + public RecordMessageConverter multiTypeConverter() { + StringJsonMessageConverter converter = new StringJsonMessageConverter(); + DefaultJackson2JavaTypeMapper typeMapper = new DefaultJackson2JavaTypeMapper(); + typeMapper.setTypePrecedence(Jackson2JavaTypeMapper.TypePrecedence.TYPE_ID); + typeMapper.addTrustedPackages("com.baeldung.spring.kafka"); + Map> mappings = new HashMap<>(); + mappings.put("greeting", Greeting.class); + mappings.put("farewell", Farewell.class); + typeMapper.setIdClassMapping(mappings); + converter.setTypeMapper(typeMapper); + return converter; + } + + @Bean + public ConsumerFactory multiTypeConsumerFactory() { + HashMap 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, JsonDeserializer.class); + props.put(ConsumerConfig.GROUP_ID_CONFIG, "group_id_test"); + return new DefaultKafkaConsumerFactory<>(props); + } + + @Bean + @Primary + public ConcurrentKafkaListenerContainerFactory greetingKafkaListenerContainerFactory() { + ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(multiTypeConsumerFactory()); + factory.setMessageConverter(multiTypeConverter()); + factory.setCommonErrorHandler(errorHandler()); + factory.getContainerProperties() + .setAckMode(ContainerProperties.AckMode.RECORD); + return factory; + } + + @Bean + public DefaultErrorHandler errorHandler() { + BackOff fixedBackOff = new FixedBackOff(interval, maxAttempts); + DefaultErrorHandler errorHandler = new DefaultErrorHandler((consumerRecord, e) -> { + System.out.println(String.format("consumed record %s because this exception was thrown",consumerRecord.toString(),e.getClass().getName())); + }, fixedBackOff); + //Commented because of the test + //errorHandler.addRetryableExceptions(SocketTimeoutException.class,RuntimeException.class); + errorHandler.addNotRetryableExceptions(NullPointerException.class); + return errorHandler; + } + +} diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaProducerConfig.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaProducerConfig.java new file mode 100644 index 0000000000..da8b2bd1a6 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaProducerConfig.java @@ -0,0 +1,67 @@ +package com.baeldung.spring.kafka; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.kafka.clients.producer.ProducerConfig; +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 org.springframework.kafka.support.serializer.JsonSerializer; + +@Configuration +public class KafkaProducerConfig { + + @Value(value = "${spring.kafka.bootstrap-servers}") + private String bootstrapAddress; + + @Bean + public ProducerFactory producerFactory() { + 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, StringSerializer.class); + configProps.put(ProducerConfig.MAX_REQUEST_SIZE_CONFIG, "20971520"); + + return new DefaultKafkaProducerFactory<>(configProps); + } + + @Bean + public KafkaTemplate kafkaTemplate() { + return new KafkaTemplate<>(producerFactory()); + } + + @Bean + public ProducerFactory greetingProducerFactory() { + 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, JsonSerializer.class); + return new DefaultKafkaProducerFactory<>(configProps); + } + + @Bean + public KafkaTemplate greetingKafkaTemplate() { + return new KafkaTemplate<>(greetingProducerFactory()); + } + + @Bean + public ProducerFactory multiTypeProducerFactory() { + 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, JsonSerializer.class); + configProps.put(JsonSerializer.TYPE_MAPPINGS, "greeting:com.baeldung.spring.kafka.Greeting, farewell:com.baeldung.spring.kafka.Farewell"); + return new DefaultKafkaProducerFactory<>(configProps); + } + + @Bean + public KafkaTemplate multiTypeKafkaTemplate() { + return new KafkaTemplate<>(multiTypeProducerFactory()); + } + +} diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaTopicConfig.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaTopicConfig.java new file mode 100644 index 0000000000..6a20915699 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/KafkaTopicConfig.java @@ -0,0 +1,77 @@ +package com.baeldung.spring.kafka; + +import java.util.HashMap; +import java.util.Map; + +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.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.core.KafkaAdmin; + +@Configuration +public class KafkaTopicConfig { + + @Value(value = "${spring.kafka.bootstrap-servers}") + private String bootstrapAddress; + + @Value(value = "${message.topic.name}") + private String topicName; + + @Value(value = "${long.message.topic.name}") + private String longMsgTopicName; + + @Value(value = "${partitioned.topic.name}") + private String partitionedTopicName; + + @Value(value = "${filtered.topic.name}") + private String filteredTopicName; + + @Value(value = "${greeting.topic.name}") + private String greetingTopicName; + + @Value(value = "${multi.type.topic.name}") + private String multiTypeTopicName; + + @Bean + public KafkaAdmin kafkaAdmin() { + Map configs = new HashMap<>(); + configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); + return new KafkaAdmin(configs); + } + + @Bean + public NewTopic topic1() { + return new NewTopic(topicName, 1, (short) 1); + } + + @Bean + public NewTopic topic2() { + return new NewTopic(partitionedTopicName, 6, (short) 1); + } + + @Bean + public NewTopic topic3() { + return new NewTopic(filteredTopicName, 1, (short) 1); + } + + @Bean + public NewTopic topic4() { + return new NewTopic(greetingTopicName, 1, (short) 1); + } + + @Bean + public NewTopic topic5() { + NewTopic newTopic = new NewTopic(longMsgTopicName, 1, (short) 1); + Map configs = new HashMap<>(); + configs.put("max.message.bytes", "20971520"); + newTopic.configs(configs); + return newTopic; + } + + @Bean + public NewTopic multiTypeTopic() { + return new NewTopic(multiTypeTopicName, 1, (short) 1); + } +} diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java new file mode 100644 index 0000000000..6c4d78171b --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java @@ -0,0 +1,32 @@ +package com.baeldung.spring.kafka; + +import org.springframework.kafka.annotation.KafkaHandler; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.messaging.MessagingException; +import org.springframework.stereotype.Component; + +@Component +@KafkaListener(id = "multiGroup", topics = "multitype") +public class MultiTypeKafkaListener { + + @KafkaHandler + //@RetryableTopic(backoff = @Backoff(value = 3000L), attempts = "5", autoCreateTopics = "false",include = SocketTimeoutException.class, exclude = NullPointerException.class) + public void handleGreeting(Greeting greeting) { + if (greeting.getName() + .equalsIgnoreCase("test")) { + throw new MessagingException("test not allowed"); + } + System.out.println("Greeting received: " + greeting); + } + + @KafkaHandler + public void handleF(Farewell farewell) { + System.out.println("Farewell received: " + farewell); + } + + @KafkaHandler(isDefault = true) + public void unknown(Object object) { + System.out.println("Unkown type received: " + object); + } + +} diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/RetryableApplicationKafkaApp.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/RetryableApplicationKafkaApp.java similarity index 100% rename from spring-kafka/src/main/java/com/baeldung/spring/kafka/RetryableApplicationKafkaApp.java rename to spring-kafka-2/src/main/java/com/baeldung/spring/kafka/RetryableApplicationKafkaApp.java diff --git a/spring-kafka-2/src/main/resources/application.properties b/spring-kafka-2/src/main/resources/application.properties new file mode 100644 index 0000000000..691b6f55b7 --- /dev/null +++ b/spring-kafka-2/src/main/resources/application.properties @@ -0,0 +1,20 @@ +spring.kafka.bootstrap-servers=localhost:9092 +message.topic.name=baeldung +long.message.topic.name=longMessage +greeting.topic.name=greeting +filtered.topic.name=filtered +partitioned.topic.name=partitioned +multi.type.topic.name=multitype +# monitoring - lag analysis +monitor.kafka.bootstrap.config=localhost:9092 +monitor.kafka.consumer.groupid=baeldungGrp +monitor.topic.name=baeldung +# monitoring - simulation +monitor.producer.simulate=true +monitor.consumer.simulate=true +monitor.kafka.consumer.groupid.simulate=baeldungGrpSimulate +test.topic=testtopic1 +kafka.backoff.interval=9000 +kafka.backoff.max_failure=5 + + diff --git a/spring-kafka-2/src/main/resources/logback.xml b/spring-kafka-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/spring-kafka-2/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/spring-kafka/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java similarity index 100% rename from spring-kafka/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java rename to spring-kafka-2/src/test/java/com/baeldung/spring/kafka/KafkaRetryableIntegrationTest.java diff --git a/spring-kafka-2/src/test/resources/application.yml b/spring-kafka-2/src/test/resources/application.yml new file mode 100644 index 0000000000..8b245f08b1 --- /dev/null +++ b/spring-kafka-2/src/test/resources/application.yml @@ -0,0 +1,14 @@ +spring: + kafka: + consumer: + auto-offset-reset: earliest + group-id: baeldung +test: + topic: embedded-test-topic + +monitor: + kafka: + bootstrap: + config: "PLAINTEXT://localhost:9085" + consumer: + groupid: "baeldungGrp" diff --git a/spring-kafka-2/src/test/resources/logback-test.xml b/spring-kafka-2/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..74f126ebc1 --- /dev/null +++ b/spring-kafka-2/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-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java index 463d3209ea..e8aa63a88d 100644 --- a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java +++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java @@ -1,6 +1,5 @@ package com.baeldung.spring.kafka; -import java.net.SocketTimeoutException; import java.util.HashMap; import java.util.Map; @@ -9,20 +8,15 @@ 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.context.annotation.Primary; import org.springframework.kafka.annotation.EnableKafka; import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; import org.springframework.kafka.core.ConsumerFactory; import org.springframework.kafka.core.DefaultKafkaConsumerFactory; -import org.springframework.kafka.listener.ContainerProperties; -import org.springframework.kafka.listener.DefaultErrorHandler; import org.springframework.kafka.support.converter.RecordMessageConverter; import org.springframework.kafka.support.converter.StringJsonMessageConverter; import org.springframework.kafka.support.mapping.DefaultJackson2JavaTypeMapper; import org.springframework.kafka.support.mapping.Jackson2JavaTypeMapper; import org.springframework.kafka.support.serializer.JsonDeserializer; -import org.springframework.util.backoff.BackOff; -import org.springframework.util.backoff.FixedBackOff; @EnableKafka @Configuration @@ -31,12 +25,6 @@ public class KafkaConsumerConfig { @Value(value = "${spring.kafka.bootstrap-servers}") private String bootstrapAddress; - @Value(value = "${kafka.backoff.interval}") - private Long interval; - - @Value(value = "${kafka.backoff.max_failure}") - private Long maxAttempts; - public ConsumerFactory consumerFactory(String groupId) { Map props = new HashMap<>(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); @@ -83,7 +71,7 @@ public class KafkaConsumerConfig { public ConcurrentKafkaListenerContainerFactory filterKafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory factory = kafkaListenerContainerFactory("filter"); factory.setRecordFilterStrategy(record -> record.value() - .contains("World")); + .contains("World")); return factory; } @@ -95,7 +83,7 @@ public class KafkaConsumerConfig { } @Bean - public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory() { + public ConcurrentKafkaListenerContainerFactory greetingKafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); factory.setConsumerFactory(greetingConsumerFactory()); return factory; @@ -121,32 +109,15 @@ public class KafkaConsumerConfig { props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class); - props.put(ConsumerConfig.GROUP_ID_CONFIG, "group_id_test"); return new DefaultKafkaConsumerFactory<>(props); } @Bean - @Primary - public ConcurrentKafkaListenerContainerFactory greetingKafkaListenerContainerFactory() { + public ConcurrentKafkaListenerContainerFactory multiTypeKafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); factory.setConsumerFactory(multiTypeConsumerFactory()); factory.setMessageConverter(multiTypeConverter()); - factory.setCommonErrorHandler(errorHandler()); - factory.getContainerProperties() - .setAckMode(ContainerProperties.AckMode.RECORD); return factory; } - @Bean - public DefaultErrorHandler errorHandler() { - BackOff fixedBackOff = new FixedBackOff(interval, maxAttempts); - DefaultErrorHandler errorHandler = new DefaultErrorHandler((consumerRecord, e) -> { - System.out.println(String.format("consumed record %s because this exception was thrown",consumerRecord.toString(),e.getClass().getName())); - }, fixedBackOff); - //Commented because of the test - //errorHandler.addRetryableExceptions(SocketTimeoutException.class,RuntimeException.class); - errorHandler.addNotRetryableExceptions(NullPointerException.class); - return errorHandler; - } - } diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java index 4b43c84f15..9afb5ff0b6 100644 --- a/spring-kafka/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java +++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/MultiTypeKafkaListener.java @@ -2,7 +2,6 @@ package com.baeldung.spring.kafka; import org.springframework.kafka.annotation.KafkaHandler; import org.springframework.kafka.annotation.KafkaListener; -import org.springframework.messaging.MessagingException; import org.springframework.stereotype.Component; @Component @@ -10,12 +9,7 @@ import org.springframework.stereotype.Component; public class MultiTypeKafkaListener { @KafkaHandler - //@RetryableTopic(backoff = @Backoff(value = 3000L), attempts = "5", autoCreateTopics = "false",include = SocketTimeoutException.class, exclude = NullPointerException.class) public void handleGreeting(Greeting greeting) { - if (greeting.getName() - .equalsIgnoreCase("test")) { - throw new MessagingException("test not allowed"); - } System.out.println("Greeting received: " + greeting); } diff --git a/spring-kafka/src/main/resources/application.properties b/spring-kafka/src/main/resources/application.properties index 691b6f55b7..c57537e2af 100644 --- a/spring-kafka/src/main/resources/application.properties +++ b/spring-kafka/src/main/resources/application.properties @@ -14,7 +14,4 @@ monitor.producer.simulate=true monitor.consumer.simulate=true monitor.kafka.consumer.groupid.simulate=baeldungGrpSimulate test.topic=testtopic1 -kafka.backoff.interval=9000 -kafka.backoff.max_failure=5 - From 984edec9d72df9ce4c238fb7c42f1b0be0089f7a Mon Sep 17 00:00:00 2001 From: Cesare Date: Wed, 11 Jan 2023 10:28:15 +0100 Subject: [PATCH 252/592] BAEL-6057 - Implementing Retry In Kafka Consumer (fix on README.md) --- spring-kafka-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-kafka-2/README.md b/spring-kafka-2/README.md index 9a5ce627dd..76c090342d 100644 --- a/spring-kafka-2/README.md +++ b/spring-kafka-2/README.md @@ -4,4 +4,4 @@ This module contains articles about Spring with Kafka ### Relevant articles -- [Intro to Apache Kafka with Spring](https://www.baeldung.com/spring-kafka) +- [Implementing Retry In Kafka Consumer] From 7db81e56ea1975eb8264c6a423d518a7b18cdc47 Mon Sep 17 00:00:00 2001 From: Abhinav Pandey Date: Wed, 11 Jan 2023 19:30:25 +0530 Subject: [PATCH 253/592] Bael 5973 - RestExpress example (#13195) * BAEL-5973 - Restful Microservice with Rest Express * BAEL-5973 - Restful Microservice with Rest Express * BAEL-5973 - pom correction * BAEL-5973 - pom correction * BAEL-5973 - moving rest-express to microservices modules * BAEL-5973 - formatting changes * BAEL-5973 - pom corrections --- microservices-modules/pom.xml | 1 + microservices-modules/rest-express/README.md | 5 + microservices-modules/rest-express/pom.xml | 153 ++++++++++++++++++ .../baeldung/restexpress/Configuration.java | 75 +++++++++ .../com/baeldung/restexpress/Constants.java | 23 +++ .../LastModifiedHeaderPostprocessor.java | 33 ++++ .../java/com/baeldung/restexpress/Main.java | 11 ++ .../baeldung/restexpress/Relationships.java | 55 +++++++ .../java/com/baeldung/restexpress/Routes.java | 30 ++++ .../java/com/baeldung/restexpress/Server.java | 129 +++++++++++++++ .../restexpress/objectid/SampleOidEntity.java | 32 ++++ .../objectid/SampleOidEntityController.java | 80 +++++++++ .../objectid/SampleOidEntityRepository.java | 12 ++ .../objectid/SampleOidEntityService.java | 48 ++++++ .../JsonSerializationProcessor.java | 35 ++++ .../serialization/ObjectIdDeserializer.java | 19 +++ .../serialization/ObjectIdSerializer.java | 18 +++ .../serialization/SerializationProvider.java | 29 ++++ .../serialization/UuidDeserializer.java | 19 +++ .../serialization/UuidFormatter.java | 14 ++ .../serialization/UuidSerializer.java | 19 +++ .../XmlSerializationProcessor.java | 18 +++ .../serialization/XstreamOidConverter.java | 28 ++++ .../serialization/XstreamUuidConverter.java | 29 ++++ .../restexpress/uuid/SampleUuidEntity.java | 23 +++ .../uuid/SampleUuidEntityController.java | 79 +++++++++ .../uuid/SampleUuidEntityRepository.java | 12 ++ .../uuid/SampleUuidEntityService.java | 48 ++++++ .../config/dev/environment.properties | 22 +++ 29 files changed, 1099 insertions(+) create mode 100644 microservices-modules/rest-express/README.md create mode 100644 microservices-modules/rest-express/pom.xml create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Configuration.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Constants.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/LastModifiedHeaderPostprocessor.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Main.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Relationships.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Routes.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Server.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/objectid/SampleOidEntity.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/objectid/SampleOidEntityController.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/objectid/SampleOidEntityRepository.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/objectid/SampleOidEntityService.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/JsonSerializationProcessor.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/ObjectIdDeserializer.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/ObjectIdSerializer.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/SerializationProvider.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/UuidDeserializer.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/UuidFormatter.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/UuidSerializer.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/XmlSerializationProcessor.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/XstreamOidConverter.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/serialization/XstreamUuidConverter.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/uuid/SampleUuidEntity.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/uuid/SampleUuidEntityController.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/uuid/SampleUuidEntityRepository.java create mode 100644 microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/uuid/SampleUuidEntityService.java create mode 100644 microservices-modules/rest-express/src/main/resources/config/dev/environment.properties diff --git a/microservices-modules/pom.xml b/microservices-modules/pom.xml index 4c7079f3cd..a9cd8d2cd9 100644 --- a/microservices-modules/pom.xml +++ b/microservices-modules/pom.xml @@ -19,6 +19,7 @@ microprofile msf4j open-liberty + rest-express \ No newline at end of file diff --git a/microservices-modules/rest-express/README.md b/microservices-modules/rest-express/README.md new file mode 100644 index 0000000000..0fdff99fb7 --- /dev/null +++ b/microservices-modules/rest-express/README.md @@ -0,0 +1,5 @@ +## RestExpress + +This module contains articles about RestExpress. + +### Relevant articles \ No newline at end of file diff --git a/microservices-modules/rest-express/pom.xml b/microservices-modules/rest-express/pom.xml new file mode 100644 index 0000000000..f222998340 --- /dev/null +++ b/microservices-modules/rest-express/pom.xml @@ -0,0 +1,153 @@ + + + + microservices-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + rest-express + + A Basic, MongoDB-backed Service Suite + https://github.com/RestExpress/RestExpress-Scaffold + 1.0.0-SNAPSHOT + rest-express + jar + + + 0.3.3 + 3.1.2 + 2.6 + 0.11.3 + 1.0 + 0.4.8 + 4.11 + + + + + com.strategicgains + RestExpress + ${RestExpress.version} + + + com.strategicgains + Syntaxe + ${Syntaxe.version} + + + com.strategicgains.repoexpress + repoexpress-mongodb + ${repoexpress-mongodb.version} + + + com.strategicgains.plugin-express + CacheControlPlugin + ${RestExpress.plugin.version} + + + com.strategicgains + HyperExpressPlugin + ${HyperExpressPlugin.version} + + + com.strategicgains.plugin-express + MetricsPlugin + ${RestExpress.plugin.version} + + + com.strategicgains.plugin-express + SwaggerPlugin + ${RestExpress.plugin.version} + + + com.strategicgains.plugin-express + CORSPlugin + ${RestExpress.plugin.version} + + + io.dropwizard.metrics + metrics-graphite + ${metrics-graphite.version} + + + junit + junit + ${junit4.version} + jar + test + true + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + 1.8 + 1.8 + UTF-8 + + + + org.codehaus.mojo + exec-maven-plugin + 1.2.1 + + com.baeldung.restexpress.Main + + + + org.apache.maven.plugins + maven-shade-plugin + 2.4.1 + + false + + + *:* + + + + + + package + + shade + + + + + com.baeldung.restexpress.Main + + + + + + + + + + + + + org.codehaus.mojo + versions-maven-plugin + 2.0 + + + + diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Configuration.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Configuration.java new file mode 100644 index 0000000000..22161a265b --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Configuration.java @@ -0,0 +1,75 @@ +package com.baeldung.restexpress; + +import com.baeldung.restexpress.objectid.SampleOidEntityController; +import com.baeldung.restexpress.objectid.SampleOidEntityRepository; +import com.baeldung.restexpress.objectid.SampleOidEntityService; +import com.baeldung.restexpress.uuid.SampleUuidEntityController; +import com.baeldung.restexpress.uuid.SampleUuidEntityRepository; +import com.baeldung.restexpress.uuid.SampleUuidEntityService; +import com.strategicgains.repoexpress.mongodb.MongoConfig; +import com.strategicgains.restexpress.plugin.metrics.MetricsConfig; +import org.restexpress.RestExpress; +import org.restexpress.util.Environment; + +import java.util.Properties; + +public class Configuration + extends Environment { + private static final String DEFAULT_EXECUTOR_THREAD_POOL_SIZE = "20"; + + private static final String PORT_PROPERTY = "port"; + private static final String BASE_URL_PROPERTY = "base.url"; + private static final String EXECUTOR_THREAD_POOL_SIZE = "executor.threadPool.size"; + + private int port; + private String baseUrl; + private int executorThreadPoolSize; + private MetricsConfig metricsSettings; + + private SampleUuidEntityController sampleUuidController; + private SampleOidEntityController sampleOidController; + + @Override + protected void fillValues(Properties p) { + this.port = Integer.parseInt(p.getProperty(PORT_PROPERTY, String.valueOf(RestExpress.DEFAULT_PORT))); + this.baseUrl = p.getProperty(BASE_URL_PROPERTY, "http://localhost:" + String.valueOf(port)); + this.executorThreadPoolSize = Integer.parseInt(p.getProperty(EXECUTOR_THREAD_POOL_SIZE, DEFAULT_EXECUTOR_THREAD_POOL_SIZE)); + this.metricsSettings = new MetricsConfig(p); + MongoConfig mongo = new MongoConfig(p); + initialize(mongo); + } + + private void initialize(MongoConfig mongo) { + SampleUuidEntityRepository samplesUuidRepository = new SampleUuidEntityRepository(mongo.getClient(), mongo.getDbName()); + SampleUuidEntityService sampleUuidService = new SampleUuidEntityService(samplesUuidRepository); + sampleUuidController = new SampleUuidEntityController(sampleUuidService); + + SampleOidEntityRepository samplesOidRepository = new SampleOidEntityRepository(mongo.getClient(), mongo.getDbName()); + SampleOidEntityService sampleOidService = new SampleOidEntityService(samplesOidRepository); + sampleOidController = new SampleOidEntityController(sampleOidService); + } + + public int getPort() { + return port; + } + + public String getBaseUrl() { + return baseUrl; + } + + public int getExecutorThreadPoolSize() { + return executorThreadPoolSize; + } + + public MetricsConfig getMetricsConfig() { + return metricsSettings; + } + + public SampleUuidEntityController getSampleUuidEntityController() { + return sampleUuidController; + } + + public SampleOidEntityController getSampleOidEntityController() { + return sampleOidController; + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Constants.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Constants.java new file mode 100644 index 0000000000..914c0a0a07 --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Constants.java @@ -0,0 +1,23 @@ +package com.baeldung.restexpress; + +public class Constants { + /** + * These define the URL parmaeters used in the route definition strings (e.g. '{userId}'). + */ + public class Url { + //TODO: Your URL parameter names here... + public static final String SAMPLE_ID = "uuid"; + } + + /** + * These define the route names used in naming each route definitions. These names are used + * to retrieve URL patterns within the controllers by name to create links in responses. + */ + public class Routes { + //TODO: Your Route names here... + public static final String SINGLE_UUID_SAMPLE = "sample.single.route.uuid"; + public static final String SAMPLE_UUID_COLLECTION = "sample.collection.route.uuid"; + public static final String SINGLE_OID_SAMPLE = "sample.single.route.oid"; + public static final String SAMPLE_OID_COLLECTION = "sample.collection.route.oid"; + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/LastModifiedHeaderPostprocessor.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/LastModifiedHeaderPostprocessor.java new file mode 100644 index 0000000000..81314679a4 --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/LastModifiedHeaderPostprocessor.java @@ -0,0 +1,33 @@ +package com.baeldung.restexpress; + +import com.strategicgains.repoexpress.domain.Timestamped; +import com.strategicgains.util.date.DateAdapter; +import com.strategicgains.util.date.HttpHeaderTimestampAdapter; +import org.restexpress.Request; +import org.restexpress.Response; +import org.restexpress.pipeline.Postprocessor; + +import static io.netty.handler.codec.http.HttpHeaders.Names.LAST_MODIFIED; + +/** + * Assigns the Last-Modified HTTP header on the response for GET responses, if applicable. + * + * @author toddf + * @since May 15, 2012 + */ +public class LastModifiedHeaderPostprocessor + implements Postprocessor { + DateAdapter fmt = new HttpHeaderTimestampAdapter(); + + @Override + public void process(Request request, Response response) { + if (!request.isMethodGet()) return; + if (!response.hasBody()) return; + + Object body = response.getBody(); + + if (!response.hasHeader(LAST_MODIFIED) && body.getClass().isAssignableFrom(Timestamped.class)) { + response.addHeader(LAST_MODIFIED, fmt.format(((Timestamped) body).getUpdatedAt())); + } + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Main.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Main.java new file mode 100644 index 0000000000..1c02402d89 --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Main.java @@ -0,0 +1,11 @@ +package com.baeldung.restexpress; + +import org.restexpress.util.Environment; + +public class Main { + public static void main(String[] args) throws Exception { + Configuration config = Environment.load(args, Configuration.class); + Server server = new Server(config); + server.start().awaitShutdown(); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Relationships.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Relationships.java new file mode 100644 index 0000000000..4a94e96952 --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Relationships.java @@ -0,0 +1,55 @@ +package com.baeldung.restexpress; + +import com.baeldung.restexpress.objectid.SampleOidEntity; +import com.baeldung.restexpress.uuid.SampleUuidEntity; +import com.strategicgains.hyperexpress.HyperExpress; +import com.strategicgains.hyperexpress.RelTypes; +import org.restexpress.RestExpress; +import org.restexpress.common.exception.ConfigurationException; + +import java.util.Map; + +public abstract class Relationships { + private static Map ROUTES; + + public static void define(RestExpress server) { + ROUTES = server.getRouteUrlsByName(); + + HyperExpress.relationships() + .forCollectionOf(SampleUuidEntity.class) + .rel(RelTypes.SELF, href(Constants.Routes.SAMPLE_UUID_COLLECTION)) + .withQuery("limit={limit}") + .withQuery("offset={offset}") + .rel(RelTypes.NEXT, href(Constants.Routes.SAMPLE_UUID_COLLECTION) + "?offset={nextOffset}") + .withQuery("limit={limit}") + .optional() + .rel(RelTypes.PREV, href(Constants.Routes.SAMPLE_UUID_COLLECTION) + "?offset={prevOffset}") + .withQuery("limit={limit}") + .optional() + + .forClass(SampleUuidEntity.class) + .rel(RelTypes.SELF, href(Constants.Routes.SINGLE_UUID_SAMPLE)) + .rel(RelTypes.UP, href(Constants.Routes.SAMPLE_UUID_COLLECTION)) + + .forCollectionOf(SampleOidEntity.class) + .rel(RelTypes.SELF, href(Constants.Routes.SAMPLE_OID_COLLECTION)) + .withQuery("limit={limit}") + .withQuery("offset={offset}") + .rel(RelTypes.NEXT, href(Constants.Routes.SAMPLE_OID_COLLECTION) + "?offset={nextOffset}") + .withQuery("limit={limit}") + .optional() + .rel(RelTypes.PREV, href(Constants.Routes.SAMPLE_OID_COLLECTION) + "?offset={prevOffset}") + .withQuery("limit={limit}") + .optional() + + .forClass(SampleOidEntity.class) + .rel(RelTypes.SELF, href(Constants.Routes.SINGLE_OID_SAMPLE)) + .rel(RelTypes.UP, href(Constants.Routes.SAMPLE_OID_COLLECTION)); + } + + private static String href(String name) { + String href = ROUTES.get(name); + if (href == null) throw new ConfigurationException("Route name not found: " + name); + return href; + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Routes.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Routes.java new file mode 100644 index 0000000000..a510dd24fa --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Routes.java @@ -0,0 +1,30 @@ +package com.baeldung.restexpress; + +import io.netty.handler.codec.http.HttpMethod; +import org.restexpress.RestExpress; + +public abstract class Routes { + public static void define(Configuration config, RestExpress server) { + // TODO: Your routes here... + server.uri("/samples/uuid/{uuid}.{format}", config.getSampleUuidEntityController()) + .method(HttpMethod.GET, HttpMethod.PUT, HttpMethod.DELETE) + .name(Constants.Routes.SINGLE_UUID_SAMPLE); + + server.uri("/samples/uuid.{format}", config.getSampleUuidEntityController()) + .action("readAll", HttpMethod.GET) + .method(HttpMethod.POST) + .name(Constants.Routes.SAMPLE_UUID_COLLECTION); + + server.uri("/samples/oid/{uuid}.{format}", config.getSampleOidEntityController()) + .method(HttpMethod.GET, HttpMethod.PUT, HttpMethod.DELETE) + .name(Constants.Routes.SINGLE_OID_SAMPLE); + + server.uri("/samples/oid.{format}", config.getSampleOidEntityController()) + .action("readAll", HttpMethod.GET) + .method(HttpMethod.POST) + .name(Constants.Routes.SAMPLE_OID_COLLECTION); + + // or REGEX matching routes... + // server.regex("/some.regex", config.getRouteController()); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Server.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Server.java new file mode 100644 index 0000000000..d5864e607d --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/Server.java @@ -0,0 +1,129 @@ +package com.baeldung.restexpress; + +import com.baeldung.restexpress.serialization.SerializationProvider; +import com.codahale.metrics.MetricFilter; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.graphite.Graphite; +import com.codahale.metrics.graphite.GraphiteReporter; +import com.strategicgains.repoexpress.adapter.Identifiers; +import com.strategicgains.repoexpress.exception.DuplicateItemException; +import com.strategicgains.repoexpress.exception.InvalidObjectIdException; +import com.strategicgains.repoexpress.exception.ItemNotFoundException; +import com.strategicgains.restexpress.plugin.cache.CacheControlPlugin; +import com.strategicgains.restexpress.plugin.cors.CorsHeaderPlugin; +import com.strategicgains.restexpress.plugin.metrics.MetricsConfig; +import com.strategicgains.restexpress.plugin.metrics.MetricsPlugin; +import com.strategicgains.restexpress.plugin.swagger.SwaggerPlugin; +import com.strategicgains.syntaxe.ValidationException; +import org.restexpress.Flags; +import org.restexpress.RestExpress; +import org.restexpress.exception.BadRequestException; +import org.restexpress.exception.ConflictException; +import org.restexpress.exception.NotFoundException; +import org.restexpress.pipeline.SimpleConsoleLogMessageObserver; +import org.restexpress.plugin.hyperexpress.HyperExpressPlugin; +import org.restexpress.plugin.hyperexpress.Linkable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.InetSocketAddress; +import java.util.concurrent.TimeUnit; + +import static io.netty.handler.codec.http.HttpHeaders.Names.*; +import static org.restexpress.Flags.Auth.PUBLIC_ROUTE; + +public class Server { + private static final String SERVICE_NAME = "TODO: Enter service name"; + private static final Logger LOG = LoggerFactory.getLogger(SERVICE_NAME); + + private RestExpress server; + private Configuration config; + private boolean isStarted = false; + + public Server(Configuration config) { + this.config = config; + RestExpress.setDefaultSerializationProvider(new SerializationProvider()); + Identifiers.UUID.useShortUUID(true); + + this.server = new RestExpress() + .setName(SERVICE_NAME) + .setBaseUrl(config.getBaseUrl()) + .setExecutorThreadCount(config.getExecutorThreadPoolSize()) + .addMessageObserver(new SimpleConsoleLogMessageObserver()); + + Routes.define(config, server); + Relationships.define(server); + configurePlugins(config, server); + mapExceptions(server); + } + + public Server start() { + if (!isStarted) { + server.bind(config.getPort()); + isStarted = true; + } + + return this; + } + + public void awaitShutdown() { + if (isStarted) server.awaitShutdown(); + } + + public void shutdown() { + if (isStarted) server.shutdown(); + } + + private void configurePlugins(Configuration config, RestExpress server) { + configureMetrics(config, server); + + new SwaggerPlugin() + .flag(Flags.Auth.PUBLIC_ROUTE) + .register(server); + + new CacheControlPlugin() + .register(server); + + new HyperExpressPlugin(Linkable.class) + .register(server); + + new CorsHeaderPlugin("*") + .flag(PUBLIC_ROUTE) + .allowHeaders(CONTENT_TYPE, ACCEPT, AUTHORIZATION, REFERER, LOCATION) + .exposeHeaders(LOCATION) + .register(server); + } + + private void configureMetrics(Configuration config, RestExpress server) { + MetricsConfig mc = config.getMetricsConfig(); + + if (mc.isEnabled()) { + MetricRegistry registry = new MetricRegistry(); + new MetricsPlugin(registry) + .register(server); + + if (mc.isGraphiteEnabled()) { + final Graphite graphite = new Graphite(new InetSocketAddress(mc.getGraphiteHost(), mc.getGraphitePort())); + final GraphiteReporter reporter = GraphiteReporter.forRegistry(registry) + .prefixedWith(mc.getPrefix()) + .convertRatesTo(TimeUnit.SECONDS) + .convertDurationsTo(TimeUnit.MILLISECONDS) + .filter(MetricFilter.ALL) + .build(graphite); + reporter.start(mc.getPublishSeconds(), TimeUnit.SECONDS); + } else { + LOG.warn("*** Graphite Metrics Publishing is Disabled ***"); + } + } else { + LOG.warn("*** Metrics Generation is Disabled ***"); + } + } + + private void mapExceptions(RestExpress server) { + server + .mapException(ItemNotFoundException.class, NotFoundException.class) + .mapException(DuplicateItemException.class, ConflictException.class) + .mapException(ValidationException.class, BadRequestException.class) + .mapException(InvalidObjectIdException.class, BadRequestException.class); + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/objectid/SampleOidEntity.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/objectid/SampleOidEntity.java new file mode 100644 index 0000000000..f92e56889b --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/objectid/SampleOidEntity.java @@ -0,0 +1,32 @@ +package com.baeldung.restexpress.objectid; + +import com.baeldung.restexpress.Constants; +import com.strategicgains.hyperexpress.annotation.BindToken; +import com.strategicgains.hyperexpress.annotation.TokenBindings; +import com.strategicgains.repoexpress.mongodb.AbstractMongodbEntity; +import org.restexpress.plugin.hyperexpress.Linkable; + +/** + * This is a sample entity identified by a MongoDB ObjectID (instead of a UUID). + * It also contains createdAt and updatedAt properties that are automatically maintained + * by the persistence layer (SampleOidEntityRepository). + */ +@TokenBindings({ + @BindToken(value = Constants.Url.SAMPLE_ID, field = "id") +}) +public class SampleOidEntity + extends AbstractMongodbEntity + implements Linkable { + private String name; + + public SampleOidEntity() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/objectid/SampleOidEntityController.java b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/objectid/SampleOidEntityController.java new file mode 100644 index 0000000000..1997ad9e10 --- /dev/null +++ b/microservices-modules/rest-express/src/main/java/com/baeldung/restexpress/objectid/SampleOidEntityController.java @@ -0,0 +1,80 @@ +package com.baeldung.restexpress.objectid; + +import com.baeldung.restexpress.Constants; +import com.strategicgains.hyperexpress.builder.DefaultTokenResolver; +import com.strategicgains.hyperexpress.builder.DefaultUrlBuilder; +import com.strategicgains.hyperexpress.builder.UrlBuilder; +import com.strategicgains.repoexpress.mongodb.Identifiers; +import io.netty.handler.codec.http.HttpMethod; +import org.restexpress.Request; +import org.restexpress.Response; +import org.restexpress.common.query.QueryFilter; +import org.restexpress.common.query.QueryOrder; +import org.restexpress.common.query.QueryRange; +import org.restexpress.query.QueryFilters; +import org.restexpress.query.QueryOrders; +import org.restexpress.query.QueryRanges; + +import java.util.List; + +/** + * This is the 'controller' layer, where HTTP details are converted to domain concepts and passed to the service layer. + * Then service layer response information is enhanced with HTTP details, if applicable, for the response. + *

NIB-GaM&vEUBD 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