package com.github.aesteve.vertx.nubes.reflections.adapters;
import com.github.aesteve.vertx.nubes.reflections.adapters.impl.DefaultParameterAdapter;
import io.vertx.core.MultiMap;
import java.util.HashMap;
import java.util.Map;
public class ParameterAdapterRegistry {
private final Map<Class<?>, ParameterAdapter<?>> adapters;
private final ParameterAdapter<Object> defaultParameterAdapter;
private ParameterAdapterRegistry(ParameterAdapter<Object> defaultParameterAdapter) {
adapters = new HashMap<>();
this.defaultParameterAdapter = defaultParameterAdapter;
}
public ParameterAdapterRegistry() {
this(new DefaultParameterAdapter());
}
public <T> void registerAdapter(Class<T> parameterClass, ParameterAdapter<T> adapter) {
adapters.put(parameterClass, adapter);
}
@SuppressWarnings("unchecked")
private <T> ParameterAdapter<T> getAdapter(Class<T> parameterClass) {
return (ParameterAdapter<T>) adapters.get(parameterClass);
}
public ParameterAdapter<Object> getDefaultParameterAdapter() {
return defaultParameterAdapter;
}
@SuppressWarnings("unchecked")
public <T> T adaptParam(String value, Class<T> parameterClass) {
ParameterAdapter<T> adapter = getAdapter(parameterClass);
if (adapter != null) {
return adapter.adaptParam(value, parameterClass);
} else if (defaultParameterAdapter != null) {
return (T) defaultParameterAdapter.adaptParam(value, parameterClass);
}
return null;
}
@SuppressWarnings("unchecked")
public <T> T adaptParams(MultiMap values, Class<T> parameterClass) {
ParameterAdapter<T> adapter = getAdapter(parameterClass);
if (adapter != null) {
return adapter.adaptParams(values, parameterClass);
} else if (defaultParameterAdapter != null) {
return (T) defaultParameterAdapter.adaptParams(values, parameterClass);
}
return null;
}
}