package kr.debop4j.data.mapping.model.annotated.usertypes;
import kr.debop4j.core.tools.HashTool;
import org.hibernate.HibernateException;
import org.hibernate.annotations.common.util.ReflectHelper;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.type.StandardBasicTypes;
import org.hibernate.type.StringType;
import org.hibernate.usertype.EnhancedUserType;
import org.hibernate.usertype.ParameterizedType;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Objects;
import java.util.Properties;
/**
* org.annotated.mapping.domain.model.usertypes.StringEnumUserType
*
* @author 배성혁 ( sunghyouk.bae@gmail.com )
* @since 12. 12. 6.
*/
public class StringEnumUserType implements EnhancedUserType, ParameterizedType {
private Class<Enum> enumClass;
@Override
public String objectToSQLString(Object value) {
return '\'' + ((Enum) value).name() + '\'';
}
@Override
public String toXMLString(Object value) {
return ((Enum) value).name();
}
@Override
public Object fromXMLString(String xmlValue) {
return Enum.valueOf(enumClass, xmlValue);
}
@Override
@SuppressWarnings("unchecked")
public void setParameterValues(Properties parameters) {
String enumClassName = parameters.getProperty("enumClassName");
try {
enumClass = ReflectHelper.classForName(enumClassName);
} catch (ClassNotFoundException e) {
throw new HibernateException("Enum class not found. enumClassName=" + enumClassName, e);
}
}
@Override
public int[] sqlTypes() {
return new int[] { StandardBasicTypes.STRING.sqlType() };
}
@Override
public Class returnedClass() {
return enumClass;
}
@Override
public boolean equals(Object x, Object y) throws HibernateException {
return Objects.equals(x, y);
}
@Override
public int hashCode(Object x) throws HibernateException {
return HashTool.compute(x);
}
@Override
public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner)
throws HibernateException, SQLException {
String value = (String) StringType.INSTANCE.nullSafeGet(rs, names[0], session, owner);
return rs.wasNull() ? null : fromXMLString(value);
}
@Override
public void nullSafeSet(PreparedStatement st,
Object value,
int index,
SessionImplementor session) throws HibernateException, SQLException {
StringType.INSTANCE.nullSafeSet(st,
(value != null) ? value.toString() : null,
index,
session);
}
@Override
public Object deepCopy(Object value) throws HibernateException {
return value;
}
@Override
public boolean isMutable() {
return true;
}
@Override
public Serializable disassemble(Object value) throws HibernateException {
return (Serializable) deepCopy(value);
}
@Override
public Object assemble(Serializable cached, Object owner) throws HibernateException {
return deepCopy(cached);
}
@Override
public Object replace(Object original, Object target, Object owner) throws HibernateException {
return deepCopy(original);
}
}