/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License, version 2 as published by the Free Software * Foundation. * * You should have received a copy of the GNU General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * 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 General Public License for more details. * * * Copyright 2007-2008 Pentaho Corporation. All rights reserved. * * @created Oct 22, 2007 * @author Marc Batchelor * */ /* * Class for persisting lists and other collections. Using serialization to persist these items. * I'm using this class because I have a requirement to have a map element that may be a map or * some other collection of strings. */ package org.pentaho.platform.repository.hibernate.usertypes; import java.io.Serializable; import java.sql.Blob; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; import org.hibernate.type.SerializationException; import org.hibernate.usertype.UserType; import org.pentaho.platform.repository.messages.Messages; public class BlobtoByteArrayUserType implements UserType { private static final Log log = LogFactory.getLog(BlobtoByteArrayUserType.class); private static final int[] SQLTYPE = { Types.BLOB }; /* * (non-Javadoc) * * @see org.hibernate.usertype.UserType#sqlTypes() */ public int[] sqlTypes() { return BlobtoByteArrayUserType.SQLTYPE; } /* * (non-Javadoc) * * @see org.hibernate.usertype.UserType#returnedClass() */ public Class returnedClass() { return byte[].class; } /* * (non-Javadoc) * * @see org.hibernate.usertype.UserType#equals(java.lang.Object, * java.lang.Object) */ public boolean equals(final Object x, final Object y) throws HibernateException { return (x == y) || ((x != null) && (y != null) && java.util.Arrays.equals((byte[]) x, (byte[]) y)); } /* * (non-Javadoc) * * @see org.hibernate.usertype.UserType#hashCode(java.lang.Object) */ public int hashCode(final Object arg0) throws HibernateException { return arg0.hashCode(); } /* * (non-Javadoc) * * @see org.hibernate.usertype.UserType#nullSafeGet(java.sql.ResultSet, * java.lang.String[], java.lang.Object) */ public Object nullSafeGet(final ResultSet arg0, final String[] arg1, final Object arg2) throws HibernateException, SQLException { Blob blob = arg0.getBlob(arg1[0]); if (blob != null) { byte[] bytes = blob.getBytes(1, (int) blob.length()); return bytes; } return null; } /* * (non-Javadoc) * * @see org.hibernate.usertype.UserType#nullSafeSet(java.sql.PreparedStatement, * java.lang.Object, int) */ public void nullSafeSet(final PreparedStatement arg0, final Object arg1, final int arg2) throws HibernateException, SQLException { if (arg1 != null) { try { arg0.setBytes(arg2, (byte[]) arg1); } catch (SerializationException ex) { BlobtoByteArrayUserType.log.error(Messages.getInstance().getErrorString("BLOBUTYPE.ERROR_0001_SETTING_BLOB"), ex); //$NON-NLS-1$ throw new HibernateException(Messages.getInstance().getErrorString("BLOBUTYPE.ERROR_0001_SETTING_BLOB"), ex); //$NON-NLS-1$ } } else { arg0.setNull(arg2, sqlTypes()[0]); } } /* * (non-Javadoc) * * @see org.hibernate.usertype.UserType#deepCopy(java.lang.Object) */ public Object deepCopy(final Object value) { if (value == null) { return null; } byte[] bytes = (byte[]) value; byte[] result = new byte[bytes.length]; System.arraycopy(bytes, 0, result, 0, bytes.length); return result; } /* * (non-Javadoc) * * @see org.hibernate.usertype.UserType#isMutable() */ public boolean isMutable() { return true; } /* * (non-Javadoc) * * @see org.hibernate.usertype.UserType#disassemble(java.lang.Object) */ public Serializable disassemble(final Object arg0) throws HibernateException { return (Serializable) deepCopy(arg0); } /* * (non-Javadoc) * * @see org.hibernate.usertype.UserType#assemble(java.io.Serializable, * java.lang.Object) */ public Object assemble(final Serializable arg0, final Object arg1) throws HibernateException { return (deepCopy(arg0)); } /* * (non-Javadoc) * * @see org.hibernate.usertype.UserType#replace(java.lang.Object, * java.lang.Object, java.lang.Object) */ public Object replace(final Object arg0, final Object arg1, final Object arg2) throws HibernateException { return (deepCopy(arg0)); } }