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