/* * EuroCarbDB, a framework for carbohydrate bioinformatics * * Copyright (c) 2006-2009, Eurocarb project, or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * A copy of this license accompanies this distribution in the file LICENSE.txt. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * Last commit: $Rev: 1279 $ by $Author: glycoslave $ on $Date:: 2009-06-27 #$ */ package org.eurocarbdb.dataaccess.hibernate; import java.util.Properties; import java.io.Serializable; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.PreparedStatement; import org.hibernate.Hibernate; import org.hibernate.HibernateException; import org.hibernate.usertype.UserType; //import org.hibernate.usertype.ParameterizedType; import org.eurocarbdb.sugar.SugarSequence; import org.eurocarbdb.sugar.SequenceFormat; /** * This class implements a {@link SugarSequence} * <a href="http://www.hibernate.org/hib_docs/reference/en/html/mapping-types.html#mapping-types-custom"> * Hibernate custom type</a>. It basically handles the interconversion of a JDBC SQL string * to and from a SugarSequence object. * * @see http://www.hibernate.org/hib_docs/reference/en/html/mapping.html#mapping-types-custom * @see SugarSequence * @see UserType * @author mjh */ public final class SugarSequenceUserType implements UserType { /* public void setParameterValues( Properties parameters ) { } */ /** The class type this class converts stuff to. */ public Class returnedClass() { return SugarSequence.class; } /** * Handles translation of JDBC {@link ResultSet} to * a returned {@link SugarSequence} object, returning null * if the result set {@link ResultSet#wasNull was null}. */ public Object nullSafeGet( ResultSet resultSet, String[] names, Object owner ) throws HibernateException, SQLException { String seq = resultSet.getString( names[0] ); if ( resultSet.wasNull() ) return null; return new SugarSequence( seq ); } /** * Handles translation of {@link SugarSequence} object data * to a JDBC {@link PreparedStatement}. */ public void nullSafeSet( PreparedStatement st, Object value, int index ) throws HibernateException, SQLException { if ( value == null ) { st.setNull( index, Hibernate.STRING.sqlType() ); } else { assert value instanceof SugarSequence; SugarSequence sseq = (SugarSequence) value; st.setString( index, sseq.toString( SequenceFormat.Glycoct ) ); } } /** * Array of SQL types required by this user type. This * used for instance, for automatic DDL generation. */ public int[] sqlTypes() { return new int[] { Hibernate.STRING.sqlType() }; } /** * {@link SugarSequence} is immutable, so directly returns the * cached object argument. */ public Object assemble( Serializable cached, Object owner ) throws HibernateException { return cached; } /** * Makes a deep copy of the passed value. {@link SugarSequence} * is immutable, so this method only returns the passed value. */ public Object deepCopy( Object value ) throws HibernateException { return value; } /** * {@link SugarSequence} is immutable and serialisable, so * directly returns the passed object argument. */ public Serializable disassemble( Object value ) throws HibernateException { return (Serializable) value; } public boolean equals( Object x, Object y ) throws HibernateException { if ( x == y ) return true; if ( x == null || y == null ) return false; return x.equals( y ); } public int hashCode( Object x ) throws HibernateException { return x.hashCode(); } /** * Always returns false, since {@link SugarSequence} is * an immutable class. */ public boolean isMutable() { return false; } /** * Merges object state; we just return the 'original' argument * as SugarSequence is immutable. */ public Object replace( Object original, Object target, Object owner ) throws HibernateException { return original; } } // end class