1 package org.springframework.security.oauth2.provider.client; 2 3 import java.io.IOException; 4 import java.util.Arrays; 5 import java.util.LinkedHashSet; 6 import java.util.Set; 7 8 import org.springframework.util.StringUtils; 9 10 import com.fasterxml.jackson.core.JsonParser; 11 import com.fasterxml.jackson.core.JsonProcessingException; 12 import com.fasterxml.jackson.core.JsonToken; 13 import com.fasterxml.jackson.core.type.TypeReference; 14 import com.fasterxml.jackson.databind.DeserializationContext; 15 import com.fasterxml.jackson.databind.JavaType; 16 import com.fasterxml.jackson.databind.deser.std.StdDeserializer; 17 import com.fasterxml.jackson.databind.type.SimpleType; 18 19 @SuppressWarnings("serial") 20 public class Jackson2ArrayOrStringDeserializer extends StdDeserializer<Set<String>> { 21 22 public Jackson2ArrayOrStringDeserializer() { 23 super(Set.class); 24 } 25 26 @Override 27 public JavaType getValueType() { 28 return SimpleType.construct(String.class); 29 } 30 31 @Override 32 public Set<String> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, 33 JsonProcessingException { 34 JsonToken token = jp.getCurrentToken(); 35 if (token.isScalarValue()) { 36 String list = jp.getText(); 37 list = list.replaceAll("\\s+", ","); 38 return new LinkedHashSet<String>(Arrays.asList(StringUtils.commaDelimitedListToStringArray(list))); 39 } 40 return jp.readValueAs(new TypeReference<Set<String>>() { 41 }); 42 } 43 }