package org.jdbi.v3.core.argument;
import java.lang.reflect.Type;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import org.jdbi.v3.core.argument.internal.StatementBinder;
import org.jdbi.v3.core.argument.internal.strategies.LoggableBinderArgument;
import org.jdbi.v3.core.config.ConfigRegistry;
import static org.jdbi.v3.core.generic.GenericTypes.getErasedType;
abstract class DelegatingArgumentFactory implements ArgumentFactory {
private final Map<Class<?>, Function<?, Argument>> builders = new IdentityHashMap<>();
@Override
public Optional<Argument> build(Type expectedType, Object value, ConfigRegistry config) {
Class<?> expectedClass = getErasedType(expectedType);
if (value != null && expectedClass == Object.class) {
expectedClass = value.getClass();
}
@SuppressWarnings("unchecked")
Function<Object, Argument> reusable = (Function<Object, Argument>) builders.get(expectedClass);
return Optional.ofNullable(reusable).map(r -> r.apply(value));
}
<T> void register(Class<T> klass, int sqlType, StatementBinder<T> binder) {
builders.put(klass, (T value) -> value == null ? new NullArgument(sqlType) : new LoggableBinderArgument<>(value, binder));
}
}