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

org.async.rmi.config.PropertiesReader Maven / Gradle / Ivy

package org.async.rmi.config;

import org.async.rmi.TimeSpan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * Created by Barak Bar Orion
 * 12/12/14.
 */
public class PropertiesReader {
    @SuppressWarnings("UnusedDeclaration")
    private static final Logger logger = LoggerFactory.getLogger(PropertiesReader.class);

    @SuppressWarnings("unchecked")
    public static  T read(Map properties, T instance) throws IntrospectionException, InvocationTargetException, IllegalAccessException, MalformedURLException, InstantiationException {
        BeanInfo info =  Introspector.getBeanInfo(instance.getClass());
        for (PropertyDescriptor propertyDescriptor : info.getPropertyDescriptors()) {
            Object value = properties.get(propertyDescriptor.getName());

            if(value != null){
                if(value instanceof Map){
                    Class returnType = propertyDescriptor.getReadMethod().getReturnType();
                    if(returnType.equals(TimeSpan.class)){
                          logger.info("foo {}", value);
                        propertyDescriptor.getWriteMethod().invoke(instance, new TimeSpan((int)((Map)value).get("time"), toTimeUnit((String)((Map)value).get("unit"))));
                    }else {
                        Object ins = read((Map) value, returnType.newInstance());
                        propertyDescriptor.getWriteMethod().invoke(instance, ins);
                    }
                }else if(value instanceof Collection){
                    ParameterizedType type = (ParameterizedType)propertyDescriptor.getReadMethod().getGenericReturnType();
                    List container = new ArrayList<>();
                    for (Object v :(Collection)value) {
                        if(v instanceof Map){
                            Class aClass = (Class) type.getActualTypeArguments()[0];
                            container.add(read((Map)v, aClass.newInstance()));
                        }else if(v instanceof Collection){
                            //todo
                        }else{
                            container.add(v);
                        }
                    }
                    propertyDescriptor.getWriteMethod().invoke(instance, container);
                }else {
                    Type type = propertyDescriptor.getReadMethod().getGenericReturnType();
                    if(String.class.getTypeName().equals(type.getTypeName()) && value instanceof String){
                        propertyDescriptor.getWriteMethod().invoke(instance,(String)value);
                    }else if(File.class.getTypeName().equals(type.getTypeName()) && value instanceof String){
                        propertyDescriptor.getWriteMethod().invoke(instance, new File((String)value));
                    }else if(URL.class.getTypeName().equals(type.getTypeName()) && value instanceof String){
                        propertyDescriptor.getWriteMethod().invoke(instance, new URL((String)value));
                    }else if(long.class.getTypeName().equals(type.getTypeName()) && value instanceof Long){
                        propertyDescriptor.getWriteMethod().invoke(instance, (Long)value);
                    }else if(int.class.getTypeName().equals(type.getTypeName()) && value instanceof Integer){
                        propertyDescriptor.getWriteMethod().invoke(instance, (Integer)value);
                    }else if(boolean.class.getTypeName().equals(type.getTypeName()) && value instanceof Boolean){
                        propertyDescriptor.getWriteMethod().invoke(instance, (Boolean)value);
                    }
                }

            }
        }

        return instance;
    }

    private static TimeUnit toTimeUnit(String unit) {
        return TimeUnit.valueOf(unit.toUpperCase());
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy