diff --git a/core/src/main/java/org/springframework/security/jackson2/AbstractUnmodifiableCollectionDeserializer.java b/core/src/main/java/org/springframework/security/jackson2/AbstractUnmodifiableCollectionDeserializer.java index 5492755eb0..a58e581248 100644 --- a/core/src/main/java/org/springframework/security/jackson2/AbstractUnmodifiableCollectionDeserializer.java +++ b/core/src/main/java/org/springframework/security/jackson2/AbstractUnmodifiableCollectionDeserializer.java @@ -16,6 +16,12 @@ package org.springframework.security.jackson2; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Set; + import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; @@ -23,18 +29,14 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; -import java.io.IOException; -import java.util.Collection; -import java.util.List; -import java.util.Set; - /** - * Abstract base class for deserializers that create unmodifiable collections from JSON data. - * Subclasses like {@link UnmodifiableListDeserializer} and - * {@link UnmodifiableSetDeserializer} should implement the method to define the - * specific collection type and handle the deserialization logic. + * Abstract base class for deserializers that create unmodifiable collections from JSON + * data. Subclasses like {@link UnmodifiableListDeserializer} and + * {@link UnmodifiableSetDeserializer} should implement the method to define the specific + * collection type and handle the deserialization logic. * - * @param the type of the unmodifiable collection, such as {@link List} or {@link Set}. + * @param the type of the unmodifiable collection, such as {@link List} or + * {@link Set}. * @author Hyunmin Choi */ abstract class AbstractUnmodifiableCollectionDeserializer extends JsonDeserializer { @@ -43,35 +45,24 @@ abstract class AbstractUnmodifiableCollectionDeserializer extends JsonDeseria public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { ObjectMapper mapper = (ObjectMapper) jp.getCodec(); JsonNode node = mapper.readTree(jp); - return createUnmodifiableCollection(node, mapper); + Collection values = new ArrayList<>(); + if (node instanceof ArrayNode arrayNode) { + for (JsonNode elementNode : arrayNode) { + values.add(mapper.readValue(elementNode.traverse(mapper), Object.class)); + } + } + else if (node != null) { + values.add(mapper.readValue(node.traverse(mapper), Object.class)); + } + return createUnmodifiableCollection(values); } /** * Creates an unmodifiable collection from the given JSON node. - * - * @param node the JSON node containing the data to be deserialized. - * @param mapper the {@link ObjectMapper} used to deserialize JSON data. + * @param values the values to add to the unmodifiable collection * @return an unmodifiable collection with the deserialized elements. * @throws IOException if an error occurs during deserialization. */ - protected abstract T createUnmodifiableCollection(JsonNode node, ObjectMapper mapper) throws IOException; - - /** - * Adds elements from the JSON node to the provided collection. - * - * @param node the JSON node containing the elements to add. - * @param mapper the {@link ObjectMapper} used for deserialization. - * @param collection the collection to which elements are added. - * @throws IOException if an error occurs during deserialization. - */ - protected void addElements(JsonNode node, ObjectMapper mapper, Collection collection) throws IOException { - if (node instanceof ArrayNode arrayNode) { - for (JsonNode elementNode : arrayNode) { - collection.add(mapper.readValue(elementNode.traverse(mapper), Object.class)); - } - } else if (node != null) { - collection.add(mapper.readValue(node.traverse(mapper), Object.class)); - } - } + abstract T createUnmodifiableCollection(Collection values) throws IOException; } diff --git a/core/src/main/java/org/springframework/security/jackson2/UnmodifiableListDeserializer.java b/core/src/main/java/org/springframework/security/jackson2/UnmodifiableListDeserializer.java index 417c431b50..271432af6e 100644 --- a/core/src/main/java/org/springframework/security/jackson2/UnmodifiableListDeserializer.java +++ b/core/src/main/java/org/springframework/security/jackson2/UnmodifiableListDeserializer.java @@ -16,11 +16,8 @@ package org.springframework.security.jackson2; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.io.IOException; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -35,10 +32,8 @@ import java.util.List; class UnmodifiableListDeserializer extends AbstractUnmodifiableCollectionDeserializer { @Override - protected List createUnmodifiableCollection(JsonNode node, ObjectMapper mapper) throws IOException { - List result = new ArrayList<>(); - addElements(node, mapper, result); - return Collections.unmodifiableList(result); + List createUnmodifiableCollection(Collection values) { + return Collections.unmodifiableList(new ArrayList<>(values)); } } diff --git a/core/src/main/java/org/springframework/security/jackson2/UnmodifiableSetDeserializer.java b/core/src/main/java/org/springframework/security/jackson2/UnmodifiableSetDeserializer.java index ed6e22cb79..75600478cd 100644 --- a/core/src/main/java/org/springframework/security/jackson2/UnmodifiableSetDeserializer.java +++ b/core/src/main/java/org/springframework/security/jackson2/UnmodifiableSetDeserializer.java @@ -16,10 +16,7 @@ package org.springframework.security.jackson2; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.io.IOException; +import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -35,10 +32,8 @@ import java.util.Set; class UnmodifiableSetDeserializer extends AbstractUnmodifiableCollectionDeserializer { @Override - protected Set createUnmodifiableCollection(JsonNode node, ObjectMapper mapper) throws IOException { - Set resultSet = new HashSet<>(); - addElements(node, mapper, resultSet); - return Collections.unmodifiableSet(resultSet); + Set createUnmodifiableCollection(Collection values) { + return Collections.unmodifiableSet(new HashSet<>(values)); } }