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
+
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");
+ }
+ }
+}
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
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-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
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
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/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
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"));
+ }
+}