package com.github.aesteve.vertx.nubes.reflections.adapters.impl; import com.github.aesteve.vertx.nubes.reflections.adapters.ParameterAdapter; import com.github.aesteve.vertx.nubes.utils.DateUtils; import io.vertx.core.MultiMap; import org.apache.commons.beanutils.PropertyUtils; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.function.Function; public class DefaultParameterAdapter implements ParameterAdapter<Object> { private static final Map<Class<?>, Function<String, Object>> adapters = new HashMap<>(); static { adapters.put(String.class, String::valueOf); adapters.put(Long.class, Long::valueOf); adapters.put(Integer.class, Integer::valueOf); adapters.put(Float.class, Float::valueOf); adapters.put(Date.class, DateUtils.INSTANCE::parseIso8601); } @SuppressWarnings("unchecked") @Override public Object adaptParam(String value, Class<?> parameterClass) { if (value == null) { return null; } Function<String, Object> adapter = adapters.get(parameterClass); if (adapter != null) { return adapter.apply(value); } else if (parameterClass.isEnum()) { return Enum.valueOf((Class<Enum>) parameterClass, value); } return null; } @Override public Object adaptParams(MultiMap params, Class<?> parameterClass) { Object instance; try { instance = parameterClass.newInstance(); Field[] fields = parameterClass.getDeclaredFields(); for (Field field : fields) { String requestValue = params.get(field.getName()); if (requestValue != null) { Object value = adaptParam(requestValue, field.getType()); PropertyUtils.setProperty(instance, field.getName(), value); } } } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { throw new IllegalArgumentException(e); } return instance; } }