/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.spatial.dialect.oracle;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import org.hibernate.HibernateException;
import org.hibernate.type.descriptor.ValueBinder;
import org.hibernate.type.descriptor.WrapperOptions;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
import org.geolatte.geom.Geometry;
import org.geolatte.geom.codec.db.oracle.Encoders;
import org.geolatte.geom.codec.db.oracle.OracleJDBCTypeFactory;
import org.geolatte.geom.codec.db.oracle.SDOGeometry;
/**
* @author Karel Maesen, Geovise BVBA
* creation-date: 8/22/11
*/
class SDOGeometryValueBinder<J> implements ValueBinder<J> {
private static final String SQL_TYPE_NAME = "MDSYS.SDO_GEOMETRY";
private final OracleJDBCTypeFactory typeFactory;
private final JavaTypeDescriptor<J> javaTypeDescriptor;
public SDOGeometryValueBinder(
JavaTypeDescriptor<J> javaTypeDescriptor,
SqlTypeDescriptor sqlTypeDescriptor,
OracleJDBCTypeFactory typeFactory) {
this.javaTypeDescriptor = javaTypeDescriptor;
this.typeFactory = typeFactory;
}
@Override
public void bind(PreparedStatement st, J value, int index, WrapperOptions options) throws SQLException {
if ( value == null ) {
st.setNull( index, Types.STRUCT, SQL_TYPE_NAME );
}
else {
final Geometry geometry = javaTypeDescriptor.unwrap( value, Geometry.class, options );
final Object dbGeom = toNative( geometry, st.getConnection() );
st.setObject( index, dbGeom );
}
}
@Override
public void bind(
CallableStatement st, J value, String name, WrapperOptions options) throws SQLException {
if ( value == null ) {
st.setNull( name, Types.STRUCT, SQL_TYPE_NAME );
}
else {
final Geometry geometry = javaTypeDescriptor.unwrap( value, Geometry.class, options );
final Object dbGeom = toNative( geometry, st.getConnection() );
st.setObject( name, dbGeom );
}
}
public Object store(SDOGeometry geom, Connection conn) throws SQLException {
return typeFactory.createStruct( geom, conn );
}
private Object toNative(Geometry geom, Connection connection) {
try {
final SDOGeometry sdoGeom = Encoders.encode( geom );
return store( sdoGeom, connection );
}
catch (SQLException e) {
throw new HibernateException( "Problem during conversion from JTS to SDOGeometry", e );
}
catch (IllegalArgumentException e) {
//we get here if the type of geometry is unsupported by geolatte encoders
throw new HibernateException( e.getMessage() );
}
catch(Exception e) {
throw new HibernateException( e );
}
}
}