Package com.zycus.dotproject.bo

Source Code of com.zycus.dotproject.bo.GenericEnumUserType

package com.zycus.dotproject.bo;

import java.io.Serializable;
import java.lang.reflect.Method;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import org.hibernate.HibernateException;
import org.hibernate.type.NullableType;
import org.hibernate.type.TypeFactory;
import org.hibernate.usertype.ParameterizedType;
import org.hibernate.usertype.UserType;

public class GenericEnumUserType implements UserType, ParameterizedType {
  private static final String  DEFAULT_IDENTIFIER_METHOD_NAME  = "name";
  private static final String  DEFAULT_VALUE_OF_METHOD_NAME  = "valueOf";

  private Class        enumClass            = null;
  private Class        identifierType          = null;
  private Method        identifierMethod        = null;
  private Method        valueOfMethod          = null;
  private NullableType    type              = null;
  private int[]        sqlTypes            = null;

  public void setParameterValues(Properties parameters) {
    String enumClassName = parameters.getProperty("enumClassName");
    try {
      enumClass = Class.forName(enumClassName).asSubclass(Enum.class);
    } catch (ClassNotFoundException cfne) {
      throw new HibernateException("Enum class not found", cfne);
    }

    String identifierMethodName = parameters.getProperty("identifierMethod", DEFAULT_IDENTIFIER_METHOD_NAME);

    try {
      identifierMethod = enumClass.getMethod(identifierMethodName, new Class[0]);
      identifierType = identifierMethod.getReturnType();
    } catch (Exception a_th) {
      throw new HibernateException("Failed to obtain identifier method", a_th);
    }

    type = (NullableType) TypeFactory.basic(identifierType.getName());

    if (type == null) {
      throw new HibernateException("Unsupported identifier type " + identifierType.getName());
    }

    sqlTypes = new int[] { type.sqlType() };

    String valueOfMethodName = parameters.getProperty("valueOfMethod", DEFAULT_VALUE_OF_METHOD_NAME);

    try {
      valueOfMethod = enumClass.getMethod(valueOfMethodName, new Class[] { identifierType });
    } catch (Exception a_th) {
      throw new HibernateException("Failed to obtain valueOf method", a_th);
    }
  }

  public Class returnedClass() {
    return enumClass;
  }

  public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
    Object identifier = type.get(rs, names[0]);
    if (rs.wasNull()) {
      return null;
    }

    try {
      return valueOfMethod.invoke(enumClass, new Object[] { identifier });
    } catch (Exception a_th) {
      throw new HibernateException("Exception while invoking " + "valueOf method '" + valueOfMethod.getName() + "' of " + "enumeration class '" + enumClass + "'", a_th);
    }
  }

  public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
    try {
      if (value == null) {
        st.setNull(index, type.sqlType());
      } else {
        Object identifier = identifierMethod.invoke(value, new Object[0]);
        type.set(st, identifier, index);
      }
    } catch (Exception a_th) {
      throw new HibernateException("Exception while invoking " + "identifierMethod '" + identifierMethod.getName() + "' of " + "enumeration class '" + enumClass + "'", a_th);
    }
  }

  public int[] sqlTypes() {
    return sqlTypes;
  }

  public Object assemble(Serializable cached, Object owner) throws HibernateException {
    return cached;
  }

  public Object deepCopy(Object value) throws HibernateException {
    return value;
  }

  public Serializable disassemble(Object value) throws HibernateException {
    return (Serializable) value;
  }

  public boolean equals(Object x, Object y) throws HibernateException {
    return x == y;
  }

  public int hashCode(Object x) throws HibernateException {
    return x.hashCode();
  }

  public boolean isMutable() {
    return false;
  }

  public Object replace(Object original, Object target, Object owner) throws HibernateException {
    return original;
  }
}
TOP

Related Classes of com.zycus.dotproject.bo.GenericEnumUserType

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.