diff --git a/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/pom.xml b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/pom.xml index abd22ea50c..74a21068ee 100644 --- a/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/pom.xml +++ b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/pom.xml @@ -31,15 +31,21 @@ ${jackson-databind.version} - org.hibernate + org.hibernate.orm hibernate-core ${hibernate.version} - org.hibernate + org.hibernate.orm hibernate-hikaricp ${hibernate.version} + + com.zaxxer + HikariCP + ${hikari.cp.version} + + org.postgresql postgresql @@ -70,11 +76,12 @@ 11 11 - 5.4.21.Final + 6.4.2.Final 1.2.0 3.1.0 2.11.2 42.2.16 + 5.1.0 \ No newline at end of file diff --git a/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java index 95fd058667..464dbc7bff 100644 --- a/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java +++ b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/App.java @@ -83,7 +83,7 @@ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); } private static SessionFactory createSessionFactory() { - Map settings = new HashMap<>(); + Map settings = new HashMap<>(); settings.put(URL, System.getenv("DB_URL")); settings.put(DIALECT, "org.hibernate.dialect.PostgreSQLDialect"); settings.put(DEFAULT_SCHEMA, "shipping"); diff --git a/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java index 93e6404749..a7fa6a78a0 100644 --- a/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java +++ b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Checkin.java @@ -1,7 +1,7 @@ package com.baeldung.lambda.shipping; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; @Embeddable public class Checkin { diff --git a/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java index 1a2371b37f..86806d22cc 100644 --- a/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java +++ b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Consignment.java @@ -1,10 +1,10 @@ package com.baeldung.lambda.shipping; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.ArrayList; import java.util.List; -import static javax.persistence.FetchType.EAGER; +import static jakarta.persistence.FetchType.EAGER; @Entity(name = "consignment") @Table(name = "consignment") diff --git a/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java index de6194e180..d59ab5ba5e 100644 --- a/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java +++ b/aws-modules/aws-lambda-modules/shipping-tracker-lambda/ShippingFunction/src/main/java/com/baeldung/lambda/shipping/Item.java @@ -1,7 +1,7 @@ package com.baeldung.lambda.shipping; -import javax.persistence.Column; -import javax.persistence.Embeddable; +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; @Embeddable public class Item { diff --git a/core-java-modules/core-java-19/src/main/java/com/baeldung/vectors/VectorAPIExamples.java b/core-java-modules/core-java-19/src/main/java/com/baeldung/vectors/VectorAPIExamples.java index eda36dbfde..37468fbdbd 100644 --- a/core-java-modules/core-java-19/src/main/java/com/baeldung/vectors/VectorAPIExamples.java +++ b/core-java-modules/core-java-19/src/main/java/com/baeldung/vectors/VectorAPIExamples.java @@ -63,7 +63,7 @@ public class VectorAPIExamples { public float[] scalarNormOfTwoArrays(float[] arr1, float[] arr2) { float[] finalResult = new float[arr1.length]; for (int i = 0; i < arr1.length; i++) { - finalResult[i] = (arr1[i] * arr1[i] + arr2[i] * arr2[i]) * -1.0f; + finalResult[i] = (float) Math.sqrt(arr1[i] * arr1[i] + arr2[i] * arr2[i]); } return finalResult; } @@ -77,13 +77,13 @@ public class VectorAPIExamples { var vb = FloatVector.fromArray(PREFERRED_SPECIES, arr2, i); var vc = va.mul(va) .add(vb.mul(vb)) - .neg(); + .sqrt(); vc.intoArray(finalResult, i); } // tail cleanup for (; i < arr1.length; i++) { - finalResult[i] = (arr1[i] * arr1[i] + arr2[i] * arr2[i]) * -1.0f; + finalResult[i] = (float) Math.sqrt(arr1[i] * arr1[i] + arr2[i] * arr2[i]); } return finalResult; } diff --git a/core-java-modules/core-java-19/src/test/java/com/baeldung/vectors/VectorAPIUnitTest.java b/core-java-modules/core-java-19/src/test/java/com/baeldung/vectors/VectorAPIUnitTest.java index 22b37a2b28..97e77a474f 100644 --- a/core-java-modules/core-java-19/src/test/java/com/baeldung/vectors/VectorAPIUnitTest.java +++ b/core-java-modules/core-java-19/src/test/java/com/baeldung/vectors/VectorAPIUnitTest.java @@ -28,7 +28,7 @@ public class VectorAPIUnitTest { public void whenTwoValuesProvided_thenComputeScalarNorm() { float[] arr1 = { 1, 2.3f }; float[] arr2 = { 1.3f, 2.0f }; - float[] result = { -2.6899998f, -9.29f }; + float[] result = { 1.6401219f, 3.047950f }; Assertions.assertArrayEquals(result, vector.scalarNormOfTwoArrays(arr1, arr2)); } @@ -36,7 +36,7 @@ public class VectorAPIUnitTest { public void whenTwoValuesProvided_thenComputeVectorNorm() { float[] arr1 = { 1, 2.3f }; float[] arr2 = { 1.3f, 2.0f }; - float[] result = { -2.6899998f, -9.29f }; + float[] result = { 1.6401219f, 3.047950f }; Assertions.assertArrayEquals(result, vector.vectorNormalForm(arr1, arr2)); } diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/entrysettolinkedhashmap/EntrySetToLinkedHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/entrysettolinkedhashmap/EntrySetToLinkedHashMapUnitTest.java new file mode 100644 index 0000000000..aa8398893e --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/entrysettolinkedhashmap/EntrySetToLinkedHashMapUnitTest.java @@ -0,0 +1,111 @@ +package com.baeldung.map.entrysettolinkedhashmap; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.entry; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class EntrySetToLinkedHashMapUnitTest { + + private Map map; + + @Test + void givenMap_whenUsingCollectorsGroupingBy_thenCollectToLinkedHashMap() { + Map> countryToCities = Map.of("Paris", "France", "Nice", "France", "Madrid", "Spain") + .entrySet() + .stream() + .collect(Collectors.groupingBy(Map.Entry::getValue, LinkedHashMap::new, Collectors.mapping(Map.Entry::getKey, Collectors.toSet()))); + + assertThat(countryToCities).isExactlyInstanceOf(LinkedHashMap.class) + .containsOnly(entry("France", Set.of("Paris", "Nice")), entry("Spain", Set.of("Madrid"))); + } + + @Test + void givenMap_whenUsingCollectorsToMap_thenCollectAndConvertToLinkedHashMap() { + Map result = new LinkedHashMap<>(map.entrySet() + .stream() + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); + + assertThat(result).isExactlyInstanceOf(LinkedHashMap.class) + .containsOnly(entry(1, "value 1"), entry(2, "value 2")); + } + + @Test + void givenMap_whenUsingCollectorsToMap_thenCollectToLinkedHashMap() { + Map result = map.entrySet() + .stream() + .collect(Collectors.toMap( + Map.Entry::getKey, Map.Entry::getValue, + (e1, e2) -> { + throw new RuntimeException(); + }, + LinkedHashMap::new)); + + assertThat(result).isExactlyInstanceOf(LinkedHashMap.class) + .containsOnly(entry(1, "value 1"), entry(2, "value 2")); + } + + @Test + void givenMap_whenUsingLinkedHashMapConstructor_thenObtainLinkedHashMap() { + Map result = new LinkedHashMap<>(map); + + assertThat(result).isExactlyInstanceOf(LinkedHashMap.class) + .containsOnly(entry(1, "value 1"), entry(2, "value 2")); + } + + @Test + void givenMap_whenUsingPutWithForLoop_thenInsertIntoLinkedHashMap() { + Map result = new LinkedHashMap<>(); + + for (Map.Entry entry : map.entrySet()) { + result.put(entry.getKey(), entry.getValue()); + } + + assertThat(result).isExactlyInstanceOf(LinkedHashMap.class) + .containsOnly(entry(1, "value 1"), entry(2, "value 2")); + } + + @Test + void givenMap_whenUsingPutWithMapForEach_thenInsertIntoLinkedHashMap() { + Map result = new LinkedHashMap<>(); + + map.forEach((k, v) -> result.put(k, v)); + + assertThat(result).isExactlyInstanceOf(LinkedHashMap.class) + .containsOnly(entry(1, "value 1"), entry(2, "value 2")); + } + + @Test + void givenMap_whenUsingPutWithSetForEach_thenInsertIntoLinkedHashMap() { + Map result = new LinkedHashMap<>(); + + map.entrySet() + .forEach(entry -> result.put(entry.getKey(), entry.getValue())); + + assertThat(result).isExactlyInstanceOf(LinkedHashMap.class) + .containsOnly(entry(1, "value 1"), entry(2, "value 2")); + } + + @Test + void givenMap_whenUsingPutWithStreamForEach_thenInsertIntoLinkedHashMapp() { + Map result = new LinkedHashMap<>(); + + map.entrySet() + .stream() + .forEach(entry -> result.put(entry.getKey(), entry.getValue())); + + assertThat(result).isExactlyInstanceOf(LinkedHashMap.class) + .containsOnly(entry(1, "value 1"), entry(2, "value 2")); + } + + @BeforeEach + void init() { + map = Map.of(1, "value 1", 2, "value 2"); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-console/README.md b/core-java-modules/core-java-console/README.md index cab2cc24be..d6ec953f48 100644 --- a/core-java-modules/core-java-console/README.md +++ b/core-java-modules/core-java-console/README.md @@ -9,3 +9,4 @@ - [How to Log to the Console in Color](https://www.baeldung.com/java-log-console-in-color) - [Create Table Using ASCII in a Console in Java](https://www.baeldung.com/java-console-ascii-make-table) - [Printing Message on Console without Using main() Method in Java](https://www.baeldung.com/java-no-main-print-message-console) +- [Guide to System.in.read()](https://www.baeldung.com/java-system-in-read) diff --git a/core-java-modules/core-java-console/src/main/java/com/baeldung/systemin/SystemInRead.java b/core-java-modules/core-java-console/src/main/java/com/baeldung/systemin/SystemInRead.java new file mode 100644 index 0000000000..e815cdae2f --- /dev/null +++ b/core-java-modules/core-java-console/src/main/java/com/baeldung/systemin/SystemInRead.java @@ -0,0 +1,45 @@ +package com.baeldung.systemin; + +import java.io.IOException; + +class SystemInRead { + static void readSingleCharacter() { + System.out.println("Enter a character:"); + try { + int input = System.in.read(); + System.out.println((char) input); + } + catch (IOException e) { + System.err.println("Error reading input: " + e.getMessage()); + } + } + static void readMultipleCharacters() { + System.out.println("Enter characters (Press 'Enter' to quit):"); + try { + int input; + while ((input = System.in.read()) != '\n') { + System.out.print((char) input); + } + } catch (IOException e) { + System.err.println("Error reading input: " + e.getMessage()); + } + } + + static void readWithParameters() { + try { + byte[] byteArray = new byte[5]; + int bytesRead; + int totalBytesRead = 0; + + while ((bytesRead = System.in.read(byteArray, 0, byteArray.length)) != -1) { + System.out.print("Data read: " + new String(byteArray, 0, bytesRead)); + totalBytesRead += bytesRead; + } + + System.out.println("\nBytes Read: " + totalBytesRead); + + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/core-java-modules/core-java-console/src/test/java/com/baeldung/systemin/SystemInReadUnitTest.java b/core-java-modules/core-java-console/src/test/java/com/baeldung/systemin/SystemInReadUnitTest.java new file mode 100644 index 0000000000..60ed99ca3a --- /dev/null +++ b/core-java-modules/core-java-console/src/test/java/com/baeldung/systemin/SystemInReadUnitTest.java @@ -0,0 +1,41 @@ +package com.baeldung.systemin; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import org.junit.jupiter.api.Test; + +public class SystemInReadUnitTest { + @Test + void givenUserInput_whenUsingReadMultipleCharacters_thenRead() { + System.setIn(new ByteArrayInputStream("Hello\n".getBytes())); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + SystemInRead.readMultipleCharacters(); + + assertEquals("Enter characters (Press 'Enter' to quit):\n" + "Hello", outputStream.toString().trim()); + } + + @Test + void givenUserInput_whenUsingReadSingleCharacter_thenRead() { + System.setIn(new ByteArrayInputStream("A".getBytes())); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + SystemInRead.readSingleCharacter(); + + assertEquals("Enter a character:\nA", outputStream.toString().trim()); + } + + @Test + void givenUserInput_whenUsingReadWithParameters_thenRead() { + System.setIn(new ByteArrayInputStream("ABC".getBytes())); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + SystemInRead.readWithParameters(); + + assertEquals("Data read: ABC\n" + "Bytes Read: 3", outputStream.toString().trim()); + } +} diff --git a/core-java-modules/core-java-string-operations-8/README.md b/core-java-modules/core-java-string-operations-8/README.md new file mode 100644 index 0000000000..2dce44d217 --- /dev/null +++ b/core-java-modules/core-java-string-operations-8/README.md @@ -0,0 +1,2 @@ + +### Relevant Articles: diff --git a/core-java-modules/core-java-string-operations-8/pom.xml b/core-java-modules/core-java-string-operations-8/pom.xml new file mode 100644 index 0000000000..2495abccf8 --- /dev/null +++ b/core-java-modules/core-java-string-operations-8/pom.xml @@ -0,0 +1,72 @@ + + + 4.0.0 + core-java-string-operations-8 + core-java-string-operations-8 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + org.apache.commons + commons-lang3 + ${apache.commons.lang3.version} + + + org.apache.commons + commons-text + ${commons-text.version} + + + org.liquibase + liquibase-core + 4.9.1 + test + + + org.junit.jupiter + junit-jupiter + 5.8.1 + test + + + org.liquibase + liquibase-core + 4.9.1 + test + + + junit + junit + 4.13.2 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + + 11 + 11 + 3.13.0 + 1.10.0 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-string-operations-8/src/test/java/com/baeldung/emailandphonemasking/EmailAndPhoneMaskingUnitTest.java b/core-java-modules/core-java-string-operations-8/src/test/java/com/baeldung/emailandphonemasking/EmailAndPhoneMaskingUnitTest.java new file mode 100644 index 0000000000..e390c2d2cd --- /dev/null +++ b/core-java-modules/core-java-string-operations-8/src/test/java/com/baeldung/emailandphonemasking/EmailAndPhoneMaskingUnitTest.java @@ -0,0 +1,53 @@ +package com.baeldung.emailandphonemasking; + +import org.junit.jupiter.api.Test; + +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class EmailAndPhoneMaskingUnitTest { + + + String phoneNumber = "+12344567890"; + String expectedMaskedPhoneNumber = "+*******7890"; + String email = "testemailaddress@example.com"; + String expectedMaskedEmail = "te**************@example.com"; + + @Test + public void givenEmailAddress_whenUsingStringManipulation_thenMaskEmail() { + int atIndex = email.indexOf('@'); + String repeatedString = IntStream.range(0, atIndex - 2).mapToObj(i -> "*").collect(Collectors.joining()); + String maskedPart = email.substring(0, atIndex - repeatedString.length()) + repeatedString; + String maskedEmail = maskedPart + email.substring(atIndex); + assertEquals(expectedMaskedEmail, maskedEmail); + } + + @Test + public void givenEmailAddress_whenUsingRegex_thenMaskEmail() { + int atIndex = email.indexOf('@'); + String regex = "(.{2})(.*)(@.*)"; + String repeatedAsterisks = "*".repeat(atIndex - 2); + String maskedEmail = email.replaceAll(regex, "$1" + repeatedAsterisks + "$3"); + assertEquals(expectedMaskedEmail, maskedEmail); + } + + + @Test + public void givenPhoneNumber_whenUsingStringManipulation_thenMaskPhone() { + String maskedPhoneNumber = phoneNumber.replaceAll("\\d(?=\\d{4})", "*"); + assertEquals(expectedMaskedPhoneNumber, maskedPhoneNumber); + } + + @Test + public void givenPhoneNumber_whenUsingRegex_thenMaskPhone() { + int lastDigitsIndex = phoneNumber.length() - 5; + String regex = "(\\+)(\\d+)(\\d{4})"; + String repeatedAsterisks = "*".repeat(Math.max(0, lastDigitsIndex)); + String maskedPhoneNumber = phoneNumber.replaceAll(regex, "$1" + repeatedAsterisks + "$3"); + assertEquals(expectedMaskedPhoneNumber, maskedPhoneNumber); + } + + +} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 227da74156..3d26d51a6a 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -33,6 +33,7 @@ + core-java-numbers-conversions core-java-9-improvements @@ -199,6 +200,7 @@ core-java-string-operations-2 core-java-string-operations-6 core-java-string-operations-7 + core-java-string-operations-8 core-java-regex core-java-regex-2 core-java-regex-3 diff --git a/json-modules/json-conversion/src/main/java/com/baeldung/preventexpressingintasfloat/Main.java b/json-modules/json-conversion/src/main/java/com/baeldung/preventexpressingintasfloat/Main.java new file mode 100644 index 0000000000..c0f14fa73d --- /dev/null +++ b/json-modules/json-conversion/src/main/java/com/baeldung/preventexpressingintasfloat/Main.java @@ -0,0 +1,22 @@ +package com.baeldung.preventexpressingintasfloat; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Hashtable; + +public class Main { + public static String draft = "[{\"id\":4077395,\"field_id\":242566,\"body\":\"\"}, " + + "{\"id\":4077398,\"field_id\":242569,\"body\":[[273019,0],[273020,1],[273021,0]]}, " + + "{\"id\":4077399,\"field_id\":242570,\"body\":[[273022,0],[273023,1],[273024,0]]}]"; + + public static void main(String[] args) { + ArrayList> responses; + Type ResponseList = new TypeToken>>() { + }.getType(); + responses = new Gson().fromJson(draft, ResponseList); + System.out.println(responses); + } +} \ No newline at end of file diff --git a/json-modules/json-conversion/src/test/java/com/baeldung/preventexpressingintasfloat/PreventExpressingIntAsFloatUnitTest.java b/json-modules/json-conversion/src/test/java/com/baeldung/preventexpressingintasfloat/PreventExpressingIntAsFloatUnitTest.java new file mode 100644 index 0000000000..6ada093ab3 --- /dev/null +++ b/json-modules/json-conversion/src/test/java/com/baeldung/preventexpressingintasfloat/PreventExpressingIntAsFloatUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.preventexpressingintasfloat; + +import com.google.gson.*; +import com.google.gson.reflect.TypeToken; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Hashtable; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class PreventExpressingIntAsFloatUnitTest { + + public String jsonString = "[{\"id\":4077395,\"field_id\":242566,\"body\":\"\"}, " + + "{\"id\":4077398,\"field_id\":242569,\"body\":[[273019,0],[273020,1],[273021,0]]}, " + + "{\"id\":4077399,\"field_id\":242570,\"body\":[[273022,0],[273023,1],[273024,0]]}]"; + + public String expectedOutput = "[{body=, field_id=242566, id=4077395}, " + + "{body=[[273019, 0], [273020, 1], [273021, 0]], field_id=242569, id=4077398}, " + + "{body=[[273022, 0], [273023, 1], [273024, 0]], field_id=242570, id=4077399}]"; + + @Test + public void givenJsonString_whenUsingsetObjectToNumberStrategyMethod_thenValidateOutput() { + Gson gson = new GsonBuilder().setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE).create(); + ArrayList> responses = gson.fromJson(jsonString, new TypeToken>>() { + }.getType()); + + assertEquals(expectedOutput, responses.toString()); + } +} diff --git a/patterns-modules/design-patterns-architectural/pom.xml b/patterns-modules/design-patterns-architectural/pom.xml index 20f320f073..ec7dae42b3 100644 --- a/patterns-modules/design-patterns-architectural/pom.xml +++ b/patterns-modules/design-patterns-architectural/pom.xml @@ -31,7 +31,7 @@ ${rest-assured.version} - org.hibernate + org.hibernate.orm hibernate-core ${hibernate-core.version} @@ -64,7 +64,7 @@ - 5.2.16.Final + 6.4.2.Final 8.2.0 2.7.5 5.3.0 diff --git a/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/application/UserApplication.java b/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/application/UserApplication.java index 3a5c049992..a39a16edf7 100644 --- a/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/application/UserApplication.java +++ b/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/application/UserApplication.java @@ -6,8 +6,8 @@ import com.baeldung.daopattern.daos.JpaUserDao; import com.baeldung.daopattern.entities.User; import java.util.List; import java.util.Optional; -import javax.persistence.EntityManager; -import javax.persistence.Persistence; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Persistence; public class UserApplication { diff --git a/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/config/JpaEntityManagerFactory.java b/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/config/JpaEntityManagerFactory.java index 11718d5612..d7ce1c8df0 100644 --- a/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/config/JpaEntityManagerFactory.java +++ b/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/config/JpaEntityManagerFactory.java @@ -8,10 +8,10 @@ import java.util.List; import java.util.Map; import java.util.Properties; import java.util.stream.Collectors; -import javax.persistence.EntityManager; +import jakarta.persistence.EntityManager; import javax.sql.DataSource; -import javax.persistence.EntityManagerFactory; -import javax.persistence.spi.PersistenceUnitInfo; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.spi.PersistenceUnitInfo; import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl; import org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor; diff --git a/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/config/PersistenceUnitInfoImpl.java b/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/config/PersistenceUnitInfoImpl.java index f3277da0cf..f75b1424c1 100644 --- a/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/config/PersistenceUnitInfoImpl.java +++ b/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/config/PersistenceUnitInfoImpl.java @@ -6,11 +6,11 @@ import java.util.Collections; import java.util.List; import java.util.Properties; import javax.sql.DataSource; -import javax.persistence.SharedCacheMode; -import javax.persistence.ValidationMode; -import javax.persistence.spi.ClassTransformer; -import javax.persistence.spi.PersistenceUnitInfo; -import javax.persistence.spi.PersistenceUnitTransactionType; +import jakarta.persistence.SharedCacheMode; +import jakarta.persistence.ValidationMode; +import jakarta.persistence.spi.ClassTransformer; +import jakarta.persistence.spi.PersistenceUnitInfo; +import jakarta.persistence.spi.PersistenceUnitTransactionType; import org.hibernate.jpa.HibernatePersistenceProvider; public class PersistenceUnitInfoImpl implements PersistenceUnitInfo { diff --git a/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/daos/JpaUserDao.java b/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/daos/JpaUserDao.java index f4d80c0ee9..e48c0f3906 100644 --- a/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/daos/JpaUserDao.java +++ b/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/daos/JpaUserDao.java @@ -5,9 +5,9 @@ import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.function.Consumer; -import javax.persistence.EntityManager; -import javax.persistence.EntityTransaction; -import javax.persistence.Query; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityTransaction; +import jakarta.persistence.Query; public class JpaUserDao implements Dao { diff --git a/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/entities/User.java b/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/entities/User.java index 58d8ffb28b..5c4176a275 100644 --- a/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/entities/User.java +++ b/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/daopattern/entities/User.java @@ -1,10 +1,10 @@ package com.baeldung.daopattern.entities; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "users") diff --git a/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/repositoryvsdaopattern/UserDaoImpl.java b/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/repositoryvsdaopattern/UserDaoImpl.java index 24ca04263b..212dd8714a 100644 --- a/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/repositoryvsdaopattern/UserDaoImpl.java +++ b/patterns-modules/design-patterns-architectural/src/main/java/com/baeldung/repositoryvsdaopattern/UserDaoImpl.java @@ -1,6 +1,6 @@ package com.baeldung.repositoryvsdaopattern; -import javax.persistence.EntityManager; +import jakarta.persistence.EntityManager; public class UserDaoImpl implements UserDao { diff --git a/pom.xml b/pom.xml index fe201fee89..dc2156faf8 100644 --- a/pom.xml +++ b/pom.xml @@ -822,7 +822,7 @@ spring-actuator spring-ai spring-aop-2 - + spring-aop spring-batch-2 spring-batch spring-boot-modules @@ -1063,7 +1063,7 @@ spring-actuator spring-ai spring-aop-2 - + spring-aop spring-batch-2 spring-batch spring-boot-modules diff --git a/spring-aop/pom.xml b/spring-aop/pom.xml index 8ff5f20126..2805ec0d45 100644 --- a/spring-aop/pom.xml +++ b/spring-aop/pom.xml @@ -86,6 +86,7 @@ 1.14.0 + 16 \ No newline at end of file diff --git a/spring-aop/src/test/java/com/baeldung/joinpoint/JoinPointAroundCacheAspectIntegrationTest.java b/spring-aop/src/test/java/com/baeldung/joinpoint/JoinPointAroundCacheAspectIntegrationTest.java index 4bd8f2ad8e..750f036fdf 100644 --- a/spring-aop/src/test/java/com/baeldung/joinpoint/JoinPointAroundCacheAspectIntegrationTest.java +++ b/spring-aop/src/test/java/com/baeldung/joinpoint/JoinPointAroundCacheAspectIntegrationTest.java @@ -1,5 +1,6 @@ package com.baeldung.joinpoint; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -21,6 +22,10 @@ public class JoinPointAroundCacheAspectIntegrationTest { @Autowired private ArticleService articleService; + @Before + public void removeCache() { + JoinPointAroundCacheAspect.CACHE.clear(); + } @Test public void shouldPopulateCache() { assertTrue(JoinPointAroundCacheAspect.CACHE.isEmpty()); diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml index 57b7bae761..3f3b40b040 100644 --- a/spring-security-modules/pom.xml +++ b/spring-security-modules/pom.xml @@ -27,7 +27,7 @@ spring-security-oauth2-sso spring-security-oidc spring-security-okta - spring-security-saml + spring-security-social-login spring-security-web-angular spring-security-web-boot-1 diff --git a/spring-security-modules/spring-security-opa/README.md b/spring-security-modules/spring-security-opa/README.md index d2c1652edb..fc50304073 100644 --- a/spring-security-modules/spring-security-opa/README.md +++ b/spring-security-modules/spring-security-opa/README.md @@ -1,3 +1,4 @@ +Note: For integration testing get the OPA server running first. Check the official [OPA documentation](https://www.openpolicyagent.org/docs/latest/) for instructions on how to run the OPA server. ### Relevant Articles: diff --git a/spring-security-modules/spring-security-opa/pom.xml b/spring-security-modules/spring-security-opa/pom.xml index 81c4709124..05d135947b 100644 --- a/spring-security-modules/spring-security-opa/pom.xml +++ b/spring-security-modules/spring-security-opa/pom.xml @@ -1,14 +1,15 @@ - + 4.0.0 spring-security-opa Spring Security with OPA authorization com.baeldung - spring-security-modules + parent-boot-3 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -28,7 +29,7 @@ com.google.guava guava - 31.0.1-jre + ${guava.version} org.springframework.boot diff --git a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/Application.java b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/Application.java index 789a1f803f..a698630f3b 100644 --- a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/Application.java +++ b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/Application.java @@ -5,7 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { - + public static void main(String[] args) { SpringApplication.run(Application.class, args); } diff --git a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/OpaConfiguration.java b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/OpaConfiguration.java index e24fdbcf35..2a96bef606 100644 --- a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/OpaConfiguration.java +++ b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/OpaConfiguration.java @@ -11,15 +11,14 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @EnableConfigurationProperties(OpaProperties.class) public class OpaConfiguration { - + private final OpaProperties opaProperties; - + @Bean public WebClient opaWebClient(WebClient.Builder builder) { - - return builder - .baseUrl(opaProperties.getEndpoint()) - .build(); + + return builder.baseUrl(opaProperties.getEndpoint()) + .build(); } } diff --git a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/OpaProperties.java b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/OpaProperties.java index acc23a2fd2..0a12f4d772 100644 --- a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/OpaProperties.java +++ b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/OpaProperties.java @@ -1,14 +1,14 @@ package com.baeldung.security.opa.config; -import javax.annotation.Nonnull; - import org.springframework.boot.context.properties.ConfigurationProperties; +import jakarta.annotation.Nonnull; import lombok.Data; @ConfigurationProperties(prefix = "opa") @Data public class OpaProperties { + @Nonnull private String endpoint = "http://localhost:8181"; } diff --git a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/SecurityConfiguration.java b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/SecurityConfiguration.java index 7e10cb2e8a..98de220e21 100644 --- a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/SecurityConfiguration.java +++ b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/config/SecurityConfiguration.java @@ -1,8 +1,6 @@ package com.baeldung.security.opa.config; -import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; @@ -11,17 +9,16 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; -import org.springframework.http.client.reactive.ClientHttpRequest; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.authorization.AuthorizationDecision; import org.springframework.security.authorization.ReactiveAuthorizationManager; +import org.springframework.security.config.Customizer; import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.web.server.SecurityWebFilterChain; import org.springframework.security.web.server.authorization.AuthorizationContext; -import org.springframework.web.reactive.function.BodyInserter; -import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.reactive.function.client.WebClient; @@ -32,79 +29,65 @@ import reactor.core.publisher.Mono; @Configuration public class SecurityConfiguration { - - + @Bean - public SecurityWebFilterChain accountAuthorization(ServerHttpSecurity http, @Qualifier("opaWebClient")WebClient opaWebClient) { - - // @formatter:on - return http - .httpBasic() - .and() - .authorizeExchange(exchanges -> { - exchanges - .pathMatchers("/account/*") - .access(opaAuthManager(opaWebClient)); - }) - .build(); - // @formatter:on - + public SecurityWebFilterChain accountAuthorization(ServerHttpSecurity http, @Qualifier("opaWebClient") WebClient opaWebClient) { + return http.httpBasic(Customizer.withDefaults()) + .authorizeExchange(exchanges -> exchanges.pathMatchers("/account/*") + .access(opaAuthManager(opaWebClient))) + .build(); } @Bean public ReactiveAuthorizationManager opaAuthManager(WebClient opaWebClient) { - - return (auth, context) -> { - return opaWebClient.post() - .accept(MediaType.APPLICATION_JSON) - .contentType(MediaType.APPLICATION_JSON) - .body(toAuthorizationPayload(auth,context), Map.class) - .exchangeToMono(this::toDecision); - }; + return (auth, context) -> opaWebClient.post() + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .body(toAuthorizationPayload(auth, context), Map.class) + .exchangeToMono(this::toDecision); } private Mono toDecision(ClientResponse response) { - - if ( !response.statusCode().is2xxSuccessful()) { + if (!response.statusCode() + .is2xxSuccessful()) { return Mono.just(new AuthorizationDecision(false)); } - - return response - .bodyToMono(ObjectNode.class) - .map(node -> { - boolean authorized = node.path("result").path("authorized").asBoolean(false); - return new AuthorizationDecision(authorized); - }); - + + return response.bodyToMono(ObjectNode.class) + .map(node -> { + boolean authorized = node.path("result") + .path("authorized") + .asBoolean(false); + return new AuthorizationDecision(authorized); + }); + } - private Publisher> toAuthorizationPayload(Mono auth, AuthorizationContext context) { - // @formatter:off - return auth - .defaultIfEmpty(new AnonymousAuthenticationToken("**ANONYMOUS**", new Object(), Arrays.asList(new SimpleGrantedAuthority("ANONYMOUS")))) - .map( a -> { - - Map headers = context.getExchange().getRequest() - .getHeaders() - .toSingleValueMap(); - - Map attributes = ImmutableMap.builder() - .put("principal",a.getName()) - .put("authorities", - a.getAuthorities() - .stream() - .map(g -> g.getAuthority()) - .collect(Collectors.toList())) - .put("uri", context.getExchange().getRequest().getURI().getPath()) - .put("headers",headers) - .build(); - - Map input = ImmutableMap.builder() - .put("input",attributes) - .build(); - - return input; - }); - // @formatter:on + private Publisher> toAuthorizationPayload(Mono auth, AuthorizationContext context) { + return auth.defaultIfEmpty( + new AnonymousAuthenticationToken("**ANONYMOUS**", new Object(), Collections.singletonList(new SimpleGrantedAuthority("ANONYMOUS")))) + .map(a -> { + Map headers = context.getExchange() + .getRequest() + .getHeaders() + .toSingleValueMap(); + + Map attributes = ImmutableMap. builder() + .put("principal", a.getName()) + .put("authorities", a.getAuthorities() + .stream() + .map(GrantedAuthority::getAuthority) + .collect(Collectors.toList())) + .put("uri", context.getExchange() + .getRequest() + .getURI() + .getPath()) + .put("headers", headers) + .build(); + + return ImmutableMap. builder() + .put("input", attributes) + .build(); + }); } } diff --git a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/controller/AccountController.java b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/controller/AccountController.java index ba0ff61554..cc8f62454a 100644 --- a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/controller/AccountController.java +++ b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/controller/AccountController.java @@ -13,9 +13,9 @@ import reactor.core.publisher.Mono; @RestController @RequiredArgsConstructor public class AccountController { - + private final AccountService accountService; - + @GetMapping("/account/{accountId}") public Mono getAccount(@PathVariable("accountId") String accountId) { return accountService.findByAccountId(accountId); diff --git a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/domain/Account.java b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/domain/Account.java index db494627a8..c757c742c5 100644 --- a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/domain/Account.java +++ b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/domain/Account.java @@ -6,20 +6,17 @@ import lombok.Data; @Data public class Account { - + private String id; private BigDecimal balance; private String currency; - - + public static Account of(String id, BigDecimal balance, String currency) { - Account acc = new Account(); - acc.setId(id); - acc.setBalance(balance); - acc.setCurrency(currency); - - return acc; + Account account = new Account(); + account.setId(id); + account.setBalance(balance); + account.setCurrency(currency); + return account; } - } diff --git a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/service/AccountService.java b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/service/AccountService.java index 18968019f9..e98f120fa1 100644 --- a/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/service/AccountService.java +++ b/spring-security-modules/spring-security-opa/src/main/java/com/baeldung/security/opa/service/AccountService.java @@ -1,6 +1,3 @@ -/** - * - */ package com.baeldung.security.opa.service; import java.math.BigDecimal; @@ -13,25 +10,20 @@ import com.google.common.collect.ImmutableMap; import reactor.core.publisher.Mono; -/** - * @author Philippe - * - */ @Service public class AccountService { - - private Map accounts = ImmutableMap.builder() - .put("0001", Account.of("0001", BigDecimal.valueOf(100.00), "USD")) - .put("0002", Account.of("0002", BigDecimal.valueOf(101.00), "EUR")) - .put("0003", Account.of("0003", BigDecimal.valueOf(102.00), "BRL")) - .put("0004", Account.of("0004", BigDecimal.valueOf(103.00), "AUD")) - .put("0005", Account.of("0005", BigDecimal.valueOf(10400.00), "JPY")) - .build(); - - + + private Map accounts = ImmutableMap. builder() + .put("0001", Account.of("0001", BigDecimal.valueOf(100.00), "USD")) + .put("0002", Account.of("0002", BigDecimal.valueOf(101.00), "EUR")) + .put("0003", Account.of("0003", BigDecimal.valueOf(102.00), "BRL")) + .put("0004", Account.of("0004", BigDecimal.valueOf(103.00), "AUD")) + .put("0005", Account.of("0005", BigDecimal.valueOf(10400.00), "JPY")) + .build(); + public Mono findByAccountId(String accountId) { return Mono.just(accounts.get(accountId)) - .switchIfEmpty(Mono.error(new IllegalArgumentException("invalid.account"))); + .switchIfEmpty(Mono.error(new IllegalArgumentException("invalid.account"))); } } diff --git a/spring-security-modules/spring-security-opa/src/test/java/com/baeldung/security/opa/controller/AccountControllerLiveTest.java b/spring-security-modules/spring-security-opa/src/test/java/com/baeldung/security/opa/controller/AccountControllerLiveTest.java index 7469fd327c..2b18b04c70 100644 --- a/spring-security-modules/spring-security-opa/src/test/java/com/baeldung/security/opa/controller/AccountControllerLiveTest.java +++ b/spring-security-modules/spring-security-opa/src/test/java/com/baeldung/security/opa/controller/AccountControllerLiveTest.java @@ -12,7 +12,6 @@ import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.reactive.server.WebTestClient; -// !!! NOTICE: Start OPA server before running this test class !!! @SpringBootTest @ActiveProfiles("test") class AccountControllerLiveTest { @@ -24,44 +23,42 @@ class AccountControllerLiveTest { @BeforeEach public void setup() { this.rest = WebTestClient.bindToApplicationContext(this.context) - .apply(springSecurity()) - .configureClient() - .build(); + .apply(springSecurity()) + .configureClient() + .build(); } - @Test - @WithMockUser(username = "user1", roles = { "account:read:0001"} ) + @WithMockUser(username = "user1", roles = { "account:read:0001" }) void testGivenValidUser_thenSuccess() { rest.get() - .uri("/account/0001") - .accept(MediaType.APPLICATION_JSON) - .exchange() - .expectStatus() - .is2xxSuccessful(); + .uri("/account/0001") + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectStatus() + .is2xxSuccessful(); } @Test - @WithMockUser(username = "user1", roles = { "account:read:0002"} ) + @WithMockUser(username = "user1", roles = { "account:read:0002" }) void testGivenValidUser_thenUnauthorized() { rest.get() - .uri("/account/0001") - .accept(MediaType.APPLICATION_JSON) - .exchange() - .expectStatus() - .isForbidden(); + .uri("/account/0001") + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectStatus() + .isForbidden(); } - + @Test - @WithMockUser(username = "user1", roles = {} ) + @WithMockUser(username = "user1", roles = {}) void testGivenNoAuthorities_thenForbidden() { rest.get() - .uri("/account/0001") - .accept(MediaType.APPLICATION_JSON) - .exchange() - .expectStatus() - .isForbidden(); + .uri("/account/0001") + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectStatus() + .isForbidden(); } - - + } diff --git a/spring-security-modules/spring-security-saml2/src/main/java/com/baeldung/saml/SecurityConfig.java b/spring-security-modules/spring-security-saml2/src/main/java/com/baeldung/saml/SecurityConfig.java index 524cb3b0bc..24165d07ed 100644 --- a/spring-security-modules/spring-security-saml2/src/main/java/com/baeldung/saml/SecurityConfig.java +++ b/spring-security-modules/spring-security-saml2/src/main/java/com/baeldung/saml/SecurityConfig.java @@ -2,7 +2,6 @@ package com.baeldung.saml; import static org.springframework.security.config.Customizer.withDefaults; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; @@ -13,26 +12,30 @@ import org.springframework.security.saml2.provider.service.registration.RelyingP import org.springframework.security.saml2.provider.service.web.DefaultRelyingPartyRegistrationResolver; import org.springframework.security.saml2.provider.service.web.Saml2MetadataFilter; import org.springframework.security.saml2.provider.service.web.authentication.Saml2WebSsoAuthenticationFilter; -import org.springframework.security.web.DefaultSecurityFilterChain; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class SecurityConfig { - - @Autowired - private RelyingPartyRegistrationRepository relyingPartyRegistrationRepository; + + private final RelyingPartyRegistrationRepository relyingPartyRegistrationRepository; @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - DefaultRelyingPartyRegistrationResolver relyingPartyRegistrationResolver = new DefaultRelyingPartyRegistrationResolver(this.relyingPartyRegistrationRepository); + DefaultRelyingPartyRegistrationResolver relyingPartyRegistrationResolver = new DefaultRelyingPartyRegistrationResolver( + this.relyingPartyRegistrationRepository); Saml2MetadataFilter filter = new Saml2MetadataFilter(relyingPartyRegistrationResolver, new OpenSamlMetadataResolver()); - http.csrf(AbstractHttpConfigurer::disable).authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated()) - .saml2Login(withDefaults()) - .saml2Logout(withDefaults()) - .addFilterBefore(filter, Saml2WebSsoAuthenticationFilter.class); - DefaultSecurityFilterChain chain = http.build(); - return chain; + http.csrf(AbstractHttpConfigurer::disable) + .authorizeHttpRequests(authorize -> authorize.anyRequest() + .authenticated()) + .saml2Login(withDefaults()) + .saml2Logout(withDefaults()) + .addFilterBefore(filter, Saml2WebSsoAuthenticationFilter.class); + return http.build(); + } + + public SecurityConfig(RelyingPartyRegistrationRepository relyingPartyRegistrationRepository) { + this.relyingPartyRegistrationRepository = relyingPartyRegistrationRepository; } } \ No newline at end of file diff --git a/spring-web-modules/spring-rest-http/pom.xml b/spring-web-modules/spring-rest-http/pom.xml index 5a92b585e3..8d3ea82c44 100644 --- a/spring-web-modules/spring-rest-http/pom.xml +++ b/spring-web-modules/spring-rest-http/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 @@ -54,11 +54,30 @@ json-patch ${jsonpatch.version} + + org.apache.httpcomponents.client5 + httpclient5 + ${httpclient5.version} + test + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + 1.4.9 1.12 + 5.2.1 \ No newline at end of file diff --git a/spring-web-modules/spring-rest-http/src/main/java/com/baeldung/responseheaders/controllers/FilterResponseHeaderController.java b/spring-web-modules/spring-rest-http/src/main/java/com/baeldung/responseheaders/controllers/FilterResponseHeaderController.java index c92d4afafd..7a650a3e05 100644 --- a/spring-web-modules/spring-rest-http/src/main/java/com/baeldung/responseheaders/controllers/FilterResponseHeaderController.java +++ b/spring-web-modules/spring-rest-http/src/main/java/com/baeldung/responseheaders/controllers/FilterResponseHeaderController.java @@ -1,22 +1,22 @@ package com.baeldung.responseheaders.controllers; -import javax.servlet.http.HttpServletResponse; - import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import jakarta.servlet.http.HttpServletResponse; + @RestController @RequestMapping("/filter-response-header") public class FilterResponseHeaderController { @GetMapping("/no-extra-header") - public String FilterHeaderResponseWithNoExtraHeader() { + public String filterHeaderResponseWithNoExtraHeader() { return "Response body with Filter header and no extra header"; } @GetMapping("/extra-header") - public String FilterHeaderResponseWithExtraHeader(HttpServletResponse response) { + public String filterHeaderResponseWithExtraHeader(HttpServletResponse response) { response.addHeader("Baeldung-Example-Header", "Value-ExtraHeader"); return "Response body with Filter header and one extra header"; } diff --git a/spring-web-modules/spring-rest-http/src/main/java/com/baeldung/responseheaders/controllers/ResponseHeaderController.java b/spring-web-modules/spring-rest-http/src/main/java/com/baeldung/responseheaders/controllers/ResponseHeaderController.java index d93964b815..dab6467ec7 100644 --- a/spring-web-modules/spring-rest-http/src/main/java/com/baeldung/responseheaders/controllers/ResponseHeaderController.java +++ b/spring-web-modules/spring-rest-http/src/main/java/com/baeldung/responseheaders/controllers/ResponseHeaderController.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; diff --git a/spring-web-modules/spring-rest-http/src/main/java/com/baeldung/responseheaders/filter/AddResponseHeaderFilter.java b/spring-web-modules/spring-rest-http/src/main/java/com/baeldung/responseheaders/filter/AddResponseHeaderFilter.java index 7d4ffb1391..7820f6c650 100644 --- a/spring-web-modules/spring-rest-http/src/main/java/com/baeldung/responseheaders/filter/AddResponseHeaderFilter.java +++ b/spring-web-modules/spring-rest-http/src/main/java/com/baeldung/responseheaders/filter/AddResponseHeaderFilter.java @@ -2,18 +2,18 @@ package com.baeldung.responseheaders.filter; import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.annotation.WebFilter; -import javax.servlet.http.HttpServletResponse; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.annotation.WebFilter; +import jakarta.servlet.http.HttpServletResponse; + @WebFilter("/filter-response-header/*") public class AddResponseHeaderFilter implements Filter { diff --git a/spring-web-modules/spring-rest-http/src/main/java/com/baeldung/web/controller/customer/CustomerRestController.java b/spring-web-modules/spring-rest-http/src/main/java/com/baeldung/web/controller/customer/CustomerRestController.java index edae10de27..061c5eb3e4 100644 --- a/spring-web-modules/spring-rest-http/src/main/java/com/baeldung/web/controller/customer/CustomerRestController.java +++ b/spring-web-modules/spring-rest-http/src/main/java/com/baeldung/web/controller/customer/CustomerRestController.java @@ -23,8 +23,6 @@ import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import java.net.URI; -import javax.validation.Valid; - @RestController @RequestMapping(value = "/customers") public class CustomerRestController { @@ -40,25 +38,28 @@ public class CustomerRestController { public ResponseEntity createCustomer(@RequestBody Customer customer) { Customer customerCreated = customerService.createCustomer(customer); URI location = ServletUriComponentsBuilder.fromCurrentRequest() - .path("/{id}") - .buildAndExpand(customerCreated.getId()) - .toUri(); - return ResponseEntity.created(location).build(); + .path("/{id}") + .buildAndExpand(customerCreated.getId()) + .toUri(); + return ResponseEntity.created(location) + .build(); } @PatchMapping(path = "/{id}", consumes = "application/json-patch+json") - public ResponseEntity updateCustomer(@PathVariable String id, - @RequestBody JsonPatch patch) { + public ResponseEntity updateCustomer(@PathVariable String id, @RequestBody JsonPatch patch) { try { - Customer customer = customerService.findCustomer(id).orElseThrow(CustomerNotFoundException::new); + Customer customer = customerService.findCustomer(id) + .orElseThrow(CustomerNotFoundException::new); Customer customerPatched = applyPatchToCustomer(patch, customer); customerService.updateCustomer(customerPatched); return ResponseEntity.ok(customerPatched); } catch (CustomerNotFoundException e) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .build(); } catch (JsonPatchException | JsonProcessingException e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .build(); } }