From 4a7ec0a5c1c8ae1f03440f12af12718e87b1cbca Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Sun, 12 Jan 2025 15:35:52 +0200 Subject: [PATCH 01/10] BAEL-8954 - How to log all requests and responses with an exception in a single place --- logging-modules/log-all-requests/pom.xml | 46 +++++++++++++++++ .../GlobalExceptionHandler.java | 20 ++++++++ .../HttpTraceActuatorConfiguration.java | 15 ++++++ .../LogAllRequestsApplication.java | 13 +++++ .../logallrequests/LoggingFilter.java | 51 +++++++++++++++++++ .../logallrequests/ResponseWrapper.java | 26 ++++++++++ .../logallrequests/TestController.java | 20 ++++++++ .../src/main/resources/application.yaml | 9 ++++ logging-modules/pom.xml | 1 + 9 files changed, 201 insertions(+) create mode 100644 logging-modules/log-all-requests/pom.xml create mode 100644 logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/GlobalExceptionHandler.java create mode 100644 logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/HttpTraceActuatorConfiguration.java create mode 100644 logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/LogAllRequestsApplication.java create mode 100644 logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/LoggingFilter.java create mode 100644 logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/ResponseWrapper.java create mode 100644 logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/TestController.java create mode 100644 logging-modules/log-all-requests/src/main/resources/application.yaml diff --git a/logging-modules/log-all-requests/pom.xml b/logging-modules/log-all-requests/pom.xml new file mode 100644 index 0000000000..75e6b48eb0 --- /dev/null +++ b/logging-modules/log-all-requests/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.4.1 + + + com.baeldung + log-all-requests + 0.0.1-SNAPSHOT + log-all-requests + log-all-requests + + + 17 + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/GlobalExceptionHandler.java b/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/GlobalExceptionHandler.java new file mode 100644 index 0000000000..098875b207 --- /dev/null +++ b/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/GlobalExceptionHandler.java @@ -0,0 +1,20 @@ +package com.baeldung.logallrequests; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +public class GlobalExceptionHandler { + + private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + @ExceptionHandler(Exception.class) + public ResponseEntity handleException(Exception ex) { + logger.error("Exception caught: {}", ex.getMessage(), ex); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("An error occurred"); + } +} diff --git a/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/HttpTraceActuatorConfiguration.java b/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/HttpTraceActuatorConfiguration.java new file mode 100644 index 0000000000..e848eeb882 --- /dev/null +++ b/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/HttpTraceActuatorConfiguration.java @@ -0,0 +1,15 @@ +package com.baeldung.logallrequests; + +import org.springframework.boot.actuate.web.exchanges.InMemoryHttpExchangeRepository; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class HttpTraceActuatorConfiguration { + + @Bean + public InMemoryHttpExchangeRepository createTraceRepository() { + return new InMemoryHttpExchangeRepository(); + } + +} diff --git a/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/LogAllRequestsApplication.java b/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/LogAllRequestsApplication.java new file mode 100644 index 0000000000..702626e219 --- /dev/null +++ b/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/LogAllRequestsApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.logallrequests; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class LogAllRequestsApplication { + + public static void main(String[] args) { + SpringApplication.run(LogAllRequestsApplication.class, args); + } + +} diff --git a/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/LoggingFilter.java b/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/LoggingFilter.java new file mode 100644 index 0000000000..d070118ade --- /dev/null +++ b/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/LoggingFilter.java @@ -0,0 +1,51 @@ +package com.baeldung.logallrequests; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +@Component +public class LoggingFilter implements Filter { + + private static final Logger logger = LoggerFactory.getLogger(LoggingFilter.class); + + @Override + public void doFilter(jakarta.servlet.ServletRequest request, jakarta.servlet.ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) { + HttpServletRequest httpRequest = (HttpServletRequest) request; + HttpServletResponse httpResponse = (HttpServletResponse) response; + + logRequest(httpRequest); + + ResponseWrapper responseWrapper = new ResponseWrapper(httpResponse); + + chain.doFilter(request, responseWrapper); + + logResponse(httpRequest, responseWrapper); + } else { + chain.doFilter(request, response); + } + } + + private void logRequest(HttpServletRequest request) { + logger.info("Incoming Request: [{}] {}", request.getMethod(), request.getRequestURI()); + request.getHeaderNames().asIterator().forEachRemaining(header -> + logger.info("Header: {} = {}", header, request.getHeader(header)) + ); + } + + private void logResponse(HttpServletRequest request, ResponseWrapper responseWrapper) throws IOException { + logger.info("Outgoing Response for [{}] {}: Status = {}", + request.getMethod(), request.getRequestURI(), responseWrapper.getStatus()); + logger.info("Response Body: {}", responseWrapper.getBodyAsString()); + } +} \ No newline at end of file diff --git a/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/ResponseWrapper.java b/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/ResponseWrapper.java new file mode 100644 index 0000000000..5fb301f51b --- /dev/null +++ b/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/ResponseWrapper.java @@ -0,0 +1,26 @@ +package com.baeldung.logallrequests; + +import java.io.CharArrayWriter; +import java.io.PrintWriter; + +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponseWrapper; + +public class ResponseWrapper extends HttpServletResponseWrapper { + + private final CharArrayWriter charArrayWriter = new CharArrayWriter(); + private final PrintWriter writer = new PrintWriter(charArrayWriter); + + public ResponseWrapper(HttpServletResponse response) { + super(response); + } + + @Override + public PrintWriter getWriter() { + return writer; + } + + public String getBodyAsString() { + return charArrayWriter.toString(); + } +} diff --git a/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/TestController.java b/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/TestController.java new file mode 100644 index 0000000000..05b2362580 --- /dev/null +++ b/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/TestController.java @@ -0,0 +1,20 @@ +package com.baeldung.logallrequests; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api") +public class TestController { + + @GetMapping("/hello") + public String hello() { + return "Hello, World!"; + } + + @GetMapping("/error") + public String error() { + throw new RuntimeException("This is a test exception"); + } +} diff --git a/logging-modules/log-all-requests/src/main/resources/application.yaml b/logging-modules/log-all-requests/src/main/resources/application.yaml new file mode 100644 index 0000000000..401d0b9432 --- /dev/null +++ b/logging-modules/log-all-requests/src/main/resources/application.yaml @@ -0,0 +1,9 @@ +spring: + application: + name: log-all-requests + +management: + endpoints: + web: + exposure: + include: httpexchanges \ No newline at end of file diff --git a/logging-modules/pom.xml b/logging-modules/pom.xml index 3b8e3cb11a..2aca93e525 100644 --- a/logging-modules/pom.xml +++ b/logging-modules/pom.xml @@ -23,6 +23,7 @@ logging-techniques solarwinds-loggly splunk-with-log4j2 + log-all-requests From 288ec5e36b890c6f0f96162f7ae9b162ee9e3c4c Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Sat, 18 Jan 2025 15:46:26 +0200 Subject: [PATCH 02/10] BAEL-8954 - add test --- logging-modules/log-all-requests/pom.xml | 11 +++++ .../logallrequests/LoggingFilterTest.java | 41 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 logging-modules/log-all-requests/src/test/java/com/baeldung/logallrequests/LoggingFilterTest.java diff --git a/logging-modules/log-all-requests/pom.xml b/logging-modules/log-all-requests/pom.xml index 75e6b48eb0..e84c26671f 100644 --- a/logging-modules/log-all-requests/pom.xml +++ b/logging-modules/log-all-requests/pom.xml @@ -32,6 +32,17 @@ spring-boot-starter-test test + + com.github.stefanbirkner + system-rules + 1.19.0 + test + + + ch.qos.logback + logback-classic + test + diff --git a/logging-modules/log-all-requests/src/test/java/com/baeldung/logallrequests/LoggingFilterTest.java b/logging-modules/log-all-requests/src/test/java/com/baeldung/logallrequests/LoggingFilterTest.java new file mode 100644 index 0000000000..4328eae66e --- /dev/null +++ b/logging-modules/log-all-requests/src/test/java/com/baeldung/logallrequests/LoggingFilterTest.java @@ -0,0 +1,41 @@ +package com.baeldung.logallrequests; + +import static org.assertj.core.api.Assertions.assertThat; + +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.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.system.CapturedOutput; +import org.springframework.boot.test.system.OutputCaptureExtension; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +@ExtendWith({ SpringExtension.class, OutputCaptureExtension.class }) +@SpringBootTest +@AutoConfigureMockMvc +public class LoggingFilterTest { + + @Autowired + private MockMvc mockMvc; + + @Test + public void testRequestIsLogged(CapturedOutput output) throws Exception { + mockMvc.perform(MockMvcRequestBuilders.get("/api/hello") + .header("X-Test-Header", "HeaderValue")) + .andReturn(); + + assertThat(output.getAll()).contains("Incoming Request: [GET] /api/hello"); + } + + @Test + public void testResponseIsLogged(CapturedOutput output) throws Exception { + mockMvc.perform(MockMvcRequestBuilders.get("/api/hello")) + .andReturn(); + + assertThat(output.getAll()).contains("Outgoing Response for [GET] /api/hello: Status = 200"); + } + +} \ No newline at end of file From 8e7d828f175389c02567290891ec2629f99c6124 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Wed, 22 Jan 2025 22:02:53 +0200 Subject: [PATCH 03/10] BAEL-8954 - code review --- ...ingFilterTest.java => LoggingFilterIntegrationTest.java} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename logging-modules/log-all-requests/src/test/java/com/baeldung/logallrequests/{LoggingFilterTest.java => LoggingFilterIntegrationTest.java} (83%) diff --git a/logging-modules/log-all-requests/src/test/java/com/baeldung/logallrequests/LoggingFilterTest.java b/logging-modules/log-all-requests/src/test/java/com/baeldung/logallrequests/LoggingFilterIntegrationTest.java similarity index 83% rename from logging-modules/log-all-requests/src/test/java/com/baeldung/logallrequests/LoggingFilterTest.java rename to logging-modules/log-all-requests/src/test/java/com/baeldung/logallrequests/LoggingFilterIntegrationTest.java index 4328eae66e..f6dbc86300 100644 --- a/logging-modules/log-all-requests/src/test/java/com/baeldung/logallrequests/LoggingFilterTest.java +++ b/logging-modules/log-all-requests/src/test/java/com/baeldung/logallrequests/LoggingFilterIntegrationTest.java @@ -16,13 +16,13 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @ExtendWith({ SpringExtension.class, OutputCaptureExtension.class }) @SpringBootTest @AutoConfigureMockMvc -public class LoggingFilterTest { +public class LoggingFilterIntegrationTest { @Autowired private MockMvc mockMvc; @Test - public void testRequestIsLogged(CapturedOutput output) throws Exception { + public void whenRequestIsHandled_thenIncomingRequestIsLogged(CapturedOutput output) throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/api/hello") .header("X-Test-Header", "HeaderValue")) .andReturn(); @@ -31,7 +31,7 @@ public class LoggingFilterTest { } @Test - public void testResponseIsLogged(CapturedOutput output) throws Exception { + public void whenResponseIsSent_thenOutgoingResponseIsLogged(CapturedOutput output) throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/api/hello")) .andReturn(); From 8717d70cd16595c12900d0f6cbfb2ec4abbaede7 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Tue, 4 Feb 2025 19:20:46 +0530 Subject: [PATCH 04/10] JAVA-40698: Changes made for fixing integration build failure (#18264) --- spring-boot-modules/spring-boot-springdoc-2/pom.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/spring-boot-modules/spring-boot-springdoc-2/pom.xml b/spring-boot-modules/spring-boot-springdoc-2/pom.xml index 4ad74b542f..69b45fefe1 100644 --- a/spring-boot-modules/spring-boot-springdoc-2/pom.xml +++ b/spring-boot-modules/spring-boot-springdoc-2/pom.xml @@ -81,13 +81,6 @@ - - org.springframework.boot - spring-boot-maven-plugin - - com.baeldung.springdoc.SpringdocApplication - - org.apache.maven.plugins maven-compiler-plugin From c7f404c54cf42e6a33636615ed88953cafc281c8 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Tue, 4 Feb 2025 20:25:07 +0200 Subject: [PATCH 05/10] BAEL-8954 - fix --- .../logallrequests/ResponseWrapper.java | 38 +++++++++++++++++-- .../LoggingFilterIntegrationTest.java | 1 + 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/ResponseWrapper.java b/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/ResponseWrapper.java index 5fb301f51b..f51e13796f 100644 --- a/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/ResponseWrapper.java +++ b/logging-modules/log-all-requests/src/main/java/com/baeldung/logallrequests/ResponseWrapper.java @@ -1,26 +1,56 @@ package com.baeldung.logallrequests; -import java.io.CharArrayWriter; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; import java.io.PrintWriter; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.WriteListener; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponseWrapper; public class ResponseWrapper extends HttpServletResponseWrapper { - private final CharArrayWriter charArrayWriter = new CharArrayWriter(); - private final PrintWriter writer = new PrintWriter(charArrayWriter); + private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + private final PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream)); public ResponseWrapper(HttpServletResponse response) { super(response); } + @Override + public ServletOutputStream getOutputStream() { + return new ServletOutputStream() { + @Override + public boolean isReady() { + return true; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + } + + @Override + public void write(int b) { + outputStream.write(b); + } + }; + } + @Override public PrintWriter getWriter() { return writer; } + @Override + public void flushBuffer() throws IOException { + super.flushBuffer(); + writer.flush(); + } + public String getBodyAsString() { - return charArrayWriter.toString(); + writer.flush(); + return outputStream.toString(); } } diff --git a/logging-modules/log-all-requests/src/test/java/com/baeldung/logallrequests/LoggingFilterIntegrationTest.java b/logging-modules/log-all-requests/src/test/java/com/baeldung/logallrequests/LoggingFilterIntegrationTest.java index f6dbc86300..0e018344b1 100644 --- a/logging-modules/log-all-requests/src/test/java/com/baeldung/logallrequests/LoggingFilterIntegrationTest.java +++ b/logging-modules/log-all-requests/src/test/java/com/baeldung/logallrequests/LoggingFilterIntegrationTest.java @@ -28,6 +28,7 @@ public class LoggingFilterIntegrationTest { .andReturn(); assertThat(output.getAll()).contains("Incoming Request: [GET] /api/hello"); + assertThat(output.getAll()).contains("Response Body: Hello, World!"); } @Test From 106079e35c9688fd0924b5790999f24a22d6cede Mon Sep 17 00:00:00 2001 From: dvohra16 Date: Tue, 4 Feb 2025 10:35:34 -0800 Subject: [PATCH 06/10] Update pom.xml (#18259) --- apache-kafka-2/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apache-kafka-2/pom.xml b/apache-kafka-2/pom.xml index ebb4d1a373..7bcb992b05 100644 --- a/apache-kafka-2/pom.xml +++ b/apache-kafka-2/pom.xml @@ -121,7 +121,7 @@ 5.7.0 - 3.6.1 + 3.9.0 1.19.3 1.19.3 2.15.2 @@ -130,4 +130,4 @@ 3.0.0 - \ No newline at end of file + From 489bf6e1d1ef9b104b6c9797a1bb0b23cabf2beb Mon Sep 17 00:00:00 2001 From: dvohra09 Date: Tue, 4 Feb 2025 13:44:16 -0800 Subject: [PATCH 07/10] BAEL-9115 Update Pattern matching in switch (#18255) * Delete core-java-modules/core-java-17/src/test/java/com/baeldung/switchpatterns/ParenthesizedPatternsUnitTest.java * Delete core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/ParenthesizedPatterns.java * Update GuardedPatterns.java * Create SwitchPreview.java * Create pom.xml * Delete core-java-modules/core-java-24/src/main/java/com/baeldung/javafeatures/switchpatterns/pom.xml * Create pom.xml * Update GuardedPatterns.java * Create TypePatternsUnitTest.java * Create GuardedPatternsUnitTest.java * Create HandlingNullValuesUnitTest.java * Create TypePatterns.java * Create GuardedPatterns.java * Create HandlingNullValues.java * Create PatternMatching.java * Create SwitchStatement.java * Update HandlingNullValuesUnitTest.java --- .../switchpatterns/ParenthesizedPatterns.java | 29 ----------- .../switchpatterns/GuardedPatterns.java | 25 ++++++++++ .../switchpatterns/HandlingNullValues.java | 20 ++++++++ .../switchpatterns/PatternMatching.java | 14 ++++++ .../switchpatterns/SwitchStatement.java | 14 ++++++ .../baeldung/switchpatterns/TypePatterns.java | 30 ++++++++++++ .../GuardedPatternsUnitTest.java} | 18 ++----- .../HandlingNullValuesUnitTest.java | 25 ++++++++++ .../switchpatterns/TypePatternsUnitTest.java | 49 +++++++++++++++++++ core-java-modules/core-java-24/pom.xml | 28 +++++++++++ .../switchpatterns/SwitchPreview.java | 14 ++++++ 11 files changed, 223 insertions(+), 43 deletions(-) delete mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/ParenthesizedPatterns.java create mode 100644 core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/GuardedPatterns.java create mode 100644 core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/HandlingNullValues.java create mode 100644 core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/PatternMatching.java create mode 100644 core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/SwitchStatement.java create mode 100644 core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/TypePatterns.java rename core-java-modules/{core-java-17/src/test/java/com/baeldung/switchpatterns/ParenthesizedPatternsUnitTest.java => core-java-21/src/test/java/com/baeldung/switchpatterns/GuardedPatternsUnitTest.java} (51%) create mode 100644 core-java-modules/core-java-21/src/test/java/com/baeldung/switchpatterns/HandlingNullValuesUnitTest.java create mode 100644 core-java-modules/core-java-21/src/test/java/com/baeldung/switchpatterns/TypePatternsUnitTest.java create mode 100644 core-java-modules/core-java-24/pom.xml create mode 100644 core-java-modules/core-java-24/src/main/java/com/baeldung/javafeatures/switchpatterns/SwitchPreview.java diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/ParenthesizedPatterns.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/ParenthesizedPatterns.java deleted file mode 100644 index 49dd5edb31..0000000000 --- a/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/ParenthesizedPatterns.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.switchpatterns; - -public class ParenthesizedPatterns { - - static double getDoubleValueUsingIf(Object o) { - return switch (o) { - case String s -> { - if (s.length() > 0) { - if (s.contains("#") || s.contains("@")) { - yield 0d; - } else { - yield Double.parseDouble(s); - } - } else { - yield 0d; - } - } - default -> 0d; - }; - } - - static double getDoubleValueUsingParenthesizedPatterns(Object o) { - return switch (o) { - case String s && s.length() > 0 && !(s.contains("#") || s.contains("@")) -> Double.parseDouble(s); - default -> 0d; - }; - } - -} diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/GuardedPatterns.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/GuardedPatterns.java new file mode 100644 index 0000000000..352d65b09e --- /dev/null +++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/GuardedPatterns.java @@ -0,0 +1,25 @@ +package com.baeldung.switchpatterns; + +public class GuardedPatterns { + + static double getDoubleValueUsingIf(Object o) { + return switch (o) { + case String s -> { + if (s.length() > 0) { + yield Double.parseDouble(s); + } else { + yield 0d; + } + } + default -> 0d; + }; + } + + static double getDoubleValueUsingGuardedPatterns(Object o) { + return switch (o) { + case String s when s.length() > 0 -> Double.parseDouble(s); + default -> 0d; + }; + } + +} diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/HandlingNullValues.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/HandlingNullValues.java new file mode 100644 index 0000000000..8e64480a41 --- /dev/null +++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/HandlingNullValues.java @@ -0,0 +1,20 @@ +package com.baeldung.switchpatterns; + +public class HandlingNullValues { + + static double getDoubleUsingSwitchNullCase(Object o) { + return switch (o) { + case String s -> Double.parseDouble(s); + case null -> 0d; + default -> 0d; + }; + } + + static double getDoubleUsingSwitchTotalType(Object o) { + return switch (o) { + case String s -> Double.parseDouble(s); + case Object ob -> 0d; + }; + } + +} diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/PatternMatching.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/PatternMatching.java new file mode 100644 index 0000000000..f026caa3f1 --- /dev/null +++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/PatternMatching.java @@ -0,0 +1,14 @@ +package com.baeldung.switchpatterns; + +public class PatternMatching { + + public static void main(String[] args) { + Object o = args[0]; + if (o instanceof String s) { + System.out.printf("Object is a string %s", s); + } else if(o instanceof Number n) { + System.out.printf("Object is a number %n", n); + } + } + +} diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/SwitchStatement.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/SwitchStatement.java new file mode 100644 index 0000000000..17d2b1856d --- /dev/null +++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/SwitchStatement.java @@ -0,0 +1,14 @@ +package com.baeldung.switchpatterns; + +public class SwitchStatement { + + public static void main(String[] args) { + final String b = "B"; + switch (args[0]) { + case "A" -> System.out.println("Parameter is A"); + case b -> System.out.println("Parameter is b"); + default -> System.out.println("Parameter is unknown"); + }; + } + +} diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/TypePatterns.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/TypePatterns.java new file mode 100644 index 0000000000..47af090ad0 --- /dev/null +++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/switchpatterns/TypePatterns.java @@ -0,0 +1,30 @@ +package com.baeldung.switchpatterns; + +public class TypePatterns { + + static double getDoubleUsingIf(Object o) { + double result; + + if (o instanceof Integer) { + result = ((Integer) o).doubleValue(); + } else if (o instanceof Float) { + result = ((Float) o).doubleValue(); + } else if (o instanceof String) { + result = Double.parseDouble(((String) o)); + } else { + result = 0d; + } + + return result; + } + + static double getDoubleUsingSwitch(Object o) { + return switch (o) { + case Integer i -> i.doubleValue(); + case Float f -> f.doubleValue(); + case String s -> Double.parseDouble(s); + default -> 0d; + }; + } + +} diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/switchpatterns/ParenthesizedPatternsUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/switchpatterns/GuardedPatternsUnitTest.java similarity index 51% rename from core-java-modules/core-java-17/src/test/java/com/baeldung/switchpatterns/ParenthesizedPatternsUnitTest.java rename to core-java-modules/core-java-21/src/test/java/com/baeldung/switchpatterns/GuardedPatternsUnitTest.java index 9548c9f0b6..cff8b1caca 100644 --- a/core-java-modules/core-java-17/src/test/java/com/baeldung/switchpatterns/ParenthesizedPatternsUnitTest.java +++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/switchpatterns/GuardedPatternsUnitTest.java @@ -3,9 +3,9 @@ package com.baeldung.switchpatterns; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -import static com.baeldung.switchpatterns.ParenthesizedPatterns.*; +import static com.baeldung.switchpatterns.GuardedPatterns.*; -class ParenthesizedPatternsUnitTest { +class GuardedPatternsUnitTest { @Test void givenIfImplementation_whenUsingEmptyString_thenDoubleIsReturned() { @@ -17,24 +17,14 @@ class ParenthesizedPatternsUnitTest { assertEquals(10d, getDoubleValueUsingIf("10")); } - @Test - void givenIfImplementation_whenStringContainsSpecialChar_thenDoubleIsReturned() { - assertEquals(0d, getDoubleValueUsingIf("@10")); - } - @Test void givenPatternsImplementation_whenUsingEmptyString_thenDoubleIsReturned() { - assertEquals(0d, getDoubleValueUsingParenthesizedPatterns("")); + assertEquals(0d, getDoubleValueUsingGuardedPatterns("")); } @Test void givenPatternsImplementation_whenUsingNonEmptyString_thenDoubleIsReturned() { - assertEquals(10d, getDoubleValueUsingParenthesizedPatterns("10")); - } - - @Test - void givenPatternsImplementation_whenStringContainsSpecialChar_thenDoubleIsReturned() { - assertEquals(0d, getDoubleValueUsingParenthesizedPatterns("@10")); + assertEquals(10d, getDoubleValueUsingGuardedPatterns("10")); } } diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/switchpatterns/HandlingNullValuesUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/switchpatterns/HandlingNullValuesUnitTest.java new file mode 100644 index 0000000000..93f849b76b --- /dev/null +++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/switchpatterns/HandlingNullValuesUnitTest.java @@ -0,0 +1,25 @@ +package com.baeldung.switchpatterns; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static com.baeldung.switchpatterns.HandlingNullValues.*; + +class HandlingNullValuesUnitTest { + + @Test + void givenNullCaseInSwitch_whenUsingStringAsArgument_thenDoubleIsReturned() { + assertEquals(10d, getDoubleUsingSwitchNullCase("10")); + } + + @Test + void givenTotalTypeInSwitch_whenUsingNullArgument_thenDoubleIsReturned() { + assertEquals(0d, getDoubleUsingSwitchNullCase(null)); + } + + @Test + void givenTotalTypeInSwitch_whenUsingStringAsArgument_thenDoubleIsReturned() { + assertEquals(10d, getDoubleUsingSwitchTotalType("10")); + } + +} diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/switchpatterns/TypePatternsUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/switchpatterns/TypePatternsUnitTest.java new file mode 100644 index 0000000000..25988be53d --- /dev/null +++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/switchpatterns/TypePatternsUnitTest.java @@ -0,0 +1,49 @@ +package com.baeldung.switchpatterns; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static com.baeldung.switchpatterns.TypePatterns.*; + +class TypePatternsUnitTest { + + @Test + void givenIfImplementation_whenUsingIntegerAsArgument_thenDoubleIsReturned() { + assertEquals(10d, getDoubleUsingIf(10)); + } + + @Test + void givenIfImplementation_whenUsingDoubleAsArgument_thenDoubleIsReturned() { + assertEquals(10d, getDoubleUsingIf(10.0f)); + } + + @Test + void givenIfImplementation_whenUsingStringAsArgument_thenDoubleIsReturned() { + assertEquals(10d, getDoubleUsingIf("10")); + } + + @Test + void givenIfImplementation_whenUsingCharAsArgument_thenDoubleIsReturned() { + assertEquals(0d, getDoubleUsingIf('c')); + } + + @Test + void givenSwitchImplementation_whenUsingIntegerAsArgument_thenDoubleIsReturned() { + assertEquals(10d, getDoubleUsingSwitch(10)); + } + + @Test + void givenSwitchImplementation_whenUsingDoubleAsArgument_thenDoubleIsReturned() { + assertEquals(10d, getDoubleUsingSwitch(10.0f)); + } + + @Test + void givenSwitchImplementation_whenUsingStringAsArgument_thenDoubleIsReturned() { + assertEquals(10d, getDoubleUsingSwitch("10")); + } + + @Test + void givenSwitchImplementation_whenUsingCharAsArgument_thenDoubleIsReturned() { + assertEquals(0d, getDoubleUsingSwitch('c')); + } + +} diff --git a/core-java-modules/core-java-24/pom.xml b/core-java-modules/core-java-24/pom.xml new file mode 100644 index 0000000000..797258a98d --- /dev/null +++ b/core-java-modules/core-java-24/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + core-java-24 + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 24 + 24 + --enable-preview + + + + + + diff --git a/core-java-modules/core-java-24/src/main/java/com/baeldung/javafeatures/switchpatterns/SwitchPreview.java b/core-java-modules/core-java-24/src/main/java/com/baeldung/javafeatures/switchpatterns/SwitchPreview.java new file mode 100644 index 0000000000..3bf5fc5806 --- /dev/null +++ b/core-java-modules/core-java-24/src/main/java/com/baeldung/javafeatures/switchpatterns/SwitchPreview.java @@ -0,0 +1,14 @@ +package com.baeldung.java.javafeatures; +import java.util.Random; + +public class SwitchPreview { + + void primitiveTypePatternExample() { + Random r=new Random(); + switch (r.nextInt()) { + case 1 -> System.out.println("int is 1"); + case int i when i > 1 && i < 100 -> System.out.println("int is greater than 1 and less than 100"); + default -> System.out.println("int is greater or equal to 100"); + } + } +} From 45bd94cf7216fdae36f4d0717fa5879477b5bb0a Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Wed, 5 Feb 2025 04:29:30 +0100 Subject: [PATCH 08/10] BAEL-9027: Apply Spring Security Filter Only on Secured Endpoints (#18252) * BAEL-9027: Apply Spring Security Filter Only on Secured Endpoints * BAEL-9027: fic method name --- .../CustomWebSecurityConfigurerAdapter.java | 49 ++++++++++--------- .../baeldung/filter/FilterApplication.java | 11 +++++ .../com/baeldung/filter/FilterController.java | 18 +++++++ .../filter/FilterControllerUnitTest.java | 47 ++++++++++++++++++ 4 files changed, 103 insertions(+), 22 deletions(-) create mode 100644 spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/FilterApplication.java create mode 100644 spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/FilterController.java create mode 100644 spring-security-modules/spring-security-web-rest-basic-auth/src/test/java/com/baeldung/filter/FilterControllerUnitTest.java diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java index ce50448605..47a22bfcde 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java @@ -1,45 +1,50 @@ package com.baeldung.filter; -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.Customizer; 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.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.crypto.factory.PasswordEncoderFactories; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; -import com.baeldung.security.RestAuthenticationEntryPoint; - @Configuration @EnableWebSecurity 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"); + @Bean + public InMemoryUserDetailsManager userDetailsService() { + PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder(); + UserDetails user = User.withUsername("user1") + .password(encoder.encode("user1Pass")) + .roles("USER") + .build(); + return new InMemoryUserDetailsManager(user); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http.authorizeHttpRequests(expressionInterceptUrlRegistry -> - expressionInterceptUrlRegistry.requestMatchers("/securityNone").permitAll() - .anyRequest().authenticated()) - .httpBasic(httpSecurityHttpBasicConfigurer -> httpSecurityHttpBasicConfigurer.authenticationEntryPoint(authenticationEntryPoint)); + http.authorizeHttpRequests(authorizationManagerRequestMatcherRegistry -> + authorizationManagerRequestMatcherRegistry.requestMatchers("/securityNone/**").permitAll() + .anyRequest().authenticated() + ) + .httpBasic(Customizer.withDefaults()); http.addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class); return http.build(); } - + @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); + public SecurityFilterChain securedFilterChain(HttpSecurity http) throws Exception { + http.authorizeHttpRequests(authorizationManagerRequestMatcherRegistry -> + authorizationManagerRequestMatcherRegistry.requestMatchers("/secured/**").authenticated()) + .httpBasic(Customizer.withDefaults()); + http.addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class); + return http.build(); } -} + +} \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/FilterApplication.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/FilterApplication.java new file mode 100644 index 0000000000..fe2ed4080e --- /dev/null +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/FilterApplication.java @@ -0,0 +1,11 @@ +package com.baeldung.filter; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class FilterApplication { + public static void main(String[] args) { + SpringApplication.run(FilterApplication.class, args); + } +} diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/FilterController.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/FilterController.java new file mode 100644 index 0000000000..b79d9d88b8 --- /dev/null +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/FilterController.java @@ -0,0 +1,18 @@ +package com.baeldung.filter; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class FilterController { + + @GetMapping("/securityNone/test") + public String publicEndpoint() { + return "This is a public endpoint."; + } + + @GetMapping("/secured/test") + public String securedEndpoint() { + return "This is a secured endpoint."; + } +} diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/test/java/com/baeldung/filter/FilterControllerUnitTest.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/test/java/com/baeldung/filter/FilterControllerUnitTest.java new file mode 100644 index 0000000000..8ad3262126 --- /dev/null +++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/test/java/com/baeldung/filter/FilterControllerUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung.filter; + +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.boot.test.web.client.TestRestTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.Assert.assertEquals; + + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = FilterApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class FilterControllerUnitTest { + + @Autowired + private TestRestTemplate template; + + @Test + public void givenRequestOnPublicService_shouldSucceedWith200() throws Exception { + ResponseEntity result = template.getForEntity("/securityNone/test", String.class); + assertEquals(HttpStatus.OK, result.getStatusCode()); + } + + @Test + public void givenAuthRequestOnPrivateService_shouldSucceedWith200() throws Exception { + ResponseEntity result = template.withBasicAuth("user1", "user1Pass") + .getForEntity("/secured/test", String.class); + assertEquals(HttpStatus.OK, result.getStatusCode()); + } + + @Test + public void givenRequestOnPrivateService_shouldFailWith401() throws Exception { + ResponseEntity result = template.getForEntity("/secured/test", String.class); + assertEquals(HttpStatus.UNAUTHORIZED, result.getStatusCode()); + } + + @Test + public void givenInvalidAuthRequestOnPrivateService_shouldSucceedWith401() throws Exception { + ResponseEntity result = template.withBasicAuth("spring", "wrong") + .getForEntity("/secured/test", String.class); + assertEquals(HttpStatus.UNAUTHORIZED, result.getStatusCode()); + } +} \ No newline at end of file From ebd0050725bf7c4c56adcfd6c9b040b01021c8f3 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Wed, 5 Feb 2025 14:05:27 +0530 Subject: [PATCH 09/10] JAVA-40698: Changes made for removal non required build properties to stable the build (#18266) --- .../spring-boot-springdoc/pom.xml | 35 ++----------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/spring-boot-modules/spring-boot-springdoc/pom.xml b/spring-boot-modules/spring-boot-springdoc/pom.xml index 3d1e7e7f14..f017295651 100644 --- a/spring-boot-modules/spring-boot-springdoc/pom.xml +++ b/spring-boot-modules/spring-boot-springdoc/pom.xml @@ -66,45 +66,15 @@ test - org.springframework.boot spring-boot-maven-plugin - - - pre-integration-test - - start - - - - post-integration-test - - stop - - - - - - org.springdoc - springdoc-openapi-maven-plugin - ${springdoc-openapi-maven-plugin.version} - - - integration-test - - generate - - - - http://localhost:8080/api-docs - openapi.json - ${project.build.directory} + com.baeldung.springdoc.SpringdocApplication - + org.asciidoctor asciidoctor-maven-plugin @@ -150,7 +120,6 @@ ${project.build.directory}/generated-snippets 1.4 true - com.baeldung.springdoc.SpringdocApplication \ No newline at end of file From 507c3448b0201cbb45e9b8f1ec7f7f1b019be3d4 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 5 Feb 2025 20:37:16 +0200 Subject: [PATCH 10/10] [JAVA-43971] Check Article Code Matches GitHub - Week 51 - 2024 (#18250) --- .../configurationproperties/Database.java | 1 - .../DatabaseConfig.java | 0 .../DatabaseConfigPropertiesApp.java | 0 .../DatabasePropertiesIntegrationTest.java | 3 -- .../test/resources/database-test.properties | 0 .../ChildConfig.java | 2 +- .../Module1Config.java | 2 +- .../Module2Config.java | 2 +- .../ParentConfig.java | 2 +- .../springapplicationcontext}/TestClass1.java | 2 +- .../springapplicationcontext}/TestClass2.java | 2 +- .../java/com/baeldung/jacoco/Palindrome.java | 15 +++++++++ .../baeldung/jacoco/PalindromeUnitTest.java | 32 +++++++++++++++++++ 13 files changed, 53 insertions(+), 10 deletions(-) rename spring-boot-modules/{spring-boot-properties-2 => spring-boot-properties}/src/main/java/com/baeldung/configurationproperties/Database.java (99%) rename spring-boot-modules/{spring-boot-properties-2 => spring-boot-properties}/src/main/java/com/baeldung/configurationproperties/DatabaseConfig.java (100%) rename spring-boot-modules/{spring-boot-properties-2 => spring-boot-properties}/src/main/java/com/baeldung/configurationproperties/DatabaseConfigPropertiesApp.java (100%) rename spring-boot-modules/{spring-boot-properties-2 => spring-boot-properties}/src/test/java/com/baeldung/configurationproperties/DatabasePropertiesIntegrationTest.java (94%) rename spring-boot-modules/{spring-boot-properties-2 => spring-boot-properties}/src/test/resources/database-test.properties (100%) rename {spring-core-3/src/main/java/com/baeldung/applicationcontext => spring-core/src/main/java/com/baeldung/springapplicationcontext}/ChildConfig.java (72%) rename {spring-core-3/src/main/java/com/baeldung/applicationcontext => spring-core/src/main/java/com/baeldung/springapplicationcontext}/Module1Config.java (70%) rename {spring-core-3/src/main/java/com/baeldung/applicationcontext => spring-core/src/main/java/com/baeldung/springapplicationcontext}/Module2Config.java (70%) rename {spring-core-3/src/main/java/com/baeldung/applicationcontext => spring-core/src/main/java/com/baeldung/springapplicationcontext}/ParentConfig.java (72%) rename {spring-core-3/src/test/java/com/baeldung/applicationcontext => spring-core/src/test/java/com/baeldung/springapplicationcontext}/TestClass1.java (90%) rename {spring-core-3/src/test/java/com/baeldung/applicationcontext => spring-core/src/test/java/com/baeldung/springapplicationcontext}/TestClass2.java (90%) create mode 100644 testing-modules/testing-libraries/src/main/java/com/baeldung/jacoco/Palindrome.java create mode 100644 testing-modules/testing-libraries/src/test/java/com/baeldung/jacoco/PalindromeUnitTest.java diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/configurationproperties/Database.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/Database.java similarity index 99% rename from spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/configurationproperties/Database.java rename to spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/Database.java index 990ede35cd..780251c2a3 100644 --- a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/configurationproperties/Database.java +++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/Database.java @@ -2,7 +2,6 @@ package com.baeldung.configurationproperties; import org.springframework.boot.context.properties.ConfigurationProperties; - @ConfigurationProperties(prefix = "database") public class Database { diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/configurationproperties/DatabaseConfig.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfig.java similarity index 100% rename from spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/configurationproperties/DatabaseConfig.java rename to spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfig.java diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/configurationproperties/DatabaseConfigPropertiesApp.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfigPropertiesApp.java similarity index 100% rename from spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/configurationproperties/DatabaseConfigPropertiesApp.java rename to spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DatabaseConfigPropertiesApp.java diff --git a/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/configurationproperties/DatabasePropertiesIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/DatabasePropertiesIntegrationTest.java similarity index 94% rename from spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/configurationproperties/DatabasePropertiesIntegrationTest.java rename to spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/DatabasePropertiesIntegrationTest.java index f8636aeeb2..f20debadf5 100644 --- a/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/configurationproperties/DatabasePropertiesIntegrationTest.java +++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/DatabasePropertiesIntegrationTest.java @@ -9,9 +9,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; -import com.baeldung.configurationproperties.Database; - - @RunWith(SpringRunner.class) @SpringBootTest(classes = DatabaseConfigPropertiesApp.class) @TestPropertySource("classpath:database-test.properties") diff --git a/spring-boot-modules/spring-boot-properties-2/src/test/resources/database-test.properties b/spring-boot-modules/spring-boot-properties/src/test/resources/database-test.properties similarity index 100% rename from spring-boot-modules/spring-boot-properties-2/src/test/resources/database-test.properties rename to spring-boot-modules/spring-boot-properties/src/test/resources/database-test.properties diff --git a/spring-core-3/src/main/java/com/baeldung/applicationcontext/ChildConfig.java b/spring-core/src/main/java/com/baeldung/springapplicationcontext/ChildConfig.java similarity index 72% rename from spring-core-3/src/main/java/com/baeldung/applicationcontext/ChildConfig.java rename to spring-core/src/main/java/com/baeldung/springapplicationcontext/ChildConfig.java index cc4970a6ec..15f03cb6b9 100644 --- a/spring-core-3/src/main/java/com/baeldung/applicationcontext/ChildConfig.java +++ b/spring-core/src/main/java/com/baeldung/springapplicationcontext/ChildConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.applicationcontext; +package com.baeldung.springapplicationcontext; import org.springframework.context.annotation.Configuration; diff --git a/spring-core-3/src/main/java/com/baeldung/applicationcontext/Module1Config.java b/spring-core/src/main/java/com/baeldung/springapplicationcontext/Module1Config.java similarity index 70% rename from spring-core-3/src/main/java/com/baeldung/applicationcontext/Module1Config.java rename to spring-core/src/main/java/com/baeldung/springapplicationcontext/Module1Config.java index 8f206a5a59..baea36dd0e 100644 --- a/spring-core-3/src/main/java/com/baeldung/applicationcontext/Module1Config.java +++ b/spring-core/src/main/java/com/baeldung/springapplicationcontext/Module1Config.java @@ -1,4 +1,4 @@ -package com.baeldung.applicationcontext; +package com.baeldung.springapplicationcontext; import org.springframework.context.annotation.Configuration; diff --git a/spring-core-3/src/main/java/com/baeldung/applicationcontext/Module2Config.java b/spring-core/src/main/java/com/baeldung/springapplicationcontext/Module2Config.java similarity index 70% rename from spring-core-3/src/main/java/com/baeldung/applicationcontext/Module2Config.java rename to spring-core/src/main/java/com/baeldung/springapplicationcontext/Module2Config.java index 7099b66118..9d8f53a6f1 100644 --- a/spring-core-3/src/main/java/com/baeldung/applicationcontext/Module2Config.java +++ b/spring-core/src/main/java/com/baeldung/springapplicationcontext/Module2Config.java @@ -1,4 +1,4 @@ -package com.baeldung.applicationcontext; +package com.baeldung.springapplicationcontext; import org.springframework.context.annotation.Configuration; diff --git a/spring-core-3/src/main/java/com/baeldung/applicationcontext/ParentConfig.java b/spring-core/src/main/java/com/baeldung/springapplicationcontext/ParentConfig.java similarity index 72% rename from spring-core-3/src/main/java/com/baeldung/applicationcontext/ParentConfig.java rename to spring-core/src/main/java/com/baeldung/springapplicationcontext/ParentConfig.java index c12c6e9407..e016eb6662 100644 --- a/spring-core-3/src/main/java/com/baeldung/applicationcontext/ParentConfig.java +++ b/spring-core/src/main/java/com/baeldung/springapplicationcontext/ParentConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.applicationcontext; +package com.baeldung.springapplicationcontext; import org.springframework.context.annotation.Configuration; diff --git a/spring-core-3/src/test/java/com/baeldung/applicationcontext/TestClass1.java b/spring-core/src/test/java/com/baeldung/springapplicationcontext/TestClass1.java similarity index 90% rename from spring-core-3/src/test/java/com/baeldung/applicationcontext/TestClass1.java rename to spring-core/src/test/java/com/baeldung/springapplicationcontext/TestClass1.java index 9a48928514..090eeffdc8 100644 --- a/spring-core-3/src/test/java/com/baeldung/applicationcontext/TestClass1.java +++ b/spring-core/src/test/java/com/baeldung/springapplicationcontext/TestClass1.java @@ -1,4 +1,4 @@ -package com.baeldung.applicationcontext; +package com.baeldung.springapplicationcontext; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-core-3/src/test/java/com/baeldung/applicationcontext/TestClass2.java b/spring-core/src/test/java/com/baeldung/springapplicationcontext/TestClass2.java similarity index 90% rename from spring-core-3/src/test/java/com/baeldung/applicationcontext/TestClass2.java rename to spring-core/src/test/java/com/baeldung/springapplicationcontext/TestClass2.java index a6e41a8ab3..0fff901435 100644 --- a/spring-core-3/src/test/java/com/baeldung/applicationcontext/TestClass2.java +++ b/spring-core/src/test/java/com/baeldung/springapplicationcontext/TestClass2.java @@ -1,4 +1,4 @@ -package com.baeldung.applicationcontext; +package com.baeldung.springapplicationcontext; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/testing-modules/testing-libraries/src/main/java/com/baeldung/jacoco/Palindrome.java b/testing-modules/testing-libraries/src/main/java/com/baeldung/jacoco/Palindrome.java new file mode 100644 index 0000000000..636dd27844 --- /dev/null +++ b/testing-modules/testing-libraries/src/main/java/com/baeldung/jacoco/Palindrome.java @@ -0,0 +1,15 @@ +package com.baeldung.jacoco; + +public class Palindrome { + + public boolean isPalindrome(String inputString) { + if (inputString.length() == 0) { + return true; + } else { + char firstChar = inputString.charAt(0); + char lastChar = inputString.charAt(inputString.length() - 1); + String mid = inputString.substring(1, inputString.length() - 1); + return (firstChar == lastChar) && isPalindrome(mid); + } + } +} diff --git a/testing-modules/testing-libraries/src/test/java/com/baeldung/jacoco/PalindromeUnitTest.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/jacoco/PalindromeUnitTest.java new file mode 100644 index 0000000000..cf64bcb5d1 --- /dev/null +++ b/testing-modules/testing-libraries/src/test/java/com/baeldung/jacoco/PalindromeUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.jacoco; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class PalindromeUnitTest { + @Test + public void whenEmptyString_thenAccept() { + Palindrome palindromeTester = new Palindrome(); + assertTrue(palindromeTester.isPalindrome("")); + } + + @Test + public void whenPalindrom_thenAccept() { + Palindrome palindromeTester = new Palindrome(); + assertTrue(palindromeTester.isPalindrome("noon")); + } + + @Test + public void whenNotPalindrom_thenReject(){ + Palindrome palindromeTester = new Palindrome(); + assertFalse(palindromeTester.isPalindrome("box")); + } + + @Test + public void whenNearPalindrom_thenReject(){ + Palindrome palindromeTester = new Palindrome(); + assertFalse(palindromeTester.isPalindrome("neon")); + } +}