feat[storage]: custom convert

This commit is contained in:
godotg committed 2024-07-20 08:47:01 +08:00
1 parent cc76daf6f1
commit 37cfbd6e6c
9 files changed
+54 -16

No files matched your search

@@ -26,6 +26,10 @@ import java.util.Set;
*/ */
public class ArrayConverter implements ConditionalGenericConverter { public class ArrayConverter implements ConditionalGenericConverter {
public static final ArrayConverter INSTANCE = new ArrayConverter();
private ArrayConverter() {
}
@Override @Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -14,6 +14,7 @@ package com.zfoo.storage.convert;
import com.zfoo.protocol.util.StringUtils; import com.zfoo.protocol.util.StringUtils;
import org.springframework.context.support.ConversionServiceFactoryBean; import org.springframework.context.support.ConversionServiceFactoryBean;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.TypeDescriptor;
import java.lang.reflect.Array; import java.lang.reflect.Array;
@@ -27,29 +28,36 @@ public abstract class ConvertUtils {
private static final TypeDescriptor TYPE_DESCRIPTOR = TypeDescriptor.valueOf(String.class); private static final TypeDescriptor TYPE_DESCRIPTOR = TypeDescriptor.valueOf(String.class);
private static final ConversionServiceFactoryBean conversionServiceFactoryBean = new ConversionServiceFactoryBean(); private static ConversionService conversionService = customConvert(Collections.emptySet());
static {
public static ConversionService customConvert(Set<?> customConverts) {
var converters = new HashSet<>(); var converters = new HashSet<>();
converters.add(new ArrayConverter()); // default convert
converters.add(new ListConverter()); converters.add(ArrayConverter.INSTANCE);
converters.add(new SetConverter()); converters.add(ListConverter.INSTANCE);
converters.add(new JsonToMapConverter()); converters.add(SetConverter.INSTANCE);
converters.add(new JsonToObjectConverter()); converters.add(JsonToMapConverter.INSTANCE);
converters.add(new StringToClassConverter()); converters.add(JsonToObjectConverter.INSTANCE);
converters.add(new StringToDateConverter()); converters.add(StringToClassConverter.INSTANCE);
converters.add(StringToDateConverter.INSTANCE);
// custom convert
converters.addAll(customConverts);
ConversionServiceFactoryBean conversionServiceFactoryBean = new ConversionServiceFactoryBean();
conversionServiceFactoryBean.setConverters(converters); conversionServiceFactoryBean.setConverters(converters);
conversionServiceFactoryBean.afterPropertiesSet(); conversionServiceFactoryBean.afterPropertiesSet();
return conversionServiceFactoryBean.getObject();
} }
public static <T> T convert(String content, Class<T> targetType) { public static <T> T convert(String content, Class<T> targetType) {
return conversionServiceFactoryBean.getObject().convert(content, targetType); return conversionService.convert(content, targetType);
} }
public static Object convertField(String content, Field field) { public static Object convertField(String content, Field field) {
var targetType = new TypeDescriptor(field); var targetType = new TypeDescriptor(field);
return conversionServiceFactoryBean.getObject().convert(content, TYPE_DESCRIPTOR, targetType); return conversionService.convert(content, TYPE_DESCRIPTOR, targetType);
} }
public static Object convertToArray(String content, Class<?> componentType) { public static Object convertToArray(String content, Class<?> componentType) {
@@ -75,7 +83,7 @@ public abstract class ConvertUtils {
var splits = content.split(StringUtils.COMMA_REGEX); var splits = content.split(StringUtils.COMMA_REGEX);
var list = new ArrayList<T>(); var list = new ArrayList<T>();
for (var split : splits) { for (var split : splits) {
var value = ConvertUtils.convert(StringUtils.trim(split), genericType); var value = convert(StringUtils.trim(split), genericType);
list.add(value); list.add(value);
} }
return Collections.unmodifiableList(list); return Collections.unmodifiableList(list);
@@ -26,6 +26,12 @@ import java.util.Set;
* @author godotg * @author godotg
*/ */
public class JsonToMapConverter implements ConditionalGenericConverter { public class JsonToMapConverter implements ConditionalGenericConverter {
public static final JsonToMapConverter INSTANCE = new JsonToMapConverter();
private JsonToMapConverter() {
}
@Override @Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return sourceType.getType() == String.class && targetType.isMap(); return sourceType.getType() == String.class && targetType.isMap();
@@ -29,6 +29,10 @@ import java.util.Set;
*/ */
public class JsonToObjectConverter implements ConditionalGenericConverter { public class JsonToObjectConverter implements ConditionalGenericConverter {
public static final JsonToObjectConverter INSTANCE = new JsonToObjectConverter();
private JsonToObjectConverter() {
}
@Override @Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -30,6 +30,10 @@ import java.util.Set;
*/ */
public class ListConverter implements ConditionalGenericConverter { public class ListConverter implements ConditionalGenericConverter {
public static final ListConverter INSTANCE = new ListConverter();
private ListConverter() {
}
@Override @Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -29,6 +29,10 @@ import java.util.Set;
*/ */
public class SetConverter implements ConditionalGenericConverter { public class SetConverter implements ConditionalGenericConverter {
public static final SetConverter INSTANCE = new SetConverter();
private SetConverter() {
}
@Override @Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
@@ -22,6 +22,10 @@ import org.springframework.core.convert.converter.Converter;
*/ */
public class StringToClassConverter implements Converter<String, Class<?>> { public class StringToClassConverter implements Converter<String, Class<?>> {
public static final StringToClassConverter INSTANCE = new StringToClassConverter();
private StringToClassConverter() {
}
@Override @Override
public Class<?> convert(String source) { public Class<?> convert(String source) {
@@ -25,6 +25,10 @@ import java.util.Date;
*/ */
public class StringToDateConverter implements Converter<String, Date> { public class StringToDateConverter implements Converter<String, Date> {
public static final StringToDateConverter INSTANCE = new StringToDateConverter();
private StringToDateConverter() {
}
@Override @Override
public Date convert(String source) { public Date convert(String source) {
@@ -31,10 +31,10 @@ public class ConversionTest {
private static final ConversionServiceFactoryBean csfb = new ConversionServiceFactoryBean(); private static final ConversionServiceFactoryBean csfb = new ConversionServiceFactoryBean();
private static final Set<Object> converters = new HashSet<>(); private static final Set<Object> converters = new HashSet<>();
private static final StringToDateConverter std = new StringToDateConverter(); private static final StringToDateConverter std = StringToDateConverter.INSTANCE;
private static final StringToClassConverter stcc = new StringToClassConverter(); private static final StringToClassConverter stcc = StringToClassConverter.INSTANCE;
private static final JsonToMapConverter jtmc = new JsonToMapConverter(); private static final JsonToMapConverter jtmc = JsonToMapConverter.INSTANCE;
private static final ArrayConverter jtac = new ArrayConverter(); private static final ArrayConverter jtac = ArrayConverter.INSTANCE;
static { static {
converters.add(std); converters.add(std);