diff --git a/storage/src/main/java/com/zfoo/storage/strategy/JsonToArrayConverter.java b/storage/src/main/java/com/zfoo/storage/strategy/ArrayConverter.java similarity index 96% rename from storage/src/main/java/com/zfoo/storage/strategy/JsonToArrayConverter.java rename to storage/src/main/java/com/zfoo/storage/strategy/ArrayConverter.java index c9a6f62e..3765b0be 100644 --- a/storage/src/main/java/com/zfoo/storage/strategy/JsonToArrayConverter.java +++ b/storage/src/main/java/com/zfoo/storage/strategy/ArrayConverter.java @@ -25,7 +25,7 @@ import java.util.Set; /** * @author godotg */ -public class JsonToArrayConverter implements ConditionalGenericConverter { +public class ArrayConverter implements ConditionalGenericConverter { @Override diff --git a/storage/src/main/java/com/zfoo/storage/strategy/JsonToMapConverter.java b/storage/src/main/java/com/zfoo/storage/strategy/JsonToMapConverter.java index b31ed0ff..156dbaf3 100644 --- a/storage/src/main/java/com/zfoo/storage/strategy/JsonToMapConverter.java +++ b/storage/src/main/java/com/zfoo/storage/strategy/JsonToMapConverter.java @@ -39,8 +39,5 @@ public class JsonToMapConverter implements ConditionalGenericConverter { public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { String content = (String) source; return JsonUtils.string2Map(content, targetType.getMapKeyTypeDescriptor().getType(), targetType.getMapValueTypeDescriptor().getType()); -// return JsonUtils.string2Object(content, targetType.getType()); - // return JsonUtil.string2Map(content, targetType.getMapKeyTypeDescriptor().getType() - // , targetType.getMapValueTypeDescriptor().getType()); } } diff --git a/storage/src/main/java/com/zfoo/storage/strategy/JsonToListConverter.java b/storage/src/main/java/com/zfoo/storage/strategy/ListConverter.java similarity index 83% rename from storage/src/main/java/com/zfoo/storage/strategy/JsonToListConverter.java rename to storage/src/main/java/com/zfoo/storage/strategy/ListConverter.java index 99942bf4..1d57f80d 100644 --- a/storage/src/main/java/com/zfoo/storage/strategy/JsonToListConverter.java +++ b/storage/src/main/java/com/zfoo/storage/strategy/ListConverter.java @@ -29,7 +29,7 @@ import java.util.Set; /** * @author liqi */ -public class JsonToListConverter implements ConditionalGenericConverter { +public class ListConverter implements ConditionalGenericConverter { @Override @@ -50,14 +50,16 @@ public class JsonToListConverter implements ConditionalGenericConverter { } Class clazz = null; Type type = targetType.getResolvableType().getGeneric(0).getType(); - if (type instanceof Class) { - clazz = (Class) type; - } else if (type instanceof ParameterizedType parameterizedType) { + if (type instanceof ParameterizedType parameterizedType) { clazz = (Class) parameterizedType.getRawType(); + } else { + clazz = (Class) type; } if (content.startsWith("[") || content.endsWith("]")) { - return Collections.unmodifiableList(JsonUtils.string2List(content, clazz)); + return clazz.equals(List.class) + ? Collections.unmodifiableList(JsonUtils.string2List(content, clazz)) + : JsonUtils.string2List(content, clazz); } - return Collections.unmodifiableList(ConvertUtils.convertToList(content, clazz)); + return ConvertUtils.convertToList(content, clazz); } } diff --git a/storage/src/main/java/com/zfoo/storage/strategy/SetConverter.java b/storage/src/main/java/com/zfoo/storage/strategy/SetConverter.java new file mode 100644 index 00000000..38da5597 --- /dev/null +++ b/storage/src/main/java/com/zfoo/storage/strategy/SetConverter.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package com.zfoo.storage.strategy; + +import com.zfoo.protocol.util.JsonUtils; +import com.zfoo.protocol.util.StringUtils; +import com.zfoo.storage.util.ConvertUtils; +import org.springframework.core.convert.TypeDescriptor; +import org.springframework.core.convert.converter.ConditionalGenericConverter; +import org.springframework.lang.NonNull; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Collections; +import java.util.Set; + +/** + * @author liqi + */ +public class SetConverter implements ConditionalGenericConverter { + + + @Override + public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { + return sourceType.getType() == String.class && Set.class.isAssignableFrom(targetType.getType()); + } + + @Override + public Set getConvertibleTypes() { + return Collections.singleton(new ConvertiblePair(String.class, Set.class)); + } + + @Override + public Object convert(Object source, @NonNull TypeDescriptor sourceType, TypeDescriptor targetType) { + var content = StringUtils.trim((String) source); + if (StringUtils.isEmpty(content)) { + return Collections.emptySet(); + } + Class clazz = null; + Type type = targetType.getResolvableType().getGeneric(0).getType(); + if (type instanceof ParameterizedType parameterizedType) { + clazz = (Class) parameterizedType.getRawType(); + } else { + clazz = (Class) type; + } + if (content.startsWith("[") || content.endsWith("]")) { + return clazz.equals(Set.class) + ? Collections.unmodifiableSet(JsonUtils.string2Set(content, clazz)) + : JsonUtils.string2Set(content, clazz); + } + return ConvertUtils.convertToSet(content, clazz); + } +} diff --git a/storage/src/main/java/com/zfoo/storage/util/ConvertUtils.java b/storage/src/main/java/com/zfoo/storage/util/ConvertUtils.java index bb445c2e..82dd9f05 100644 --- a/storage/src/main/java/com/zfoo/storage/util/ConvertUtils.java +++ b/storage/src/main/java/com/zfoo/storage/util/ConvertUtils.java @@ -19,10 +19,7 @@ import org.springframework.core.convert.TypeDescriptor; import java.lang.reflect.Array; import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; +import java.util.*; /** * @author godotg @@ -35,8 +32,8 @@ public abstract class ConvertUtils { static { var converters = new HashSet<>(); - converters.add(new JsonToArrayConverter()); - converters.add(new JsonToListConverter()); + converters.add(new ArrayConverter()); + converters.add(new ListConverter()); converters.add(new JsonToMapConverter()); converters.add(new JsonToObjectConverter()); converters.add(new StringToClassConverter()); @@ -85,6 +82,21 @@ public abstract class ConvertUtils { var value = ConvertUtils.convert(StringUtils.trim(splits[i]), type); list.add(value); } - return list; + return Collections.unmodifiableList(list); + } + + public static Set convertToSet(String content, Class type) { + content = StringUtils.trim(content); + if (StringUtils.isEmpty(content)) { + return Collections.emptySet(); + } + var splits = content.split(StringUtils.COMMA_REGEX); + var length = splits.length; + var set = new HashSet(); + for (var i = 0; i < length; i++) { + var value = ConvertUtils.convert(StringUtils.trim(splits[i]), type); + set.add(value); + } + return Collections.unmodifiableSet(set); } } diff --git a/storage/src/test/java/com/zfoo/storage/conversion/ConversionTest.java b/storage/src/test/java/com/zfoo/storage/conversion/ConversionTest.java index 33b35c43..eb931235 100644 --- a/storage/src/test/java/com/zfoo/storage/conversion/ConversionTest.java +++ b/storage/src/test/java/com/zfoo/storage/conversion/ConversionTest.java @@ -13,7 +13,7 @@ package com.zfoo.storage.conversion; -import com.zfoo.storage.strategy.JsonToArrayConverter; +import com.zfoo.storage.strategy.ArrayConverter; import com.zfoo.storage.strategy.JsonToMapConverter; import com.zfoo.storage.strategy.StringToClassConverter; import com.zfoo.storage.strategy.StringToDateConverter; @@ -38,7 +38,7 @@ public class ConversionTest { private static final StringToDateConverter std = new StringToDateConverter(); private static final StringToClassConverter stcc = new StringToClassConverter(); private static final JsonToMapConverter jtmc = new JsonToMapConverter(); - private static final JsonToArrayConverter jtac = new JsonToArrayConverter(); + private static final ArrayConverter jtac = new ArrayConverter(); static { converters.add(std);