All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.anwen.mongo.strategy.convert.ConversionService Maven / Gradle / Ivy

There is a newer version: 2.1.6.1
Show newest version
package com.anwen.mongo.strategy.convert;

import com.anwen.mongo.strategy.convert.impl.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 策略应用
 * @author JiaChaoYang
 **/
public class ConversionService {

    static Logger logger = LoggerFactory.getLogger(ConversionStrategy.class);

    private static final Map, ConversionStrategy> conversionStrategies = new ConcurrentHashMap<>();

    static {
        conversionStrategies.put(Integer.class, new IntegerConversionStrategy());
        conversionStrategies.put(Long.class, new LongConversionStrategy());
        conversionStrategies.put(Double.class, new DoubleConversionStrategy());
        conversionStrategies.put(Float.class, new FloatConversionStrategy());
        conversionStrategies.put(Boolean.class, new BooleanConversionStrategy());
        conversionStrategies.put(String.class, new StringConversionStrategy());
        conversionStrategies.put(LocalTime.class,new LocalTimeConversionStrategy());
        conversionStrategies.put(LocalDate.class,new LocalDateConversionStrategy());
        conversionStrategies.put(LocalDateTime.class,new LocalDateTimeConversionStrategy());
        conversionStrategies.put(Date.class,new DateConversionStrategy());
        conversionStrategies.put(Instant.class,new InstantConversionStrategy());
        conversionStrategies.put(Object.class,new DefaultConversionStrategy());
        conversionStrategies.put(BigDecimal.class,new BigDecimalConversionStrategy());
        conversionStrategies.put(BigInteger.class,new BigIntegerConversionStrategy());
        conversionStrategies.put(Map.class,new MapConversionStrategy());
        conversionStrategies.put(Collection.class,new CollectionConversionStrategy());
        conversionStrategies.put(List.class,conversionStrategies.get(Collection.class));
    }

    /**
     * 添加自定义转换器,转换器需实现ConversionStrategy
     * 可以使用此方法添加,或者将转换器注册为Bean,MongoPlus会自动扫描到转换器,加入到转换器策略中
     * @param clazz map的key,使用转换器要转换的类,get的时候,会根据字段的Type拿转换器
     * @param conversionStrategy 转换器接口
     * @return void
     * @author JiaChaoYang
     * @date 2023/10/17 0:19
    */
    public static  void appendConversion(Class clazz, ConversionStrategy conversionStrategy){
        conversionStrategies.put(clazz,conversionStrategy);
    }

    /**
     * 获取所有的转换器
     * @author JiaChaoYang
     * @date 2023/11/3 9:50
    */
    public static Map, ConversionStrategy> getAllConversion(){
        return conversionStrategies;
    }

    /**
     * 是否存在该类型的转换器
     * @param clazz 类型的class
     * @return boolean
     * @author JiaChaoYang
     * @date 2023/10/20 18:28
    */
    public static boolean isExist(Class clazz){
        return conversionStrategies.containsKey(clazz);
    }

    public static ConversionStrategy getConversion(Class clazz){
        return conversionStrategies.get(clazz);
    }

    /**
     * 将字段进行转换,根据field的type
     * @author JiaChaoYang
     * @date 2023/11/3 10:43
    */
    public static Object convertValue(Field field, Object obj, Object fieldValue, Class... clazz) throws IllegalAccessException {
        Class fieldType = getFieldType(clazz, field);
        ConversionStrategy conversionStrategy = getConversionStrategy(fieldType);

        return conversionStrategy.convertValue(field, obj, fieldValue);
    }

    private static Class getFieldType(Class[] clazz, Field field) {
        Class fieldType = field.getType();
        if (clazz != null && clazz.length > 0) {
            fieldType = clazz[0];
        }
        if (isMapType(fieldType)) {
            fieldType = Map.class;
        }
        return fieldType;
    }

    private static boolean isMapType(Class fieldType) {
        return Map.class.isAssignableFrom(fieldType);
    }

    private static ConversionStrategy getConversionStrategy(Class fieldType) {
        ConversionStrategy conversionStrategy = conversionStrategies.get(fieldType);
        if (conversionStrategy == null) {
            conversionStrategy = conversionStrategies.get(Object.class);
        }
        return conversionStrategy;
    }

    /**
     * 设置值
     * @author JiaChaoYang
     * @date 2023/11/3 10:42
    */
    public static void setValue(Field field, Object obj, Object fieldValue) throws IllegalAccessException {
        Object value = convertValue(field, obj, fieldValue);
        field.set(obj,value);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy