Contiguous/lib/src/main/java/nl/sanderhautvast/contiguous/PropertyHandlerFactory.java
2023-05-28 12:07:35 +02:00

68 lines
2.6 KiB
Java

package nl.sanderhautvast.contiguous;
import java.lang.invoke.MethodHandle;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
/*
* Maps the propertyvalue type to a PropertyHandler
*/
final class PropertyHandlerFactory {
private static final Map<Class<?>, Class<? extends BuiltinTypeHandler<?>>> TYPE_HANDLERS = new HashMap<>();
private PropertyHandlerFactory() {
}
static {
register(String.class, StringHandler.class);
register(byte.class, ByteHandler.class);
register(Byte.class, ByteHandler.class);
register(int.class, IntegerHandler.class);
register(Integer.class, IntegerHandler.class);
register(short.class, ShortHandler.class);
register(Short.class, ShortHandler.class);
register(long.class, LongHandler.class);
register(Long.class, LongHandler.class);
register(float.class, FloatHandler.class);
register(Float.class, FloatHandler.class);
register(double.class, DoubleHandler.class);
register(Double.class, DoubleHandler.class);
register(BigDecimal.class, StringHandler.class);
register(BigInteger.class, BigIntegerHandler.class);
register(BigDecimal.class, BigDecimalHandler.class);
//Date/Timestamp
//LocalDate/time
}
public static boolean isKnownType(Class<?> type) {
return TYPE_HANDLERS.containsKey(type);
}
public static <T> BuiltinTypeHandler<T> forType(Class<T> type, MethodHandle getter, MethodHandle setter) {
try {
Class<? extends BuiltinTypeHandler<?>> appenderClass = TYPE_HANDLERS.get(type);
if (appenderClass == null) {
throw new IllegalStateException("No Handler for " + type.getName());
}
return (BuiltinTypeHandler<T>) appenderClass.getDeclaredConstructor(MethodHandle.class, MethodHandle.class)
.newInstance(getter, setter);
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException |
InvocationTargetException e) {
throw new IllegalStateException(e);
}
}
public static <T> BuiltinTypeHandler<T> forType(Class<T> type) {
return forType(type, null, null);
}
/**
* register a new TypeHandler that cannot be derived from bean properties
*/
public static void register(Class<?> type, Class<? extends BuiltinTypeHandler<?>> typehandler) {
TYPE_HANDLERS.put(type, typehandler);
}
}