From: <hib...@li...> - 2006-04-19 23:12:30
|
Author: epbernard Date: 2006-04-19 19:12:27 -0400 (Wed, 19 Apr 2006) New Revision: 9771 Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/type/AbstractLobType.java trunk/HibernateExt/metadata/src/java/org/hibernate/type/CharacterArrayClobType.java trunk/HibernateExt/metadata/src/java/org/hibernate/type/EnumType.java trunk/HibernateExt/metadata/src/java/org/hibernate/type/StringClobType.java Log: ANN-319 make types serializable and thread safe Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/type/AbstractLobType.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/type/AbstractLobType.java 2006-04-19 19:19:13 UTC (rev 9770) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/type/AbstractLobType.java 2006-04-19 23:12:27 UTC (rev 9771) @@ -4,6 +4,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.io.Serializable; import org.hibernate.EntityMode; import org.hibernate.HibernateException; @@ -14,7 +15,7 @@ /** * @author Emmanuel Bernard */ -public abstract class AbstractLobType extends AbstractType { +public abstract class AbstractLobType extends AbstractType implements Serializable { public boolean isDirty(Object old, Object current, boolean[] checkable, SessionImplementor session) throws HibernateException { return checkable[0] ? ! isEqual( old, current, session.getEntityMode() ) : false; Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/type/CharacterArrayClobType.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/type/CharacterArrayClobType.java 2006-04-19 19:19:13 UTC (rev 9770) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/type/CharacterArrayClobType.java 2006-04-19 23:12:27 UTC (rev 9771) @@ -1,10 +1,6 @@ //$Id$ package org.hibernate.type; -import org.hibernate.HibernateException; -import org.hibernate.util.ArrayHelper; -import org.hibernate.usertype.UserType; - import java.io.CharArrayReader; import java.io.IOException; import java.io.Reader; @@ -15,13 +11,17 @@ import java.sql.Types; import java.util.ArrayList; +import org.hibernate.HibernateException; +import org.hibernate.usertype.UserType; +import org.hibernate.util.ArrayHelper; + /** * Map a Character[] to a Clob * Experimental * * @author Emmanuel Bernard */ -public class CharacterArrayClobType implements UserType { +public class CharacterArrayClobType implements UserType, Serializable { public static final int BUFFER_SIZE = 4096; public int[] sqlTypes() { Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/type/EnumType.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/type/EnumType.java 2006-04-19 19:19:13 UTC (rev 9770) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/type/EnumType.java 2006-04-19 23:12:27 UTC (rev 9771) @@ -2,6 +2,8 @@ package org.hibernate.type; import java.io.Serializable; +import java.io.ObjectInputStream; +import java.io.IOException; import java.lang.reflect.Method; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -15,6 +17,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; +import org.hibernate.AssertionFailure; import org.hibernate.util.StringHelper; import org.hibernate.util.ReflectHelper; import org.hibernate.usertype.ParameterizedType; @@ -25,7 +28,8 @@ * Try and find the appropriate SQL type depending on column metadata * @author Emmanuel Bernard */ -public class EnumType implements UserType, ParameterizedType { +//TODO implements readobject/writeobject to recalculate the enumclasses +public class EnumType implements UserType, ParameterizedType, Serializable { private static Log log = LogFactory.getLog(EnumType.class); private static final boolean IS_TRACE_ENABLED; static { @@ -76,17 +80,7 @@ } if (object instanceof Number) { Object[] values = enumValues.get(enumClass); - if (values == null) { - try { - Method method = null; - method = enumClass.getDeclaredMethod( "values", new Class[0] ); - values = (Object[]) method.invoke(null, new Object[0] ); - enumValues.put( enumClass, values ); - } - catch (Exception e) { - throw new HibernateException("Error while accessing enum.values(): " + enumClass, e); - } - } + if (values == null) throw new AssertionFailure("enumValues not preprocessed: " + enumClass); int ordinal = ( (Number) object ).intValue(); if (ordinal < 0 || ordinal >= values.length) { throw new IllegalArgumentException("Unknown ordinal value for enum " + enumClass + ": " + ordinal); @@ -283,6 +277,8 @@ catch (ClassNotFoundException exception) { throw new HibernateException("Enum class not found", exception); } + //this is threadsafe to do it here, setParameterValues() is called sequencially + initEnumValue(); //nullify unnullified properties yuck! schema = parameters.getProperty(SCHEMA); if ( "".equals( schema ) ) schema = null; @@ -296,4 +292,25 @@ guessed = true; } } + + private void initEnumValue() { + Object[] values = enumValues.get(enumClass); + if (values == null) { + try { + Method method = null; + method = enumClass.getDeclaredMethod( "values", new Class[0] ); + values = (Object[]) method.invoke(null, new Object[0] ); + enumValues.put( enumClass, values ); + } + catch (Exception e) { + throw new HibernateException("Error while accessing enum.values(): " + enumClass, e); + } + } + } + + private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException { + //FIXME Hum, I think I break the thread safety here + ois.defaultReadObject(); + initEnumValue(); + } } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/type/StringClobType.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/type/StringClobType.java 2006-04-19 19:19:13 UTC (rev 9770) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/type/StringClobType.java 2006-04-19 23:12:27 UTC (rev 9771) @@ -18,7 +18,7 @@ * * @author Emmanuel Bernard */ -public class StringClobType implements UserType { +public class StringClobType implements UserType, Serializable { public int[] sqlTypes() { return new int[] { Types.CLOB }; } |