package com.revolsys.datatype;
import java.util.Collection;
public abstract class AbstractDataType implements DataType {
private final Class<?> javaClass;
private final String name;
private final boolean requiresQuotes;
public AbstractDataType(final String name, final Class<?> javaClass,
final boolean requiresQuotes) {
this.name = name;
this.javaClass = javaClass;
this.requiresQuotes = requiresQuotes;
DataTypes.register(this);
}
@Override
public boolean equals(final Object value1, final Object value2) {
if (value1 == value2) {
return true;
} else if (value1 == null) {
return value2 == null;
} else if (value2 == null) {
return false;
} else {
try {
final Object convertedValue1 = toObject(value1);
final Object convertedValue2 = toObject(value2);
final boolean equal = equalsNotNull(convertedValue1, convertedValue2);
return equal;
} catch (final Throwable e) {
return false;
}
}
}
@Override
public boolean equals(final Object value1, final Object value2,
final Collection<? extends CharSequence> excludeFieldNames) {
if (value1 == value2) {
return true;
} else if (value1 == null) {
return value2 == null;
} else if (value2 == null) {
return false;
} else {
try {
final Object convertedValue1 = toObject(value1);
final Object convertedValue2 = toObject(value2);
final boolean equal = equalsNotNull(convertedValue1, convertedValue2, excludeFieldNames);
return equal;
} catch (final Throwable e) {
return false;
}
}
}
protected boolean equalsNotNull(final Object value1, final Object value2) {
return value1.equals(value2);
}
protected boolean equalsNotNull(final Object value1, final Object value2,
final Collection<? extends CharSequence> excludeFieldNames) {
return value1.equals(value2);
}
@Override
public Class<?> getJavaClass() {
return this.javaClass;
}
@Override
public String getName() {
return this.name;
}
@Override
public String getValidationName() {
if (Number.class.isAssignableFrom(this.javaClass)) {
return "number (" + getName() + ")";
} else {
return getName();
}
}
@Override
public int hashCode() {
return this.name.hashCode();
}
@Override
public boolean isRequiresQuotes() {
return this.requiresQuotes;
}
@SuppressWarnings("unchecked")
@Override
public <V> V toObject(final Object value) {
if (value == null) {
return null;
} else {
final Class<?> javaClass = getJavaClass();
final Class<?> valueClass = value.getClass();
if (javaClass == valueClass || javaClass.isAssignableFrom(valueClass)) {
return (V)value;
} else {
return (V)toObjectDo(value);
}
}
}
protected Object toObjectDo(final Object value) {
throw new IllegalArgumentException(value + " is not a valid " + getValidationName());
}
@Override
public String toString() {
return this.name.toString();
}
@Override
public final String toString(final Object value) {
if (value == null) {
return null;
} else if (value instanceof CharSequence) {
return value.toString();
} else {
try {
final Object convertedValue = toObject(value);
return toStringDo(convertedValue);
} catch (final Throwable e) {
return value.toString();
}
}
}
protected String toStringDo(final Object value) {
return value.toString();
}
}