/*
* Copyright 2010, 2011, 2012 Christopher Pheby
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jadira.usertype.spi.shared;
import static org.jadira.usertype.spi.utils.reflection.ArrayUtils.copyOf;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.type.AbstractSingleColumnStandardBasicType;
import org.hibernate.type.TypeResolver;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
import org.hibernate.usertype.EnhancedUserType;
public abstract class AbstractHeuristicUserType extends AbstractUserType implements EnhancedUserType, Serializable {
private static final long serialVersionUID = 7099384329368123541L;
private Class<?> identifierType;
private AbstractSingleColumnStandardBasicType<?> type;
private int[] sqlTypes;
protected void setIdentifierType(Class<?> identifierType) {
this.identifierType = identifierType;
}
protected Class<?> getIdentifierType() {
return identifierType;
}
protected AbstractSingleColumnStandardBasicType<?> getType() {
return type;
}
public void setParameterValues(Properties parameters) {
@SuppressWarnings("unchecked")
final AbstractSingleColumnStandardBasicType<? extends Object> heuristicType = (AbstractSingleColumnStandardBasicType<? extends Object>) new TypeResolver().heuristicType(identifierType.getName(), parameters);
if (heuristicType == null) {
throw new HibernateException("Unsupported identifier type " + identifierType.getName());
}
type = heuristicType;
sqlTypes = new int[]{ type.sqlType() };
}
public int[] sqlTypes() {
return copyOf(sqlTypes);
}
@Override
public abstract Class<?> returnedClass();
@Override
public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException {
beforeNullSafeOperation(session);
try {
try {
return doNullSafeGet(rs, names, session, owner);
} catch (IllegalArgumentException e) {
throw new HibernateException(
"Exception during nullSafeGet of type '"
+ identifierType.getName() + "'", e);
} catch (IllegalAccessException e) {
throw new HibernateException(
"Exception during nullSafeGet of type '"
+ identifierType.getName() + "'", e);
} catch (InvocationTargetException e) {
throw new HibernateException(
"Exception during nullSafeGet of type '"
+ identifierType.getName() + "'", e);
}
} finally {
afterNullSafeOperation(session);
}
}
public abstract Object doNullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException, IllegalArgumentException, IllegalAccessException, InvocationTargetException;
@Override
public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index, SharedSessionContractImplementor session) throws SQLException {
beforeNullSafeOperation(session);
try {
doNullSafeSet(preparedStatement, value, index, session);
} catch (IllegalArgumentException e) {
throw new HibernateException(
"Exception during nullSafeSet of type '"
+ identifierType.getName() + "'", e);
} catch (IllegalAccessException e) {
throw new HibernateException(
"Exception during nullSafeSet of type '"
+ identifierType.getName() + "'", e);
} catch (InvocationTargetException e) {
} finally {
afterNullSafeOperation(session);
}
}
public abstract void doNullSafeSet(PreparedStatement preparedStatement, Object value, int index, SharedSessionContractImplementor session) throws SQLException, IllegalArgumentException, IllegalAccessException, InvocationTargetException;
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public String objectToSQLString(Object object) {
final JavaTypeDescriptor desc = type.getJavaTypeDescriptor();
return desc.toString(object);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public String toXMLString(Object object) {
final JavaTypeDescriptor desc = type.getJavaTypeDescriptor();
return desc.toString(object);
}
@Override
public Object fromXMLString(String string) {
return type.fromString(string);
}
}