package com.revolsys.datatype; import java.util.Collection; import java.util.Collections; import java.util.function.BiFunction; import java.util.function.Function; import com.revolsys.util.function.Function3; public class FunctionDataType extends AbstractDataType { public static FunctionDataType newToObjectEquals(final String name, final Class<?> javaClass, final Function<Object, ?> toObjectFunction, final BiFunction<? extends Object, ? extends Object, Boolean> equalsFunction) { return new FunctionDataType(name, javaClass, true, toObjectFunction, null, equalsFunction, null); } private final Function<Object, ?> toObjectFunction; private final Function<Object, String> toStringFunction; private final BiFunction<Object, Object, Boolean> equalsFunction; private final Function3<Object, Object, Collection<? extends CharSequence>, Boolean> equalsExcludesFunction; public FunctionDataType(final String name, final Class<?> javaClass, final boolean requiresQuotes, final Function<Object, ?> function) { this(name, javaClass, requiresQuotes, function, null, null, null); } public FunctionDataType(final String name, final Class<?> javaClass, final boolean requireQuotes, final Function<Object, ?> toObjectFunction, final BiFunction<? extends Object, ? extends Object, Boolean> equalsFunction) { this(name, javaClass, requireQuotes, toObjectFunction, null, equalsFunction, null); } public FunctionDataType(final String name, final Class<?> javaClass, final boolean requiresQuotes, final Function<Object, ?> toObjectFunction, final Function<Object, String> toStringFunction) { this(name, javaClass, requiresQuotes, toObjectFunction, toStringFunction, null, null); } @SuppressWarnings({ "unchecked", "rawtypes" }) public FunctionDataType(final String name, final Class<?> javaClass, final boolean requiresQuotes, final Function<Object, ?> toObjectFunction, final Function<Object, String> toStringFunction, final BiFunction<?, ?, Boolean> equalsFunction, final Function3<Object, Object, Collection<? extends CharSequence>, Boolean> equalsExcludesFunction) { super(name, javaClass, requiresQuotes); this.toObjectFunction = toObjectFunction; if (toStringFunction == null) { this.toStringFunction = Object::toString; } else { this.toStringFunction = toStringFunction; } if (equalsFunction == null) { if (equalsExcludesFunction == null) { this.equalsFunction = Object::equals; } else { this.equalsFunction = (value1, value2) -> { return equalsNotNull(value1, value2, Collections.emptySet()); }; } } else { this.equalsFunction = (BiFunction)equalsFunction; } if (equalsExcludesFunction == null) { if (equalsFunction == null) { this.equalsExcludesFunction = (value1, value2, excludeFieldNames) -> { return value1.equals(value2); }; } else { this.equalsExcludesFunction = (value1, value2, excludeFieldNames) -> { return this.equalsFunction.apply(value1, value2); }; } } else { this.equalsExcludesFunction = equalsExcludesFunction; } } public FunctionDataType(final String name, final Class<?> javaClass, final Function<Object, ?> function) { this(name, javaClass, true, function); } public FunctionDataType(final String name, final Class<?> javaClass, final Function<Object, ?> toObjectFunction, final BiFunction<? extends Object, ? extends Object, Boolean> equalsFunction, final Function3<Object, Object, Collection<? extends CharSequence>, Boolean> equalsExcludesFunction) { this(name, javaClass, true, toObjectFunction, null, equalsFunction, equalsExcludesFunction); } public FunctionDataType(final String name, final Class<?> javaClass, final Function<Object, ?> toObjectFunction, final Function<Object, String> toStringFunction) { this(name, javaClass, true, toObjectFunction, toStringFunction); } public FunctionDataType(final String name, final Class<?> javaClass, final Function<Object, ?> toObjectFunction, final Function<Object, String> toStringFunction, final BiFunction<?, ?, Boolean> equalsFunction) { this(name, javaClass, true, toObjectFunction, toStringFunction, equalsFunction, null); } public FunctionDataType(final String name, final Class<?> javaClass, final Function<Object, ?> toObjectFunction, final Function3<Object, Object, Collection<? extends CharSequence>, Boolean> equalsExcludesFunction) { this(name, javaClass, true, toObjectFunction, null, null, equalsExcludesFunction); } @Override protected boolean equalsNotNull(final Object value1, final Object value2) { return this.equalsFunction.apply(value1, value2); } @Override protected boolean equalsNotNull(final Object value1, final Object value2, final Collection<? extends CharSequence> excludeFieldNames) { return this.equalsExcludesFunction.apply(value1, value2, excludeFieldNames); } @Override protected Object toObjectDo(final Object value) { return this.toObjectFunction.apply(value); } @Override public String toStringDo(final Object value) { return this.toStringFunction.apply(value); } }