HHH-5147 Applied patch and removed obsolete code and comments
git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@19611 1b8cb986-b30d-0410-93ca-fae66ebed9b2
This commit is contained in:
parent
db5b3a4c0a
commit
21af0d0146
|
@ -24,27 +24,29 @@
|
||||||
package org.hibernate.type;
|
package org.hibernate.type;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Types;
|
import java.sql.Types;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.util.StringHelper;
|
|
||||||
import org.hibernate.usertype.EnhancedUserType;
|
import org.hibernate.usertype.EnhancedUserType;
|
||||||
import org.hibernate.usertype.ParameterizedType;
|
import org.hibernate.usertype.ParameterizedType;
|
||||||
import org.hibernate.util.ReflectHelper;
|
import org.hibernate.util.ReflectHelper;
|
||||||
import org.slf4j.Logger;
|
import org.hibernate.util.StringHelper;
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enum type mapper
|
* Enum type mapper
|
||||||
* Try and find the appropriate SQL type depending on column metadata
|
* Try and find the appropriate SQL type depending on column metadata
|
||||||
* <p/>
|
* <p/>
|
||||||
* TODO implements readobject/writeobject to recalculate the enumclasses
|
* TODO implements readobject/writeobject to recalculate the enumclasses
|
||||||
|
*
|
||||||
* @author Emmanuel Bernard
|
* @author Emmanuel Bernard
|
||||||
|
* @author Hardy Ferentschik
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class EnumType implements EnhancedUserType, ParameterizedType, Serializable {
|
public class EnumType implements EnhancedUserType, ParameterizedType, Serializable {
|
||||||
|
@ -56,7 +58,8 @@ public class EnumType implements EnhancedUserType, ParameterizedType, Serializab
|
||||||
* in order to check the trace-enablement. Driving this via a central Log-specific class
|
* in order to check the trace-enablement. Driving this via a central Log-specific class
|
||||||
* would alleviate that performance hit, and yet still allow more "normal" logging usage/config.
|
* would alleviate that performance hit, and yet still allow more "normal" logging usage/config.
|
||||||
*/
|
*/
|
||||||
private static final boolean IS_VALUE_TRACING_ENABLED = LoggerFactory.getLogger( StringHelper.qualifier( Type.class.getName() ) ).isTraceEnabled();
|
private static final boolean IS_VALUE_TRACING_ENABLED = LoggerFactory.getLogger( StringHelper.qualifier( Type.class.getName() ) )
|
||||||
|
.isTraceEnabled();
|
||||||
private transient Logger log;
|
private transient Logger log;
|
||||||
|
|
||||||
private Logger log() {
|
private Logger log() {
|
||||||
|
@ -75,12 +78,10 @@ public class EnumType implements EnhancedUserType, ParameterizedType, Serializab
|
||||||
|
|
||||||
private Class<? extends Enum> enumClass;
|
private Class<? extends Enum> enumClass;
|
||||||
private transient Object[] enumValues;
|
private transient Object[] enumValues;
|
||||||
private String catalog;
|
|
||||||
private String schema;
|
|
||||||
private int sqlType = Types.INTEGER; //before any guessing
|
private int sqlType = Types.INTEGER; //before any guessing
|
||||||
|
|
||||||
public int[] sqlTypes() {
|
public int[] sqlTypes() {
|
||||||
return new int[]{sqlType};
|
return new int[] { sqlType };
|
||||||
}
|
}
|
||||||
|
|
||||||
public Class<? extends Enum> returnedClass() {
|
public Class<? extends Enum> returnedClass() {
|
||||||
|
@ -95,7 +96,7 @@ public class EnumType implements EnhancedUserType, ParameterizedType, Serializab
|
||||||
return x == null ? 0 : x.hashCode();
|
return x == null ? 0 : x.hashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
|
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
|
||||||
Object object = rs.getObject( names[0] );
|
Object object = rs.getObject( names[0] );
|
||||||
if ( rs.wasNull() ) {
|
if ( rs.wasNull() ) {
|
||||||
|
@ -106,7 +107,7 @@ public class EnumType implements EnhancedUserType, ParameterizedType, Serializab
|
||||||
}
|
}
|
||||||
if ( object instanceof Number ) {
|
if ( object instanceof Number ) {
|
||||||
initEnumValues();
|
initEnumValues();
|
||||||
int ordinal = ( (Number) object ).intValue();
|
int ordinal = ( ( Number ) object ).intValue();
|
||||||
if ( ordinal < 0 || ordinal >= enumValues.length ) {
|
if ( ordinal < 0 || ordinal >= enumValues.length ) {
|
||||||
throw new IllegalArgumentException( "Unknown ordinal value for enum " + enumClass + ": " + ordinal );
|
throw new IllegalArgumentException( "Unknown ordinal value for enum " + enumClass + ": " + ordinal );
|
||||||
}
|
}
|
||||||
|
@ -116,36 +117,37 @@ public class EnumType implements EnhancedUserType, ParameterizedType, Serializab
|
||||||
return enumValues[ordinal];
|
return enumValues[ordinal];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
String name = (String) object;
|
String name = ( String ) object;
|
||||||
if ( IS_VALUE_TRACING_ENABLED ) {
|
if ( IS_VALUE_TRACING_ENABLED ) {
|
||||||
log().debug( "Returning '{}' as column {}", name, names[0] );
|
log().debug( "Returning '{}' as column {}", name, names[0] );
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
return Enum.valueOf( enumClass, name );
|
return Enum.valueOf( enumClass, name );
|
||||||
}
|
}
|
||||||
catch (IllegalArgumentException iae) {
|
catch ( IllegalArgumentException iae ) {
|
||||||
throw new IllegalArgumentException( "Unknown name value for enum " + enumClass + ": " + name, iae );
|
throw new IllegalArgumentException( "Unknown name value for enum " + enumClass + ": " + name, iae );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
|
public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
|
||||||
//if (!guessed) guessType( st, index );
|
|
||||||
if ( value == null ) {
|
if ( value == null ) {
|
||||||
if ( IS_VALUE_TRACING_ENABLED ) log().debug( "Binding null to parameter: {}", index );
|
if ( IS_VALUE_TRACING_ENABLED ) {
|
||||||
|
log().debug( "Binding null to parameter: {}", index );
|
||||||
|
}
|
||||||
st.setNull( index, sqlType );
|
st.setNull( index, sqlType );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
boolean isOrdinal = isOrdinal( sqlType );
|
boolean isOrdinal = isOrdinal( sqlType );
|
||||||
if ( isOrdinal ) {
|
if ( isOrdinal ) {
|
||||||
int ordinal = ( (Enum<?>) value ).ordinal();
|
int ordinal = ( ( Enum<?> ) value ).ordinal();
|
||||||
if ( IS_VALUE_TRACING_ENABLED ) {
|
if ( IS_VALUE_TRACING_ENABLED ) {
|
||||||
log().debug( "Binding '{}' to parameter: {}", ordinal, index );
|
log().debug( "Binding '{}' to parameter: {}", ordinal, index );
|
||||||
}
|
}
|
||||||
st.setObject( index, Integer.valueOf( ordinal ), sqlType );
|
st.setObject( index, Integer.valueOf( ordinal ), sqlType );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
String enumString = ( (Enum<?>) value ).name();
|
String enumString = ( ( Enum<?> ) value ).name();
|
||||||
if ( IS_VALUE_TRACING_ENABLED ) {
|
if ( IS_VALUE_TRACING_ENABLED ) {
|
||||||
log().debug( "Binding '{}' to parameter: {}", enumString, index );
|
log().debug( "Binding '{}' to parameter: {}", enumString, index );
|
||||||
}
|
}
|
||||||
|
@ -183,7 +185,7 @@ public class EnumType implements EnhancedUserType, ParameterizedType, Serializab
|
||||||
}
|
}
|
||||||
|
|
||||||
public Serializable disassemble(Object value) throws HibernateException {
|
public Serializable disassemble(Object value) throws HibernateException {
|
||||||
return (Serializable) value;
|
return ( Serializable ) value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object assemble(Serializable cached, Object owner) throws HibernateException {
|
public Object assemble(Serializable cached, Object owner) throws HibernateException {
|
||||||
|
@ -199,23 +201,13 @@ public class EnumType implements EnhancedUserType, ParameterizedType, Serializab
|
||||||
try {
|
try {
|
||||||
enumClass = ReflectHelper.classForName( enumClassName, this.getClass() ).asSubclass( Enum.class );
|
enumClass = ReflectHelper.classForName( enumClassName, this.getClass() ).asSubclass( Enum.class );
|
||||||
}
|
}
|
||||||
catch (ClassNotFoundException exception) {
|
catch ( ClassNotFoundException exception ) {
|
||||||
throw new HibernateException( "Enum class not found", exception );
|
throw new HibernateException( "Enum class not found", exception );
|
||||||
}
|
}
|
||||||
// is might be good to call it here, to see a possible error immediately
|
|
||||||
// initEnumValue();
|
|
||||||
|
|
||||||
//nullify unnullified properties yuck!
|
|
||||||
schema = parameters.getProperty( SCHEMA );
|
|
||||||
if ( "".equals( schema ) ) schema = null;
|
|
||||||
catalog = parameters.getProperty( CATALOG );
|
|
||||||
if ( "".equals( catalog ) ) catalog = null;
|
|
||||||
// table = parameters.getProperty( TABLE );
|
|
||||||
// column = parameters.getProperty( COLUMN );
|
|
||||||
String type = parameters.getProperty( TYPE );
|
String type = parameters.getProperty( TYPE );
|
||||||
if ( type != null ) {
|
if ( type != null ) {
|
||||||
sqlType = Integer.decode( type ).intValue();
|
sqlType = Integer.decode( type );
|
||||||
// guessed = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -224,41 +216,32 @@ public class EnumType implements EnhancedUserType, ParameterizedType, Serializab
|
||||||
*/
|
*/
|
||||||
private void initEnumValues() {
|
private void initEnumValues() {
|
||||||
if ( enumValues == null ) {
|
if ( enumValues == null ) {
|
||||||
try {
|
this.enumValues = enumClass.getEnumConstants();
|
||||||
Method method = enumClass.getDeclaredMethod( "values" );
|
if ( enumValues == null ) {
|
||||||
enumValues = (Object[]) method.invoke( null );
|
throw new NullPointerException( "Failed to init enumValues" );
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
throw new HibernateException( "Error while accessing enum.values(): " + enumClass, e );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// is might be good to call initEnumValues() here, to see a possible error immediatelly, otherwise leave it commented
|
|
||||||
// private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
|
|
||||||
// initEnumValues();
|
|
||||||
// ois.defaultReadObject();
|
|
||||||
// }
|
|
||||||
|
|
||||||
public String objectToSQLString(Object value) {
|
public String objectToSQLString(Object value) {
|
||||||
boolean isOrdinal = isOrdinal( sqlType );
|
boolean isOrdinal = isOrdinal( sqlType );
|
||||||
if ( isOrdinal ) {
|
if ( isOrdinal ) {
|
||||||
int ordinal = ( (Enum) value ).ordinal();
|
int ordinal = ( ( Enum ) value ).ordinal();
|
||||||
return Integer.toString( ordinal );
|
return Integer.toString( ordinal );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return '\'' + ( (Enum) value ).name() + '\'';
|
return '\'' + ( ( Enum ) value ).name() + '\'';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toXMLString(Object value) {
|
public String toXMLString(Object value) {
|
||||||
boolean isOrdinal = isOrdinal( sqlType );
|
boolean isOrdinal = isOrdinal( sqlType );
|
||||||
if ( isOrdinal ) {
|
if ( isOrdinal ) {
|
||||||
int ordinal = ( (Enum) value ).ordinal();
|
int ordinal = ( ( Enum ) value ).ordinal();
|
||||||
return Integer.toString( ordinal );
|
return Integer.toString( ordinal );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return ( (Enum) value ).name();
|
return ( ( Enum ) value ).name();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,11 +254,11 @@ public class EnumType implements EnhancedUserType, ParameterizedType, Serializab
|
||||||
}
|
}
|
||||||
return enumValues[ordinal];
|
return enumValues[ordinal];
|
||||||
}
|
}
|
||||||
catch(NumberFormatException e) {
|
catch ( NumberFormatException e ) {
|
||||||
try {
|
try {
|
||||||
return Enum.valueOf( enumClass, xmlValue );
|
return Enum.valueOf( enumClass, xmlValue );
|
||||||
}
|
}
|
||||||
catch (IllegalArgumentException iae) {
|
catch ( IllegalArgumentException iae ) {
|
||||||
throw new IllegalArgumentException( "Unknown name value for enum " + enumClass + ": " + xmlValue, iae );
|
throw new IllegalArgumentException( "Unknown name value for enum " + enumClass + ": " + xmlValue, iae );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue