From 2738d0f5c7a27c6da1f91e939b870a21a2dd34d9 Mon Sep 17 00:00:00 2001 From: Karel Maesen Date: Wed, 1 Apr 2015 22:59:41 +0200 Subject: [PATCH] HHH-6512 - Refactors Oracle support. --- hibernate-spatial/hibernate-spatial.gradle | 1 - .../dialect/oracle/ConnectionFinder.java | 45 -- .../oracle/DefaultConnectionFinder.java | 112 ---- .../spatial/dialect/oracle/ElemInfo.java | 140 ----- .../spatial/dialect/oracle/ElementType.java | 121 ---- .../dialect/oracle/OracleJDBCTypeFactory.java | 224 ------- .../oracle/OracleSpatial10gDialect.java | 545 ------------------ .../spatial/dialect/oracle/Ordinates.java | 92 --- .../spatial/dialect/oracle/SDOGType.java | 131 ----- .../spatial/dialect/oracle/SDOGeometry.java | 347 ----------- .../oracle/SDOGeometryTypeDescriptor.java | 1 + .../oracle/SDOGeometryValueBinder.java | 387 +------------ .../oracle/SDOGeometryValueExtractor.java | 481 +--------------- .../spatial/dialect/oracle/SDOPoint.java | 60 -- .../dialect/oracle/SQLTypeFactory.java | 51 -- .../spatial/dialect/oracle/TypeGeometry.java | 56 -- .../SDOGeometryExpectationsFactory.java | 2 +- 17 files changed, 41 insertions(+), 2755 deletions(-) delete mode 100644 hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/ConnectionFinder.java delete mode 100644 hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/DefaultConnectionFinder.java delete mode 100644 hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/ElemInfo.java delete mode 100644 hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/ElementType.java delete mode 100644 hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/OracleJDBCTypeFactory.java delete mode 100644 hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/OracleSpatial10gDialect.java delete mode 100644 hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/Ordinates.java delete mode 100644 hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGType.java delete mode 100644 hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGeometry.java delete mode 100644 hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOPoint.java delete mode 100644 hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SQLTypeFactory.java delete mode 100644 hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/TypeGeometry.java diff --git a/hibernate-spatial/hibernate-spatial.gradle b/hibernate-spatial/hibernate-spatial.gradle index 89b8d26d14..26a9782000 100644 --- a/hibernate-spatial/hibernate-spatial.gradle +++ b/hibernate-spatial/hibernate-spatial.gradle @@ -26,7 +26,6 @@ dependencies { compile(project(':hibernate-core')) compile([group: 'postgresql', name: 'postgresql', version: '8.4-701.jdbc4']) compile([group: 'org.geolatte', name: 'geolatte-geom', version: '1.0-SNAPSHOT']) -// compile([group: 'com.vividsolutions', name: 'jts', version: '1.12']) compile(libraries.dom4j) { transitive = false diff --git a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/ConnectionFinder.java b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/ConnectionFinder.java deleted file mode 100644 index d94e6ecca8..0000000000 --- a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/ConnectionFinder.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This file is part of Hibernate Spatial, an extension to the - * hibernate ORM solution for spatial (geographic) data. - * - * Copyright © 2007-2012 Geovise BVBA - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package org.hibernate.spatial.dialect.oracle; - -import java.sql.Connection; - -import org.hibernate.spatial.helper.FinderStrategy; - -/** - * The ConnectionFinder returns an OracleConnection when given a - * Connection object. - *

- * The SDOGeometryType requires access to an OracleConnection - * object when converting a geometry to SDOGeometry, prior to - * setting the geometry attribute in prepared statements. In some environments - * the prepared statements do not return an OracleConnection but - * a wrapper. Implementations of this interface attempt to retrieve the - * OracleConnection from the wrapper in such cases. - *

- *

Implementations should be thread-safe, and have a default (no-args) constructor.

- * - * @author Karel Maesen - */ -public interface ConnectionFinder extends - FinderStrategy { - -} diff --git a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/DefaultConnectionFinder.java b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/DefaultConnectionFinder.java deleted file mode 100644 index d989f43a90..0000000000 --- a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/DefaultConnectionFinder.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * This file is part of Hibernate Spatial, an extension to the - * hibernate ORM solution for spatial (geographic) data. - * - * Copyright © 2007-2012 Geovise BVBA - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package org.hibernate.spatial.dialect.oracle; - - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.sql.Connection; - -import org.hibernate.HibernateException; -import org.hibernate.spatial.helper.FinderException; - -/** - * Default ConnectionFinder implementation. - *

- * This implementation attempts to retrieve the OracleConnection - * by recursive reflection: it searches for methods that return - * Connection objects, executes these methods and checks the - * result. If the result is of type OracleConnection the object - * is returned, otherwise it recurses on it. - *

- *

- * - * @author Karel Maesen - */ -public class DefaultConnectionFinder implements ConnectionFinder { - - private static final Class ORACLE_CONNECTION_CLASS; - - static { - try { - ORACLE_CONNECTION_CLASS = Class.forName( "oracle.jdbc.driver.OracleConnection" ); - } - catch ( ClassNotFoundException e ) { - throw new HibernateException( "Can't find Oracle JDBC Driver on classpath." ); - } - } - - @Override - public Connection find(Connection con) throws FinderException { - if ( con == null ) { - return null; - } - - if ( ORACLE_CONNECTION_CLASS.isInstance( con ) ) { - return con; - } - // try to find the Oracleconnection recursively - for ( Method method : con.getClass().getMethods() ) { - if ( method.getReturnType().isAssignableFrom( - java.sql.Connection.class - ) - && method.getParameterTypes().length == 0 ) { - - try { - method.setAccessible( true ); - final Connection oc = find( (Connection) ( method.invoke( con, new Object[] { } ) ) ); - if ( oc == null ) { - throw new FinderException( - String.format( - "Tried retrieving OracleConnection from %s using method %s, but received null.", - con.getClass().getCanonicalName(), - method.getName() - ) - ); - } - return oc; - } - catch ( IllegalAccessException e ) { - throw new FinderException( - String.format( - "Illegal access on executing method %s when finding OracleConnection", - method.getName() - ) - ); - } - catch ( InvocationTargetException e ) { - throw new FinderException( - String.format( - "Invocation exception on executing method %s when finding OracleConnection", - method.getName() - ) - ); - } - - - } - } - throw new FinderException( - "Couldn't get at the OracleSpatial Connection object from the PreparedStatement." - ); - } - -} diff --git a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/ElemInfo.java b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/ElemInfo.java deleted file mode 100644 index 37887548d9..0000000000 --- a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/ElemInfo.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * This file is part of Hibernate Spatial, an extension to the - * hibernate ORM solution for spatial (geographic) data. - * - * Copyright © 2007-2012 Geovise BVBA - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package org.hibernate.spatial.dialect.oracle; - -import java.math.BigDecimal; -import java.sql.Array; - -/** - * @author Karel Maesen, Geovise BVBA - * creation-date: Jul 1, 2010 - */ -class ElemInfo { - - static final String TYPE_NAME = "MDSYS.SDO_ELEM_INFO_ARRAY"; - private BigDecimal[] triplets; - - public ElemInfo(int size) { - this.triplets = new BigDecimal[3 * size]; - } - - public ElemInfo(BigDecimal[] elemInfo) { - this.triplets = elemInfo; - } - - public ElemInfo(Array array) { - if ( array == null ) { - this.triplets = new BigDecimal[] { }; - return; - } - try { - triplets = (BigDecimal[]) array.getArray(); - } - catch ( Exception e ) { - throw new RuntimeException( e ); - } - } - - public BigDecimal[] getElements() { - return this.triplets; - } - - public int getSize() { - return this.triplets.length / 3; - } - - public int getOrdinatesOffset(int i) { - return this.triplets[i * 3].intValue(); - } - - public void setOrdinatesOffset(int i, int offset) { - this.triplets[i * 3] = new BigDecimal( offset ); - } - - public ElementType getElementType(int i) { - final int etype = this.triplets[i * 3 + 1].intValue(); - final int interp = this.triplets[i * 3 + 2].intValue(); - return ElementType.parseType( etype, interp ); - } - - public boolean isCompound(int i) { - return getElementType( i ).isCompound(); - } - - public int getNumCompounds(int i) { - if ( getElementType( i ).isCompound() ) { - return this.triplets[i * 3 + 2].intValue(); - } - else { - return 1; - } - } - - public void setElement(int i, int ordinatesOffset, ElementType et, int numCompounds) { - if ( i > getSize() ) { - throw new RuntimeException( - "Attempted to set more elements in ElemInfo Array than capacity." - ); - } - this.triplets[i * 3] = new BigDecimal( ordinatesOffset ); - this.triplets[i * 3 + 1] = new BigDecimal( et.getEType() ); - this.triplets[i * 3 + 2] = et.isCompound() ? new BigDecimal( numCompounds ) : new BigDecimal( - et - .getInterpretation() - ); - } - - public String toString() { - return SDOGeometry.arrayToString( this.triplets ); - } - - public void addElement(BigDecimal[] element) { - final BigDecimal[] newTriplets = new BigDecimal[this.triplets.length + element.length]; - System.arraycopy( - this.triplets, 0, newTriplets, 0, - this.triplets.length - ); - System.arraycopy( - element, 0, newTriplets, this.triplets.length, - element.length - ); - this.triplets = newTriplets; - } - - public void addElement(ElemInfo element) { - this.addElement( element.getElements() ); - } - - public BigDecimal[] getElement(int i) { - BigDecimal[] ea = null; - if ( this.getElementType( i ).isCompound() ) { - final int numCompounds = this.getNumCompounds( i ); - ea = new BigDecimal[numCompounds + 1]; - } - else { - ea = new BigDecimal[3]; - } - System.arraycopy( this.triplets, 3 * i, ea, 0, ea.length ); - return ea; - } - -} diff --git a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/ElementType.java b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/ElementType.java deleted file mode 100644 index 8be8d371c8..0000000000 --- a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/ElementType.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * This file is part of Hibernate Spatial, an extension to the - * hibernate ORM solution for spatial (geographic) data. - * - * Copyright © 2007-2012 Geovise BVBA - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package org.hibernate.spatial.dialect.oracle; - - -/** - * @author Karel Maesen, Geovise BVBA - * creation-date: Jul 1, 2010 - */ -enum ElementType { - UNSUPPORTED( 0, true ), POINT( 1, 1 ), ORIENTATION( 1, 0 ), POINT_CLUSTER( - 1, - true - ), LINE_STRAITH_SEGMENTS( 2, 1 ), LINE_ARC_SEGMENTS( 2, 2 ), INTERIOR_RING_STRAIGHT_SEGMENTS( - 2003, 1 - ), EXTERIOR_RING_STRAIGHT_SEGMENTS( 1003, 1 ), INTERIOR_RING_ARC_SEGMENTS( - 2003, 2 - ), EXTERIOR_RING_ARC_SEGMENTS( 1003, 2 ), INTERIOR_RING_RECT( - 2003, 3 - ), EXTERIOR_RING_RECT( 1003, 3 ), INTERIOR_RING_CIRCLE( - 2003, 4 - ), EXTERIOR_RING_CIRCLE( 1003, 4 ), COMPOUND_LINE( 4, true ), COMPOUND_EXTERIOR_RING( - 1005, true - ), COMPOUND_INTERIOR_RING( 2005, true ); - - private int etype; - - private int interpretation = 2; - - private boolean compound; - - private ElementType(int etype, int interp) { - this.etype = etype; - this.interpretation = interp; - - } - - private ElementType(int etype, boolean compound) { - this.etype = etype; - this.compound = compound; - } - - public int getEType() { - return this.etype; - } - - public int getInterpretation() { - return this.interpretation; - } - - /** - * @return true, if the SDO_INTERPRETATION value is the number of points - * or compounds in the element. - */ - public boolean isCompound() { - return this.compound; - } - - public boolean isLine() { - return ( etype == 2 || etype == 4 ); - } - - public boolean isInteriorRing() { - return ( etype == 2003 || etype == 2005 ); - } - - public boolean isExteriorRing() { - return ( etype == 1003 || etype == 1005 ); - } - - public boolean isStraightSegment() { - return ( interpretation == 1 ); - } - - public boolean isArcSegment() { - return ( interpretation == 2 ); - } - - public boolean isCircle() { - return ( interpretation == 4 ); - } - - public boolean isRect() { - return ( interpretation == 3 ); - } - - public static ElementType parseType(int etype, int interpretation) { - for ( ElementType t : values() ) { - if ( t.etype == etype ) { - if ( t.isCompound() - || t.getInterpretation() == interpretation ) { - return t; - } - } - } - throw new RuntimeException( - "Can't determine ElementType from etype:" + etype - + " and interp.:" + interpretation - ); - } - -} diff --git a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/OracleJDBCTypeFactory.java b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/OracleJDBCTypeFactory.java deleted file mode 100644 index 3d21842f65..0000000000 --- a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/OracleJDBCTypeFactory.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * This file is part of Hibernate Spatial, an extension to the - * hibernate ORM solution for spatial (geographic) data. - * - * Copyright © 2007-2012 Geovise BVBA - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package org.hibernate.spatial.dialect.oracle; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.sql.Array; -import java.sql.Connection; -import java.sql.SQLException; -import java.sql.Struct; - -import org.hibernate.HibernateException; -import org.hibernate.internal.util.ReflectHelper; -import org.hibernate.spatial.helper.FinderException; - -/** - * Factory for Oracle JDBC extension types (ARRAY, STRUCT, ...). - *

- * This factory creates the Oracle extension types using reflection in order to - * avoid creating compile-time dependencies on the proprietary Oracle driver. - * - * @author Karel Maesen, Geovise BVBA - * creation-date: Jul 3, 2010 - */ -public class OracleJDBCTypeFactory implements SQLTypeFactory { - - private final Class datumClass; - private final Method structDescriptorCreator; - private final Method arrayDescriptorCreator; - private final Constructor numberConstructor; - private final Constructor arrayConstructor; - private final Constructor structConstructor; - private final ConnectionFinder connectionFinder; - - /** - * Constructs an instance. - * - * @param connectionFinder the {@code ConnectionFinder} the use for retrieving the {@code OracleConnection} instance. - */ - public OracleJDBCTypeFactory(ConnectionFinder connectionFinder) { - if ( connectionFinder == null ) { - throw new HibernateException( "ConnectionFinder cannot be null" ); - } - this.connectionFinder = connectionFinder; - Object[] obj = findDescriptorCreator( "oracle.sql.StructDescriptor" ); - Class structDescriptorClass = (Class) obj[0]; - structDescriptorCreator = (Method) obj[1]; - obj = findDescriptorCreator( "oracle.sql.ArrayDescriptor" ); - Class arrayDescriptorClass = (Class) obj[0]; - arrayDescriptorCreator = (Method) obj[1]; - datumClass = findClass( "oracle.sql.Datum" ); - Class numberClass = findClass( "oracle.sql.NUMBER" ); - Class arrayClass = findClass( "oracle.sql.ARRAY" ); - Class structClass = findClass( "oracle.sql.STRUCT" ); - - numberConstructor = findConstructor( numberClass, java.lang.Integer.TYPE ); - arrayConstructor = findConstructor( arrayClass, arrayDescriptorClass, Connection.class, Object.class ); - structConstructor = findConstructor( structClass, structDescriptorClass, Connection.class, Object[].class ); - } - - private Constructor findConstructor(Class clazz, Class... arguments) { - try { - return clazz.getConstructor( arguments ); - } - catch ( NoSuchMethodException e ) { - throw new HibernateException( "Error finding constructor for oracle.sql type.", e ); - } - } - - private Class findClass(String name) { - try { - return ReflectHelper.classForName( name ); - } - catch ( ClassNotFoundException e ) { - throw new HibernateException( "Class 'oracle.sql.Datum' not found on class path" ); - } - } - - private Object[] findDescriptorCreator(String className) { - try { - final Class clazz = ReflectHelper.classForName( className ); - final Method m = clazz.getMethod( "createDescriptor", String.class, Connection.class ); - return new Object[] { clazz, m }; - } - catch ( ClassNotFoundException e ) { - throw new HibernateException( "Class 'StructDescriptor' not found on classpath" ); - } - catch ( NoSuchMethodException e ) { - throw new HibernateException( "Class 'StructDescriptor' has no method 'createDescriptor(String,Connection)'" ); - } - } - - @Override - public Struct createStruct(SDOGeometry geom, Connection conn) throws SQLException { - Connection oracleConnection = null; - try { - oracleConnection = connectionFinder.find( conn ); - } - catch ( FinderException e ) { - throw new HibernateException( "Problem finding Oracle Connection", e ); - } - - final Object structDescriptor = createStructDescriptor( SDOGeometry.getTypeName(), oracleConnection ); - final Object[] attributes = createDatumArray( 5 ); - attributes[0] = createNumber( geom.getGType().intValue() ); - if ( geom.getSRID() > 0 ) { - attributes[1] = createNumber( geom.getSRID() ); - } - else { - attributes[1] = null; - } - attributes[3] = createElemInfoArray( geom.getInfo(), oracleConnection ); - attributes[4] = createOrdinatesArray( geom.getOrdinates(), oracleConnection ); - return createStruct( structDescriptor, oracleConnection, attributes ); - } - - @Override - public Array createElemInfoArray(ElemInfo elemInfo, Connection conn) { - final Object arrayDescriptor = createArrayDescriptor( ElemInfo.TYPE_NAME, conn ); - return createArray( arrayDescriptor, conn, elemInfo.getElements() ); - } - - @Override - public Array createOrdinatesArray(Ordinates ordinates, Connection conn) throws SQLException { - final Object arrayDescriptor = createArrayDescriptor( Ordinates.TYPE_NAME, conn ); - return createArray( arrayDescriptor, conn, ordinates.getOrdinateArray() ); - - } - - private Array createArray(Object descriptor, Connection conn, Object[] data) { - try { - return (Array) arrayConstructor.newInstance( descriptor, conn, data ); - } - catch ( InstantiationException e ) { - throw new HibernateException( "Problem creating ARRAY.", e ); - } - catch ( IllegalAccessException e ) { - throw new HibernateException( "Problem creating ARRAY.", e ); - } - catch ( InvocationTargetException e ) { - throw new HibernateException( "Problem creating ARRAY.", e ); - } - } - - private Struct createStruct(Object descriptor, Connection conn, Object[] attributes) { - try { - return (Struct) structConstructor.newInstance( descriptor, conn, attributes ); - } - catch ( InstantiationException e ) { - throw new HibernateException( "Problem creating STRUCT.", e ); - } - catch ( IllegalAccessException e ) { - throw new HibernateException( "Problem creating STRUCT.", e ); - } - catch ( InvocationTargetException e ) { - throw new HibernateException( "Problem creating STRUCT.", e ); - } - } - - private Object createStructDescriptor(String sqlType, Connection conn) { - try { - return structDescriptorCreator.invoke( null, sqlType, conn ); - } - catch ( IllegalAccessException e ) { - throw new HibernateException( "Error creating oracle STRUCT", e ); - } - catch ( InvocationTargetException e ) { - throw new HibernateException( "Error creating oracle STRUCT", e ); - } - } - - private Object createArrayDescriptor(String name, Connection conn) { - try { - return arrayDescriptorCreator.invoke( null, name, conn ); - } - catch ( IllegalAccessException e ) { - throw new HibernateException( "Error creating oracle ARRAY", e ); - } - catch ( InvocationTargetException e ) { - throw new HibernateException( "Error creating oracle ARRAY", e ); - } - } - - private Object[] createDatumArray(int size) { - return (Object[]) java.lang.reflect.Array.newInstance( datumClass, size ); - - } - - private Object createNumber(int obj) { - try { - return numberConstructor.newInstance( obj ); - } - catch ( InvocationTargetException e ) { - throw new HibernateException( "Error creating oracle NUMBER", e ); - } - catch ( InstantiationException e ) { - throw new HibernateException( "Error creating oracle NUMBER", e ); - } - catch ( IllegalAccessException e ) { - throw new HibernateException( "Error creating oracle NUMBER", e ); - } - } - -} diff --git a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/OracleSpatial10gDialect.java b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/OracleSpatial10gDialect.java deleted file mode 100644 index 512341b611..0000000000 --- a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/OracleSpatial10gDialect.java +++ /dev/null @@ -1,545 +0,0 @@ -/* - * This file is part of Hibernate Spatial, an extension to the - * hibernate ORM solution for spatial (geographic) data. - * - * Copyright © 2007-2012 Geovise BVBA - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package org.hibernate.spatial.dialect.oracle; - - -import java.io.Serializable; -import java.sql.Types; -import java.util.List; - -import org.hibernate.QueryException; -import org.hibernate.dialect.Oracle10gDialect; -import org.hibernate.dialect.function.StandardSQLFunction; -import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.metamodel.spi.TypeContributions; -import org.hibernate.service.ServiceRegistry; -import org.hibernate.spatial.GeolatteGeometryType; -import org.hibernate.spatial.HibernateSpatialConfiguration; -import org.hibernate.spatial.JTSGeometryType; -import org.hibernate.spatial.SpatialAnalysis; -import org.hibernate.spatial.SpatialDialect; -import org.hibernate.spatial.SpatialFunction; -import org.hibernate.spatial.SpatialRelation; -import org.hibernate.spatial.dialect.oracle.criterion.OracleSpatialAggregate; -import org.hibernate.type.StandardBasicTypes; -import org.hibernate.type.Type; - -/** - * Spatial Dialect for Oracle10g databases. - * - * @author Karel Maesen - */ -public class OracleSpatial10gDialect extends Oracle10gDialect implements - SpatialDialect, Serializable { - - private final boolean isOgcStrict; - private final ConnectionFinder connectionFinder; - - - /** - * Constructs the dialect with a default configuration - */ - public OracleSpatial10gDialect() { - this( new HibernateSpatialConfiguration() ); - } - - /** - * Constructs the dialect with the specified configuration - * - * @param config the {@code HibernateSpatialConfiguration} that configures this dialect. - */ - public OracleSpatial10gDialect(HibernateSpatialConfiguration config) { - super(); - this.isOgcStrict = config.isOgcStrictMode(); - final ConnectionFinder finder = config.getConnectionFinder(); - this.connectionFinder = finder == null ? new DefaultConnectionFinder() : finder; - - - // register geometry type - registerColumnType( Types.STRUCT, "MDSYS.SDO_GEOMETRY" ); - - // registering OGC functions - // (spec_simplefeatures_sql_99-04.pdf) - - // section 2.1.1.1 - registerFunction( "dimension", new GetDimensionFunction() ); - registerFunction( "geometrytype", new GetGeometryTypeFunction() ); - registerFunction( "srid", new SDOObjectProperty( "SDO_SRID", StandardBasicTypes.INTEGER ) ); - registerFunction( "envelope", new StandardSQLFunction( "SDO_GEOM.SDO_MBR" ) ); - registerFunction( "astext", new AsTextFunction() ); - registerFunction( "asbinary", new StandardSQLFunction( "SDO_UTIL.TO_WKBGEOMETRY", StandardBasicTypes.BINARY ) ); - registerFunction( - "isempty", - new WrappedOGCFunction( "OGC_ISEMPTY", StandardBasicTypes.BOOLEAN, new boolean[] { true } ) - ); - registerFunction( - "issimple", - new WrappedOGCFunction( "OGC_ISSIMPLE", StandardBasicTypes.BOOLEAN, new boolean[] { true } ) - ); - registerFunction( "boundary", new WrappedOGCFunction( "OGC_BOUNDARY", new boolean[] { true } ) ); - - // registerFunction("area", new AreaFunction()); - - // Register functions for spatial relation constructs - // section 2.1.1.2 - registerFunction( "overlaps", new SpatialRelateFunction( "overlaps", SpatialRelation.OVERLAPS ) ); - registerFunction( "intersects", new SpatialRelateFunction( "intersects", SpatialRelation.INTERSECTS ) ); - registerFunction( "contains", new SpatialRelateFunction( "contains", SpatialRelation.CONTAINS ) ); - registerFunction( "crosses", new SpatialRelateFunction( "crosses", SpatialRelation.CROSSES ) ); - registerFunction( "disjoint", new SpatialRelateFunction( "disjoint", SpatialRelation.DISJOINT ) ); - registerFunction( "equals", new SpatialRelateFunction( "equals", SpatialRelation.EQUALS ) ); - registerFunction( "touches", new SpatialRelateFunction( "touches", SpatialRelation.TOUCHES ) ); - registerFunction( "within", new SpatialRelateFunction( "within", SpatialRelation.WITHIN ) ); - registerFunction( - "relate", - new WrappedOGCFunction( "OGC_RELATE", StandardBasicTypes.BOOLEAN, new boolean[] { true, true, false } ) - ); - - // Register spatial analysis functions. - // Section 2.1.1.3 - registerFunction( - "distance", - new SpatialAnalysisFunction( "distance", StandardBasicTypes.DOUBLE, SpatialAnalysis.DISTANCE ) - ); - registerFunction( "buffer", new SpatialAnalysisFunction( "buffer", SpatialAnalysis.BUFFER ) ); - registerFunction( "convexhull", new SpatialAnalysisFunction( "convexhull", SpatialAnalysis.CONVEXHULL ) ); - registerFunction( "difference", new SpatialAnalysisFunction( "difference", SpatialAnalysis.DIFFERENCE ) ); - registerFunction( "intersection", new SpatialAnalysisFunction( "intersection", SpatialAnalysis.INTERSECTION ) ); - registerFunction( - "symdifference", - new SpatialAnalysisFunction( "symdifference", SpatialAnalysis.SYMDIFFERENCE ) - ); - registerFunction( "geomunion", new SpatialAnalysisFunction( "union", SpatialAnalysis.UNION ) ); - // we rename OGC union to geomunion because union is a reserved SQL - // keyword. (See also postgis documentation). - - // portable spatial aggregate functions - registerFunction( "extent", new SpatialAggregationFunction( "extent", false, OracleSpatialAggregate.EXTENT ) ); - - //other common functions - - registerFunction( "transform", new StandardSQLFunction( "SDO_CS.TRANSFORM" ) ); - - // Oracle specific Aggregate functions - registerFunction( - "centroid", - new SpatialAggregationFunction( "extent", false, OracleSpatialAggregate.CENTROID ) - ); - registerFunction( - "concat_lines", - new SpatialAggregationFunction( "extent", false, OracleSpatialAggregate.CONCAT_LINES ) - ); - registerFunction( - "aggr_convexhull", - new SpatialAggregationFunction( "extent", false, OracleSpatialAggregate.CONVEXHULL ) - ); - registerFunction( - "aggr_union", - new SpatialAggregationFunction( "extent", false, OracleSpatialAggregate.UNION ) - ); - registerFunction( - "lrs_concat", - new SpatialAggregationFunction( "lrsconcat", false, OracleSpatialAggregate.LRS_CONCAT ) - ); - } - - @Override - public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) { - super.contributeTypes( - typeContributions, - serviceRegistry - ); - - final SDOGeometryTypeDescriptor sdoGeometryTypeDescriptor = new SDOGeometryTypeDescriptor( - new OracleJDBCTypeFactory( - this.connectionFinder - ) - ); - - typeContributions.contributeType( new GeolatteGeometryType( sdoGeometryTypeDescriptor ) ); - typeContributions.contributeType( new JTSGeometryType( sdoGeometryTypeDescriptor ) ); - - } - - String getNativeSpatialRelateSQL(String arg1, String arg2, int spatialRelation) { - String mask = ""; - boolean negate = false; - switch ( spatialRelation ) { - case SpatialRelation.INTERSECTS: - mask = "ANYINTERACT"; - break; - case SpatialRelation.CONTAINS: - mask = "CONTAINS+COVERS"; - break; - case SpatialRelation.CROSSES: - throw new UnsupportedOperationException( - "Oracle Spatial does't have equivalent CROSSES relationship" - ); - case SpatialRelation.DISJOINT: - mask = "ANYINTERACT"; - negate = true; - break; - case SpatialRelation.EQUALS: - mask = "EQUAL"; - break; - case SpatialRelation.OVERLAPS: - mask = "OVERLAPBDYDISJOINT+OVERLAPBDYINTERSECT"; - break; - case SpatialRelation.TOUCHES: - mask = "TOUCH"; - break; - case SpatialRelation.WITHIN: - mask = "INSIDE+COVEREDBY"; - break; - default: - throw new IllegalArgumentException( - "undefined SpatialRelation passed (" + spatialRelation - + ")" - ); - } - final StringBuffer buffer = new StringBuffer( "CASE SDO_RELATE(" ).append( arg1 ) - .append( "," ) - .append( arg2 ) - .append( ",'mask=" + mask + "') " ); - if ( !negate ) { - buffer.append( " WHEN 'TRUE' THEN 1 ELSE 0 END" ); - } - else { - buffer.append( " WHEN 'TRUE' THEN 0 ELSE 1 END" ); - } - return buffer.toString(); - } - - String getOGCSpatialRelateSQL(String arg1, String arg2, int spatialRelation) { - final StringBuffer ogcFunction = new StringBuffer( "MDSYS." ); - switch ( spatialRelation ) { - case SpatialRelation.INTERSECTS: - ogcFunction.append( "OGC_INTERSECTS" ); - break; - case SpatialRelation.CONTAINS: - ogcFunction.append( "OGC_CONTAINS" ); - break; - case SpatialRelation.CROSSES: - ogcFunction.append( "OGC_CROSS" ); - break; - case SpatialRelation.DISJOINT: - ogcFunction.append( "OGC_DISJOINT" ); - break; - case SpatialRelation.EQUALS: - ogcFunction.append( "OGC_EQUALS" ); - break; - case SpatialRelation.OVERLAPS: - ogcFunction.append( "OGC_OVERLAP" ); - break; - case SpatialRelation.TOUCHES: - ogcFunction.append( "OGC_TOUCH" ); - break; - case SpatialRelation.WITHIN: - ogcFunction.append( "OGC_WITHIN" ); - break; - default: - throw new IllegalArgumentException( - "Unknown SpatialRelation (" - + spatialRelation + ")." - ); - } - ogcFunction.append( "(" ).append( "MDSYS.ST_GEOMETRY.FROM_SDO_GEOM(" ) - .append( arg1 ).append( ")," ).append( - "MDSYS.ST_GEOMETRY.FROM_SDO_GEOM(" - ).append( arg2 ) - .append( ")" ).append( ")" ); - return ogcFunction.toString(); - - } - - String getNativeSpatialAggregateSQL(String arg1, int aggregation) { - final StringBuffer aggregateFunction = new StringBuffer(); - final SpatialAggregate sa = new SpatialAggregate( aggregation ); - - if ( sa.getAggregateSyntax() == null ) { - throw new IllegalArgumentException( - "Unknown Spatial Aggregation (" - + aggregation + ")." - ); - } - - aggregateFunction.append( sa.getAggregateSyntax() ); - - aggregateFunction.append( "(" ); - if ( sa.isAggregateType() ) { - aggregateFunction.append( "SDOAGGRTYPE(" ); - } - aggregateFunction.append( arg1 ); - // TODO tolerance must by configurable - if ( sa.isAggregateType() ) { - aggregateFunction.append( ", " ).append( .001 ).append( ")" ); - } - aggregateFunction.append( ")" ); - - return aggregateFunction.toString(); - } - - private StringBuffer wrapInSTGeometry(String geomColumn, StringBuffer toAdd) { - return toAdd.append( "MDSYS.ST_GEOMETRY(" ).append( geomColumn ) - .append( ")" ); - } - - @Override - public String getSpatialFilterExpression(String columnName) { - final StringBuffer buffer = new StringBuffer( "SDO_FILTER(" ); - buffer.append( columnName ); - buffer.append( ",?) = 'TRUE' " ); - return buffer.toString(); - } - - @Override - public String getSpatialRelateSQL(String columnName, int spatialRelation) { - String sql = ( isOGCStrict() ? - getOGCSpatialRelateSQL( columnName, "?", spatialRelation ) : - getNativeSpatialRelateSQL( columnName, "?", spatialRelation ) ) + " = 1"; - sql += " and " + columnName + " is not null"; - return sql; - } - - String getSpatialAnalysisSQL(List args, int spatialAnalysisFunction, boolean useFilter) { - return isOGCStrict() ? getOGCSpatialAnalysisSQL( args, spatialAnalysisFunction ) : getNativeSpatialAnalysisSQL( - args, - spatialAnalysisFunction - ); - } - - @Override - public String getSpatialAggregateSQL(String columnName, int spatialAggregateFunction) { - return getNativeSpatialAggregateSQL( columnName, spatialAggregateFunction ); - } - - @Override - public String getDWithinSQL(String columnName) { - return "SDO_WITHIN_DISTANCE (" + columnName + ",?, ?) = 'TRUE' "; - } - - @Override - public String getHavingSridSQL(String columnName) { - return String.format( " (MDSYS.ST_GEOMETRY(%s).ST_SRID() = ?)", columnName ); - } - - @Override - public String getIsEmptySQL(String columnName, boolean isEmpty) { - return String.format( "( MDSYS.ST_GEOMETRY(%s).ST_ISEMPTY() = %d )", columnName, isEmpty ? 1 : 0 ); - } - - private String getOGCSpatialAnalysisSQL(List args, int spatialAnalysisFunction) { - boolean[] geomArgs; - final StringBuffer ogcFunction = new StringBuffer( "MDSYS." ); - boolean isGeomReturn = true; - switch ( spatialAnalysisFunction ) { - case SpatialAnalysis.BUFFER: - ogcFunction.append( "OGC_BUFFER" ); - geomArgs = new boolean[] { true, false }; - break; - case SpatialAnalysis.CONVEXHULL: - ogcFunction.append( "OGC_CONVEXHULL" ); - geomArgs = new boolean[] { true }; - break; - case SpatialAnalysis.DIFFERENCE: - ogcFunction.append( "OGC_DIFFERENCE" ); - geomArgs = new boolean[] { true, true }; - break; - case SpatialAnalysis.DISTANCE: - ogcFunction.append( "OGC_DISTANCE" ); - geomArgs = new boolean[] { true, true }; - isGeomReturn = false; - break; - case SpatialAnalysis.INTERSECTION: - ogcFunction.append( "OGC_INTERSECTION" ); - geomArgs = new boolean[] { true, true }; - break; - case SpatialAnalysis.SYMDIFFERENCE: - ogcFunction.append( "OGC_SYMMETRICDIFFERENCE" ); - geomArgs = new boolean[] { true, true }; - break; - case SpatialAnalysis.UNION: - ogcFunction.append( "OGC_UNION" ); - geomArgs = new boolean[] { true, true }; - break; - default: - throw new IllegalArgumentException( - "Unknown SpatialAnalysisFunction (" - + spatialAnalysisFunction + ")." - ); - } - - if ( args.size() < geomArgs.length ) { - throw new QueryException( - "Insufficient arguments for spatial analysis function (function type: " - + spatialAnalysisFunction + ")." - ); - } - - ogcFunction.append( "(" ); - for ( int i = 0; i < geomArgs.length; i++ ) { - if ( i > 0 ) { - ogcFunction.append( "," ); - } - if ( geomArgs[i] ) { - wrapInSTGeometry( (String) args.get( i ), ogcFunction ); - } - else { - ogcFunction.append( args.get( i ) ); - } - } - ogcFunction.append( ")" ); - if ( isGeomReturn ) { - ogcFunction.append( ".geom" ); - } - return ogcFunction.toString(); - } - - private String getNativeSpatialAnalysisSQL(List args, int spatialAnalysis) { - return getOGCSpatialAnalysisSQL( args, spatialAnalysis ); - } - - /** - * Reports whether this dialect is in OGC_STRICT mode or not. - * - * This method is for testing purposes. - * - * @return true if in OGC_STRICT mode, false otherwise - */ - public boolean isOGCStrict() { - return isOgcStrict; - } - - /** - * Reports the ConnectionFinder used by this Dialect (or rather its associated TypeDescriptor). - * - * This method is mainly used for testing purposes. - * - * @return the ConnectionFinder in use - */ - public ConnectionFinder getConnectionFinder() { - return connectionFinder; - } - - @Override - public boolean supportsFiltering() { - return true; - } - - @Override - public boolean supports(SpatialFunction function) { - return ( getFunctions().get( function.toString() ) != null ); - } - - /** - * Implementation of the OGC astext function for HQL. - */ - private static class AsTextFunction extends StandardSQLFunction { - - private AsTextFunction() { - super( "astext", StandardBasicTypes.STRING ); - } - - public String render(Type firstArgumentType, final List args, final SessionFactoryImplementor factory) { - final StringBuffer buf = new StringBuffer(); - if ( args.isEmpty() ) { - throw new IllegalArgumentException( "First Argument in arglist must be object " + "to which method is applied" ); - } - buf.append( "TO_CHAR(SDO_UTIL.TO_WKTGEOMETRY(" ).append( args.get( 0 ) ).append( "))" ); - return buf.toString(); - } - } - - /** - * HQL Spatial relation function. - */ - private class SpatialRelateFunction extends StandardSQLFunction { - private final int relation; - - private SpatialRelateFunction(final String name, final int relation) { - super( - name, isOGCStrict() ? StandardBasicTypes.BOOLEAN - : new SDOBooleanType() - ); - this.relation = relation; - } - - public String render(Type firstArgumentType, final List args, final SessionFactoryImplementor factory) { - - if ( args.size() < 2 ) { - throw new QueryException( - "Spatial relate functions require at least two arguments" - ); - } - - return isOGCStrict() ? - getOGCSpatialRelateSQL( - (String) args.get( 0 ), - (String) args.get( 1 ), this.relation - ) : - getNativeSpatialRelateSQL( - (String) args.get( 0 ), - (String) args.get( 1 ), this.relation - ); - } - - } - - private class SpatialAnalysisFunction extends StandardSQLFunction { - private final int analysis; - - private SpatialAnalysisFunction(String name, Type returnType, int analysis) { - super( name, returnType ); - this.analysis = analysis; - } - - private SpatialAnalysisFunction(String name, int analysis) { - this( name, null, analysis ); - } - - public String render(Type firstArgumentType, List args, SessionFactoryImplementor factory) { - return isOGCStrict() ? getSpatialAnalysisSQL( - args, this.analysis, - false - ) : getNativeSpatialAnalysisSQL( args, analysis ); - } - - } - - private class SpatialAggregationFunction extends StandardSQLFunction { - - private final int aggregation; - - private SpatialAggregationFunction(String name, boolean isProjection, int aggregation) { - super( name ); - this.aggregation = aggregation; - } - - public String render(Type firstArgumentType, List args, SessionFactoryImplementor factory) { - return getNativeSpatialAggregateSQL( - (String) args.get( 0 ), - this.aggregation - ); - } - } - - -} diff --git a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/Ordinates.java b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/Ordinates.java deleted file mode 100644 index 8ae0aee0e3..0000000000 --- a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/Ordinates.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * This file is part of Hibernate Spatial, an extension to the - * hibernate ORM solution for spatial (geographic) data. - * - * Copyright © 2007-2012 Geovise BVBA - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package org.hibernate.spatial.dialect.oracle; - -import java.sql.Array; - -/** - * @author Karel Maesen, Geovise BVBA - * creation-date: Jul 1, 2010 - */ -class Ordinates { - - static final String TYPE_NAME = "MDSYS.SDO_ORDINATE_ARRAY"; - - private Double[] ordinates; - - public Ordinates(Double[] ordinates) { - this.ordinates = ordinates; - } - - public Ordinates(Array array) { - if ( array == null ) { - this.ordinates = new Double[] { }; - return; - } - try { - final Number[] ords = (Number[]) array.getArray(); - this.ordinates = new Double[ords.length]; - for ( int i = 0; i < ords.length; i++ ) { - this.ordinates[i] = ords[i] != null ? ords[i].doubleValue() - : Double.NaN; - } - } - catch ( Exception e ) { - throw new RuntimeException( e ); - } - } - - public Double[] getOrdinateArray() { - return this.ordinates; - } - - public Double[] getOrdinatesArray(int startPosition, int endPosition) { - final Double[] a = new Double[endPosition - startPosition]; - System.arraycopy( this.ordinates, startPosition - 1, a, 0, a.length ); - return a; - } - - public Double[] getOrdinatesArray(int startPosition) { - final Double[] a = new Double[this.ordinates.length - ( startPosition - 1 )]; - System.arraycopy( this.ordinates, startPosition - 1, a, 0, a.length ); - return a; - } - - public String toString() { - return SDOGeometry.arrayToString( this.ordinates ); - } - - public void addOrdinates(Double[] ordinatesToAdd) { - final Double[] newOrdinates = new Double[this.ordinates.length - + ordinatesToAdd.length]; - System.arraycopy( - this.ordinates, 0, newOrdinates, 0, - this.ordinates.length - ); - System.arraycopy( - ordinatesToAdd, 0, newOrdinates, - this.ordinates.length, ordinatesToAdd.length - ); - this.ordinates = newOrdinates; - } - -} diff --git a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGType.java b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGType.java deleted file mode 100644 index 1dd385afc3..0000000000 --- a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGType.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * This file is part of Hibernate Spatial, an extension to the - * hibernate ORM solution for spatial (geographic) data. - * - * Copyright © 2007-2012 Geovise BVBA - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package org.hibernate.spatial.dialect.oracle; - -/** - * @author Karel Maesen, Geovise BVBA - * creation-date: Jun 30, 2010 - */ -class SDOGType { - - private int dimension = 2; - - private int lrsDimension; - - private TypeGeometry typeGeometry = TypeGeometry.UNKNOWN_GEOMETRY; - - public SDOGType(int dimension, int lrsDimension, - TypeGeometry typeGeometry) { - setDimension( dimension ); - setLrsDimension( lrsDimension ); - setTypeGeometry( typeGeometry ); - } - - public int getDimension() { - return dimension; - } - - public void setDimension(int dimension) { - if ( dimension < 2 || dimension > 4 ) { - throw new IllegalArgumentException( - "Dimension can only be 2,3 or 4." - ); - } - this.dimension = dimension; - } - - public TypeGeometry getTypeGeometry() { - return typeGeometry; - } - - public void setTypeGeometry(TypeGeometry typeGeometry) { - - this.typeGeometry = typeGeometry; - } - - public int getLRSDimension() { - if ( this.lrsDimension > 0 ) { - return this.lrsDimension; - } - else if ( this.lrsDimension == 0 && this.dimension == 4 ) { - return 4; - } - return 0; - } - - public int getZDimension() { - if ( this.dimension > 2 ) { - if ( !isLRSGeometry() ) { - return this.dimension; - } - else { - return ( getLRSDimension() < this.dimension ? 4 : 3 ); - } - } - return 0; - } - - public boolean isLRSGeometry() { - return ( this.lrsDimension > 0 || ( this.lrsDimension == 0 && this.dimension == 4 ) ); - } - - public void setLrsDimension(int lrsDimension) { - if ( lrsDimension != 0 && lrsDimension > this.dimension ) { - throw new IllegalArgumentException( - "lrsDimension must be 0 or lower or equal to dimenstion." - ); - } - this.lrsDimension = lrsDimension; - } - - public int intValue() { - int v = this.dimension * 1000; - v += lrsDimension * 100; - v += typeGeometry.intValue(); - return v; - } - - public static SDOGType parse(int v) { - final int dim = v / 1000; - v -= dim * 1000; - final int lrsDim = v / 100; - v -= lrsDim * 100; - final TypeGeometry typeGeometry = TypeGeometry.parse( v ); - return new SDOGType( dim, lrsDim, typeGeometry ); - } - - public static SDOGType parse(Object datum) { - - try { - final int v = ( (Number) datum ).intValue(); - return parse( v ); - } - catch ( Exception e ) { - throw new RuntimeException( e ); - } - - } - - public String toString() { - return Integer.toString( this.intValue() ); - } -} diff --git a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGeometry.java b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGeometry.java deleted file mode 100644 index 37fa43c27d..0000000000 --- a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGeometry.java +++ /dev/null @@ -1,347 +0,0 @@ -/* - * This file is part of Hibernate Spatial, an extension to the - * hibernate ORM solution for spatial (geographic) data. - * - * Copyright © 2007-2012 Geovise BVBA - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package org.hibernate.spatial.dialect.oracle; - -import java.sql.Array; -import java.sql.SQLException; -import java.sql.Struct; -import java.util.ArrayList; -import java.util.List; - -/** - * @author Karel Maesen, Geovise BVBA - * creation-date: Jun 30, 2010 - */ - -class SDOGeometry { - - private static final String SQL_TYPE_NAME = "MDSYS.SDO_GEOMETRY"; - private SDOGType gtype; - private int srid; - private SDOPoint point; - private ElemInfo info; - private Ordinates ordinates; - - - public SDOGeometry() { - - } - - public static String getTypeName() { - return SQL_TYPE_NAME; - } - - static String arrayToString(Object array) { - if ( array == null || java.lang.reflect.Array.getLength( array ) == 0 ) { - return "()"; - } - final int length = java.lang.reflect.Array.getLength( array ); - final StringBuilder stb = new StringBuilder(); - stb.append( "(" ).append( java.lang.reflect.Array.get( array, 0 ) ); - for ( int i = 1; i < length; i++ ) { - stb.append( "," ).append( java.lang.reflect.Array.get( array, i ) ); - } - stb.append( ")" ); - return stb.toString(); - } - - /** - * This joins an array of SDO_GEOMETRIES to a SDOGeometry of type - * COLLECTION - * - * @param sdoElements The SDO_geometries to join into an SDO Geometry Collection - * - * @return The SDO Collection Geometry - */ - public static SDOGeometry join(SDOGeometry[] sdoElements) { - final SDOGeometry sdoCollection = new SDOGeometry(); - if ( sdoElements == null || sdoElements.length == 0 ) { - sdoCollection.setGType( new SDOGType( 2, 0, TypeGeometry.COLLECTION ) ); - } - else { - final SDOGeometry firstElement = sdoElements[0]; - final int dim = firstElement.getGType().getDimension(); - final int lrsDim = firstElement.getGType().getLRSDimension(); - sdoCollection.setGType( new SDOGType( dim, lrsDim, TypeGeometry.COLLECTION ) ); - int ordinatesOffset = 1; - for ( int i = 0; i < sdoElements.length; i++ ) { - final ElemInfo element = sdoElements[i].getInfo(); - final Double[] ordinates = sdoElements[i].getOrdinates().getOrdinateArray(); - if ( element != null && element.getSize() > 0 ) { - final int shift = ordinatesOffset - element.getOrdinatesOffset( 0 ); - shiftOrdinateOffset( element, shift ); - sdoCollection.addElement( element ); - sdoCollection.addOrdinates( ordinates ); - ordinatesOffset += ordinates.length; - } - } - } - return sdoCollection; - } - - private static void shiftOrdinateOffset(ElemInfo elemInfo, int offset) { - for ( int i = 0; i < elemInfo.getSize(); i++ ) { - final int newOffset = elemInfo.getOrdinatesOffset( i ) + offset; - elemInfo.setOrdinatesOffset( i, newOffset ); - } - } - - private static SDOGType deriveGTYPE(ElementType elementType, - SDOGeometry origGeom) { - switch ( elementType ) { - case POINT: - case ORIENTATION: - return new SDOGType( - origGeom.getDimension(), origGeom - .getLRSDimension(), TypeGeometry.POINT - ); - case POINT_CLUSTER: - return new SDOGType( - origGeom.getDimension(), origGeom - .getLRSDimension(), TypeGeometry.MULTIPOINT - ); - case LINE_ARC_SEGMENTS: - case LINE_STRAITH_SEGMENTS: - case COMPOUND_LINE: - return new SDOGType( - origGeom.getDimension(), origGeom - .getLRSDimension(), TypeGeometry.LINE - ); - case COMPOUND_EXTERIOR_RING: - case EXTERIOR_RING_ARC_SEGMENTS: - case EXTERIOR_RING_CIRCLE: - case EXTERIOR_RING_RECT: - case EXTERIOR_RING_STRAIGHT_SEGMENTS: - return new SDOGType( - origGeom.getDimension(), origGeom - .getLRSDimension(), TypeGeometry.POLYGON - ); - default: - return null; - } - } - - public static SDOGeometry load(Struct struct) { - - Object[] data; - try { - data = struct.getAttributes(); - } - catch ( SQLException e ) { - throw new RuntimeException( e ); - } - - final SDOGeometry geom = new SDOGeometry(); - geom.setGType( SDOGType.parse( data[0] ) ); - geom.setSRID( data[1] ); - if ( data[2] != null ) { - geom.setPoint( new SDOPoint( (Struct) data[2] ) ); - } - geom.setInfo( new ElemInfo( (Array) data[3] ) ); - geom.setOrdinates( new Ordinates( (Array) data[4] ) ); - - return geom; - } - - public ElemInfo getInfo() { - return info; - } - - public void setInfo(ElemInfo info) { - this.info = info; - } - - public SDOGType getGType() { - return gtype; - } - - public void setGType(SDOGType gtype) { - this.gtype = gtype; - } - - public Ordinates getOrdinates() { - return ordinates; - } - - public void setOrdinates(Ordinates ordinates) { - this.ordinates = ordinates; - } - - public SDOPoint getPoint() { - return point; - } - - public void setPoint(SDOPoint point) { - this.point = point; - } - - public int getSRID() { - return srid; - } - - public void setSRID(int srid) { - this.srid = srid; - } - - private void setSRID(Object datum) { - if ( datum == null ) { - this.srid = 0; - return; - } - try { - this.srid = ( (Number) datum ).intValue(); - } - catch ( Exception e ) { - throw new RuntimeException( e ); - } - } - - public boolean isLRSGeometry() { - return gtype.isLRSGeometry(); - } - - public int getDimension() { - return gtype.getDimension(); - } - - public int getLRSDimension() { - return gtype.getLRSDimension(); - } - - public int getZDimension() { - return gtype.getZDimension(); - } - - /** - * Gets the number of elements or compound elements. - *

- * Subelements of a compound element are not counted. - * - * @return the number of elements - */ - public int getNumElements() { - int cnt = 0; - int i = 0; - while ( i < info.getSize() ) { - if ( info.getElementType( i ).isCompound() ) { - final int numCompounds = info.getNumCompounds( i ); - i += 1 + numCompounds; - } - else { - i++; - } - cnt++; - } - return cnt; - } - - public String toString() { - final StringBuilder stb = new StringBuilder(); - stb.append( "(" ).append( gtype ).append( "," ).append( srid ).append( "," ) - .append( point ).append( "," ).append( info ).append( "," ).append( - ordinates - ).append( ")" ); - return stb.toString(); - } - - public void addOrdinates(Double[] newOrdinates) { - if ( this.ordinates == null ) { - this.ordinates = new Ordinates( newOrdinates ); - } - else { - this.ordinates.addOrdinates( newOrdinates ); - } - } - - public void addElement(ElemInfo element) { - if ( this.info == null ) { - this.info = element; - } - else { - this.info.addElement( element ); - } - } - - /** - * If this SDOGeometry is a COLLECTION, this method returns an array of - * the SDO_GEOMETRIES that make up the collection. If not a Collection, - * an array containing this SDOGeometry is returned. - * - * @return collection elements as individual SDO_GEOMETRIES - */ - public SDOGeometry[] getElementGeometries() { - if ( getGType().getTypeGeometry() == TypeGeometry.COLLECTION ) { - final List elements = new ArrayList(); - int i = 0; - while ( i < this.getNumElements() ) { - final ElementType et = this.getInfo().getElementType( i ); - int next = i + 1; - // if the element is an exterior ring, or a compound - // element, then this geometry spans multiple elements. - if ( et.isExteriorRing() ) { - // then next element is the - // first non-interior ring - while ( next < this.getNumElements() ) { - if ( !this.getInfo().getElementType( next ) - .isInteriorRing() ) { - break; - } - next++; - } - } - else if ( et.isCompound() ) { - next = i + this.getInfo().getNumCompounds( i ) + 1; - } - final SDOGeometry elemGeom = new SDOGeometry(); - final SDOGType elemGtype = deriveGTYPE( this.getInfo().getElementType( i ), this ); - elemGeom.setGType( elemGtype ); - elemGeom.setSRID( this.getSRID() ); - final ElemInfo elemInfo = new ElemInfo( this.getInfo().getElement( i ) ); - shiftOrdinateOffset( elemInfo, -elemInfo.getOrdinatesOffset( 0 ) + 1 ); - elemGeom.setInfo( elemInfo ); - final int startPosition = this.getInfo().getOrdinatesOffset( i ); - Ordinates elemOrdinates = null; - if ( next < this.getNumElements() ) { - final int endPosition = this.getInfo().getOrdinatesOffset( next ); - elemOrdinates = new Ordinates( - this.getOrdinates() - .getOrdinatesArray( startPosition, endPosition ) - ); - } - else { - elemOrdinates = new Ordinates( - this.getOrdinates() - .getOrdinatesArray( startPosition ) - ); - } - elemGeom.setOrdinates( elemOrdinates ); - elements.add( elemGeom ); - i = next; - } - return elements.toArray( new SDOGeometry[elements.size()] ); - } - else { - return new SDOGeometry[] { this }; - } - } - -} diff --git a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGeometryTypeDescriptor.java b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGeometryTypeDescriptor.java index a1fdfe8133..9dfbd1c860 100644 --- a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGeometryTypeDescriptor.java +++ b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGeometryTypeDescriptor.java @@ -23,6 +23,7 @@ package org.hibernate.spatial.dialect.oracle; import java.sql.Types; +import org.geolatte.geom.codec.db.oracle.OracleJDBCTypeFactory; import org.hibernate.type.descriptor.ValueBinder; import org.hibernate.type.descriptor.ValueExtractor; import org.hibernate.type.descriptor.java.JavaTypeDescriptor; diff --git a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGeometryValueBinder.java b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGeometryValueBinder.java index 6440062577..5590cfef22 100644 --- a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGeometryValueBinder.java +++ b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGeometryValueBinder.java @@ -21,22 +21,10 @@ package org.hibernate.spatial.dialect.oracle; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.sql.Types; - -import com.vividsolutions.jts.algorithm.CGAlgorithms; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.Geometry; -import com.vividsolutions.jts.geom.GeometryCollection; -import com.vividsolutions.jts.geom.LineString; -import com.vividsolutions.jts.geom.MultiLineString; -import com.vividsolutions.jts.geom.MultiPoint; -import com.vividsolutions.jts.geom.MultiPolygon; -import com.vividsolutions.jts.geom.Point; -import com.vividsolutions.jts.geom.Polygon; - +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; import org.hibernate.HibernateException; import org.hibernate.spatial.helper.FinderException; import org.hibernate.type.descriptor.ValueBinder; @@ -44,12 +32,18 @@ import org.hibernate.type.descriptor.WrapperOptions; import org.hibernate.type.descriptor.java.JavaTypeDescriptor; import org.hibernate.type.descriptor.sql.SqlTypeDescriptor; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Types; + /** * @author Karel Maesen, Geovise BVBA * creation-date: 8/22/11 */ class SDOGeometryValueBinder implements ValueBinder { + private static final String SQL_TYPE_NAME = "MDSYS.SDO_GEOMETRY"; private final OracleJDBCTypeFactory typeFactory; private final JavaTypeDescriptor javaTypeDescriptor; @@ -62,11 +56,11 @@ class SDOGeometryValueBinder implements ValueBinder { @Override public void bind(PreparedStatement st, J value, int index, WrapperOptions options) throws SQLException { if ( value == null ) { - st.setNull( index, Types.STRUCT, SDOGeometry.getTypeName() ); + st.setNull( index, Types.STRUCT, SQL_TYPE_NAME ); } else { - final Geometry jtsGeom = javaTypeDescriptor.unwrap( value, Geometry.class, options ); - final Object dbGeom = toNative( jtsGeom, st.getConnection() ); + final Geometry geometry = javaTypeDescriptor.unwrap( value, Geometry.class, options ); + final Object dbGeom = toNative( geometry, st.getConnection() ); st.setObject( index, dbGeom ); } } @@ -75,345 +69,20 @@ class SDOGeometryValueBinder implements ValueBinder { return typeFactory.createStruct( geom, conn ); } - private Object toNative(Geometry jtsGeom, Connection connection) { - final SDOGeometry geom = convertJTSGeometry( jtsGeom ); - if ( geom != null ) { - try { - return store( geom, connection ); - } - catch ( SQLException e ) { - throw new HibernateException( - "Problem during conversion from JTS to SDOGeometry", e - ); - } - catch ( FinderException e ) { - throw new HibernateException( - "OracleConnection could not be retrieved for creating SDOGeometry STRUCT", e - ); - } - } - else { - throw new UnsupportedOperationException( - "Conversion of " - + jtsGeom.getClass().getSimpleName() - + " to Oracle STRUCT not supported" - ); - } - } - - private SDOGeometry convertJTSGeometry(Geometry jtsGeom) { - SDOGeometry geom = null; - if ( jtsGeom instanceof Point ) { - geom = convertJTSPoint( (Point) jtsGeom ); - } - else if ( jtsGeom instanceof LineString ) { - geom = convertJTSLineString( (LineString) jtsGeom ); - } - else if ( jtsGeom instanceof Polygon ) { - geom = convertJTSPolygon( (Polygon) jtsGeom ); - } - else if ( jtsGeom instanceof MultiPoint ) { - geom = convertJTSMultiPoint( (MultiPoint) jtsGeom ); - } - else if ( jtsGeom instanceof MultiLineString ) { - geom = convertJTSMultiLineString( (MultiLineString) jtsGeom ); - } - else if ( jtsGeom instanceof MultiPolygon ) { - geom = convertJTSMultiPolygon( (MultiPolygon) jtsGeom ); - } - else if ( jtsGeom instanceof GeometryCollection ) { - geom = convertJTSGeometryCollection( (GeometryCollection) jtsGeom ); - } - return geom; - } - - private SDOGeometry convertJTSGeometryCollection( - GeometryCollection collection) { - final SDOGeometry[] sdoElements = new SDOGeometry[collection.getNumGeometries()]; - for ( int i = 0; i < collection.getNumGeometries(); i++ ) { - final Geometry geom = collection.getGeometryN( i ); - sdoElements[i] = convertJTSGeometry( geom ); - } - final SDOGeometry ccollect = SDOGeometry.join( sdoElements ); - ccollect.setSRID( collection.getSRID() ); - return ccollect; - } - - private SDOGeometry convertJTSMultiPolygon(MultiPolygon multiPolygon) { - final int dim = getCoordDimension( multiPolygon ); - final int lrsPos = getCoordinateLrsPosition( multiPolygon ); - final SDOGeometry geom = new SDOGeometry(); - geom.setGType( new SDOGType( dim, lrsPos, TypeGeometry.MULTIPOLYGON ) ); - geom.setSRID( multiPolygon.getSRID() ); - for ( int i = 0; i < multiPolygon.getNumGeometries(); i++ ) { - try { - final Polygon pg = (Polygon) multiPolygon.getGeometryN( i ); - addPolygon( geom, pg ); - } - catch ( Exception e ) { - throw new RuntimeException( - "Found geometry that was not a geometry in MultiPolygon" - ); - } - } - return geom; - } - - private SDOGeometry convertJTSLineString(LineString lineString) { - final int dim = getCoordDimension( lineString ); - final int lrsPos = getCoordinateLrsPosition( lineString ); - final boolean isLrs = lrsPos > 0; - final Double[] ordinates = convertCoordinates( lineString.getCoordinates(), dim, isLrs ); - final SDOGeometry geom = new SDOGeometry(); - geom.setGType( new SDOGType( dim, lrsPos, TypeGeometry.LINE ) ); - geom.setSRID( lineString.getSRID() ); - final ElemInfo info = new ElemInfo( 1 ); - info.setElement( 0, 1, ElementType.LINE_STRAITH_SEGMENTS, 0 ); - geom.setInfo( info ); - geom.setOrdinates( new Ordinates( ordinates ) ); - return geom; - - } - - private SDOGeometry convertJTSMultiPoint(MultiPoint multiPoint) { - final int dim = getCoordDimension( multiPoint ); - final int lrsDim = getCoordinateLrsPosition( multiPoint ); - final boolean isLrs = ( lrsDim != 0 ); - final SDOGeometry geom = new SDOGeometry(); - geom.setGType( new SDOGType( dim, lrsDim, TypeGeometry.MULTIPOINT ) ); - geom.setSRID( multiPoint.getSRID() ); - final ElemInfo info = new ElemInfo( multiPoint.getNumPoints() ); - int oordinatesOffset = 1; - Double[] ordinates = new Double[] { }; - for ( int i = 0; i < multiPoint.getNumPoints(); i++ ) { - info.setElement( i, oordinatesOffset, ElementType.POINT, 0 ); - ordinates = convertAddCoordinates( - ordinates, multiPoint - .getGeometryN( i ).getCoordinates(), dim, isLrs - ); - oordinatesOffset = ordinates.length + 1; - } - geom.setInfo( info ); - geom.setOrdinates( new Ordinates( ordinates ) ); - return geom; - } - - private SDOGeometry convertJTSPoint(Point jtsGeom) { - final int dim = getCoordDimension( jtsGeom ); - final int lrsDim = getCoordinateLrsPosition( jtsGeom ); - final boolean isLrs = ( lrsDim != 0 ); - - final Double[] coord = convertCoordinates( jtsGeom.getCoordinates(), dim, isLrs ); - final SDOGeometry geom = new SDOGeometry(); - geom.setGType( new SDOGType( dim, lrsDim, TypeGeometry.POINT ) ); - geom.setSRID( jtsGeom.getSRID() ); - final ElemInfo info = new ElemInfo( 1 ); - info.setElement( 0, 1, ElementType.POINT, 1 ); - geom.setInfo( info ); - geom.setOrdinates( new Ordinates( coord ) ); - return geom; - } - - private SDOGeometry convertJTSPolygon(Polygon polygon) { - final int dim = getCoordDimension( polygon ); - final int lrsPos = getCoordinateLrsPosition( polygon ); - final SDOGeometry geom = new SDOGeometry(); - geom.setGType( new SDOGType( dim, lrsPos, TypeGeometry.POLYGON ) ); - geom.setSRID( polygon.getSRID() ); - addPolygon( geom, polygon ); - return geom; - } - - private void addPolygon(SDOGeometry geom, Polygon polygon) { - final int numInteriorRings = polygon.getNumInteriorRing(); - final ElemInfo info = new ElemInfo( numInteriorRings + 1 ); - int ordinatesPreviousOffset = 0; - if ( geom.getOrdinates() != null ) { - ordinatesPreviousOffset = geom.getOrdinates().getOrdinateArray().length; - } - int ordinatesOffset = ordinatesPreviousOffset + 1; - Double[] ordinates = new Double[] { }; - for ( int i = 0; i < info.getSize(); i++ ) { - ElementType et; - Coordinate[] coords; - if ( i == 0 ) { - et = ElementType.EXTERIOR_RING_STRAIGHT_SEGMENTS; - coords = polygon.getExteriorRing().getCoordinates(); - if ( !CGAlgorithms.isCCW( coords ) ) { - coords = reverseRing( coords ); - } - } - else { - et = ElementType.INTERIOR_RING_STRAIGHT_SEGMENTS; - coords = polygon.getInteriorRingN( i - 1 ).getCoordinates(); - if ( CGAlgorithms.isCCW( coords ) ) { - coords = reverseRing( coords ); - } - } - info.setElement( i, ordinatesOffset, et, 0 ); - ordinates = convertAddCoordinates( - ordinates, coords, geom - .getDimension(), geom.isLRSGeometry() - ); - ordinatesOffset = ordinatesPreviousOffset + ordinates.length + 1; - } - geom.addElement( info ); - geom.addOrdinates( ordinates ); - } - - private SDOGeometry convertJTSMultiLineString( - MultiLineString multiLineString) { - final int dim = getCoordDimension( multiLineString ); - final int lrsDim = getCoordinateLrsPosition( multiLineString ); - final boolean isLrs = ( lrsDim != 0 ); - final SDOGeometry geom = new SDOGeometry(); - geom.setGType( new SDOGType( dim, lrsDim, TypeGeometry.MULTILINE ) ); - geom.setSRID( multiLineString.getSRID() ); - final ElemInfo info = new ElemInfo( multiLineString.getNumGeometries() ); - int oordinatesOffset = 1; - Double[] ordinates = new Double[] { }; - for ( int i = 0; i < multiLineString.getNumGeometries(); i++ ) { - info.setElement( - i, oordinatesOffset, - ElementType.LINE_STRAITH_SEGMENTS, 0 - ); - ordinates = convertAddCoordinates( - ordinates, multiLineString - .getGeometryN( i ).getCoordinates(), dim, isLrs - ); - oordinatesOffset = ordinates.length + 1; - } - geom.setInfo( info ); - geom.setOrdinates( new Ordinates( ordinates ) ); - return geom; - } - - private Double[] convertAddCoordinates(Double[] ordinates, Coordinate[] coordinates, int dim, boolean isLrs) { - final Double[] no = convertCoordinates( coordinates, dim, isLrs ); - final Double[] newordinates = new Double[ordinates.length + no.length]; - System.arraycopy( ordinates, 0, newordinates, 0, ordinates.length ); - System.arraycopy( no, 0, newordinates, ordinates.length, no.length ); - return newordinates; - } - - /** - * Convert the coordinates to a double array for purposes of persisting them - * to the database. Note that Double.NaN values are to be converted to null - * values in the array. - * - * @param coordinates Coordinates to be converted to the array - * @param dim Coordinate dimension - * @param isLrs true if the coordinates contain measures - * - * @return - */ - private Double[] convertCoordinates(Coordinate[] coordinates, int dim, - boolean isLrs) { - - if ( isLrs ) { - throw new UnsupportedOperationException(); - } - - if ( dim > 4 ) { - throw new IllegalArgumentException( - "Dim parameter value cannot be greater than 4" - ); - } - final Double[] converted = new Double[coordinates.length * dim]; - for ( int i = 0; i < coordinates.length; i++ ) { - final Coordinate c = coordinates[i]; - // set the X and Y values - converted[i * dim] = toDouble( c.x ); - converted[i * dim + 1] = toDouble( c.y ); - if ( dim == 3 ) { - converted[i * dim + 2] = toDouble( c.z ); - } -// else if ( dim == 4 ) { -// converted[i * dim + 2] = toDouble( c.z ); -// converted[i * dim + 3] = toDouble( c.m ); -// } - } - return converted; - } - - /** - * This method converts a double primitive to a Double wrapper instance, but - * treats a Double.NaN value as null. - * - * @param d the value to be converted - * - * @return A Double instance of d, Null if the parameter is Double.NaN - */ - private Double toDouble(double d) { - return Double.isNaN( d ) ? null : d; - } - - /** - * Return the dimension required for building the gType in the SDOGeometry - * object. Has support for LRS type geometries. - * - * @param geom and instance of the Geometry class from which the dimension is - * being extracted. - * - * @return number of dimensions for purposes of creating the - * SDOGeometry.SDOGType - */ - private int getCoordDimension(Geometry geom) { - // This is awkward, I have to create an MCoordinate to discover what the - // dimension is. - // This shall be cleaner if MCoordinate.getOrdinate(int ordinateIndex) - // is moved to the - // Coordinate class - final Coordinate c = geom.getCoordinate(); - int d = 0; - if ( c != null ) { - if ( !Double.isNaN( c.x ) ) { - d++; - } - if ( !Double.isNaN( c.y ) ) { - d++; - } - if ( !Double.isNaN( c.z ) ) { - d++; - } -// if ( !Double.isNaN( c.m ) ) { -// d++; -// } - } - return d; - } - - /** - * Returns the lrs measure position for purposes of building the gType for - * an oracle geometry. At this point and time, I'll have to assume that the - * measure is always put at the end of the ordinate tuple, even though it - * technically wouldn't have to. This method bases its decision on whether - * the first coordinate has a measure value, as measure are required for the - * very first and last measure in a CoordinateSequence. If there is no - * measure value, 0 is returned. - * - * @param geom and instance of the Geometry class from which the lrs position - * is being extracted. - * - * @return the lrs position for the SDOGeometry.SDOGType - */ - private int getCoordinateLrsPosition(Geometry geom) { - final int measurePos = 0; -// if ( c != null && !Double.isNaN( c.m ) ) { -// measurePos = ( Double.isNaN( c.z ) ) ? 3 : 4; -// } - return measurePos; - } - - // reverses ordinates in a coordinate array in-place - - private Coordinate[] reverseRing(Coordinate[] ar) { - for ( int i = 0; i < ar.length / 2; i++ ) { - final Coordinate cs = ar[i]; - ar[i] = ar[ar.length - 1 - i]; - ar[ar.length - 1 - i] = cs; - } - return ar; - } + private Object toNative(Geometry geom, Connection connection) { + final SDOGeometry sdoGeom = Encoders.encode(geom); + if (geom != null) { + try { + return store(sdoGeom, connection); + } catch (SQLException e) { + throw new HibernateException("Problem during conversion from JTS to SDOGeometry", e); + } catch (FinderException e) { + throw new HibernateException("OracleConnection could not be retrieved for creating SDOGeometry " + + "STRUCT", e); + } + } else { + throw new UnsupportedOperationException("Conversion of " + geom.getClass().getSimpleName() + " to Oracle STRUCT not supported"); + } + } } diff --git a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGeometryValueExtractor.java b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGeometryValueExtractor.java index fd71321647..06e0dbbd2a 100644 --- a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGeometryValueExtractor.java +++ b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOGeometryValueExtractor.java @@ -25,22 +25,11 @@ import java.sql.CallableStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Struct; -import java.util.ArrayList; -import java.util.List; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.CoordinateSequence; -import com.vividsolutions.jts.geom.Geometry; -import com.vividsolutions.jts.geom.GeometryFactory; -import com.vividsolutions.jts.geom.LineString; -import com.vividsolutions.jts.geom.LinearRing; -import com.vividsolutions.jts.geom.MultiLineString; -import com.vividsolutions.jts.geom.MultiPoint; -import com.vividsolutions.jts.geom.MultiPolygon; -import com.vividsolutions.jts.geom.Point; -import com.vividsolutions.jts.geom.Polygon; -import org.hibernate.spatial.jts.Circle; +import org.geolatte.geom.Geometry; +import org.geolatte.geom.codec.db.oracle.Decoders; +import org.geolatte.geom.codec.db.oracle.SDOGeometry; import org.hibernate.type.descriptor.WrapperOptions; import org.hibernate.type.descriptor.java.JavaTypeDescriptor; import org.hibernate.type.descriptor.sql.BasicExtractor; @@ -57,9 +46,6 @@ import org.hibernate.type.descriptor.sql.SqlTypeDescriptor; */ public class SDOGeometryValueExtractor extends BasicExtractor { - private static GeometryFactory geometryFactory = new GeometryFactory(); - - /** * Creates instance * @@ -73,25 +59,19 @@ public class SDOGeometryValueExtractor extends BasicExtractor { @Override protected X doExtract(ResultSet rs, String name, WrapperOptions options) throws SQLException { final Object geomObj = rs.getObject( name ); - return getJavaDescriptor().wrap( toJTS( geomObj ), options ); + return getJavaDescriptor().wrap( convert(geomObj), options ); } @Override protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException { final Object geomObj = statement.getObject( index ); - return getJavaDescriptor().wrap( toJTS( geomObj ), options ); + return getJavaDescriptor().wrap( convert(geomObj), options ); } @Override protected X doExtract(CallableStatement statement, String name, WrapperOptions options) throws SQLException { final Object geomObj = statement.getObject( name ); - return getJavaDescriptor().wrap( toJTS( geomObj ), options ); - } - - //TODO Clean up below this point - - protected GeometryFactory getGeometryFactory() { - return geometryFactory; + return getJavaDescriptor().wrap( convert(geomObj), options ); } /** @@ -101,455 +81,16 @@ public class SDOGeometryValueExtractor extends BasicExtractor { * * @return The JTS Geometry value */ - public Geometry toJTS(Object struct) { + public Geometry convert(Object struct) { if ( struct == null ) { return null; } final SDOGeometry sdogeom = SDOGeometry.load( (Struct) struct ); - return convert2JTS( sdogeom ); + return toGeomerty(sdogeom); } - private Geometry convert2JTS(SDOGeometry sdoGeom) { - final int dim = sdoGeom.getGType().getDimension(); - final int lrsDim = sdoGeom.getGType().getLRSDimension(); - Geometry result = null; - switch ( sdoGeom.getGType().getTypeGeometry() ) { - case POINT: - result = convertSDOPoint( sdoGeom ); - break; - case LINE: - result = convertSDOLine( dim, lrsDim, sdoGeom ); - break; - case POLYGON: - result = convertSDOPolygon( dim, lrsDim, sdoGeom ); - break; - case MULTIPOINT: - result = convertSDOMultiPoint( dim, lrsDim, sdoGeom ); - break; - case MULTILINE: - result = convertSDOMultiLine( dim, lrsDim, sdoGeom ); - break; - case MULTIPOLYGON: - result = convertSDOMultiPolygon( dim, lrsDim, sdoGeom ); - break; - case COLLECTION: - result = convertSDOCollection( dim, lrsDim, sdoGeom ); - break; - default: - throw new IllegalArgumentException( - "Type not supported: " - + sdoGeom.getGType().getTypeGeometry() - ); - } - result.setSRID( sdoGeom.getSRID() ); - return result; - - } - - private Geometry convertSDOCollection(int dim, int lrsDim, SDOGeometry sdoGeom) { - final List geometries = new ArrayList(); - for ( SDOGeometry elemGeom : sdoGeom.getElementGeometries() ) { - geometries.add( convert2JTS( elemGeom ) ); - } - final Geometry[] geomArray = new Geometry[geometries.size()]; - return getGeometryFactory().createGeometryCollection( - geometries.toArray( geomArray ) - ); - } - - private Point convertSDOPoint(SDOGeometry sdoGeom) { - Double[] ordinates = sdoGeom.getOrdinates().getOrdinateArray(); - if ( ordinates.length == 0 ) { - if ( sdoGeom.getDimension() == 2 ) { - ordinates = new Double[] { - sdoGeom.getPoint().x, - sdoGeom.getPoint().y - }; - } - else { - ordinates = new Double[] { - sdoGeom.getPoint().x, - sdoGeom.getPoint().y, sdoGeom.getPoint().z - }; - } - } - final CoordinateSequence cs = convertOrdinateArray( ordinates, sdoGeom ); - return getGeometryFactory().createPoint( cs ); - } - - private MultiPoint convertSDOMultiPoint(int dim, int lrsDim, SDOGeometry sdoGeom) { - final Double[] ordinates = sdoGeom.getOrdinates().getOrdinateArray(); - final CoordinateSequence cs = convertOrdinateArray( ordinates, sdoGeom ); - final MultiPoint multipoint = getGeometryFactory().createMultiPoint( cs ); - return multipoint; - } - - private LineString convertSDOLine(int dim, int lrsDim, SDOGeometry sdoGeom) { - final boolean lrs = sdoGeom.isLRSGeometry(); - final ElemInfo info = sdoGeom.getInfo(); - CoordinateSequence cs = null; - - int i = 0; - while ( i < info.getSize() ) { - if ( info.getElementType( i ).isCompound() ) { - final int numCompounds = info.getNumCompounds( i ); - cs = add( cs, getCompoundCSeq( i + 1, i + numCompounds, sdoGeom ) ); - i += 1 + numCompounds; - } - else { - cs = add( cs, getElementCSeq( i, sdoGeom, false ) ); - i++; - } - } - - - if ( lrs ) { - throw new UnsupportedOperationException(); - } - else { - return getGeometryFactory().createLineString( cs ); - } - - } - - private MultiLineString convertSDOMultiLine(int dim, int lrsDim, SDOGeometry sdoGeom) { - final boolean lrs = sdoGeom.isLRSGeometry(); - if ( lrs ) { - throw new UnsupportedOperationException(); - } - final ElemInfo info = sdoGeom.getInfo(); - final LineString[] lines = new LineString[sdoGeom.getInfo().getSize()]; - int i = 0; - while ( i < info.getSize() ) { - CoordinateSequence cs = null; - if ( info.getElementType( i ).isCompound() ) { - final int numCompounds = info.getNumCompounds( i ); - cs = add( cs, getCompoundCSeq( i + 1, i + numCompounds, sdoGeom ) ); - final LineString line = getGeometryFactory().createLineString( cs ); - lines[i] = line; - i += 1 + numCompounds; - } - else { - cs = add( cs, getElementCSeq( i, sdoGeom, false ) ); - final LineString line = getGeometryFactory().createLineString( cs ); - lines[i] = line; - i++; - } - } - - return getGeometryFactory().createMultiLineString( lines ); - } - - private Geometry convertSDOPolygon(int dim, int lrsDim, SDOGeometry sdoGeom) { - LinearRing shell = null; - final LinearRing[] holes = new LinearRing[sdoGeom.getNumElements() - 1]; - final ElemInfo info = sdoGeom.getInfo(); - int i = 0; - int idxInteriorRings = 0; - while ( i < info.getSize() ) { - CoordinateSequence cs = null; - int numCompounds = 0; - if ( info.getElementType( i ).isCompound() ) { - numCompounds = info.getNumCompounds( i ); - cs = add( cs, getCompoundCSeq( i + 1, i + numCompounds, sdoGeom ) ); - } - else { - cs = add( cs, getElementCSeq( i, sdoGeom, false ) ); - } - if ( info.getElementType( i ).isInteriorRing() ) { - holes[idxInteriorRings] = getGeometryFactory() - .createLinearRing( cs ); - idxInteriorRings++; - } - else { - shell = getGeometryFactory().createLinearRing( cs ); - } - i += 1 + numCompounds; - } - return getGeometryFactory().createPolygon( shell, holes ); - } - - private MultiPolygon convertSDOMultiPolygon(int dim, int lrsDim, SDOGeometry sdoGeom) { - List holes = new ArrayList(); - final List polygons = new ArrayList(); - final ElemInfo info = sdoGeom.getInfo(); - LinearRing shell = null; - int i = 0; - while ( i < info.getSize() ) { - CoordinateSequence cs = null; - int numCompounds = 0; - if ( info.getElementType( i ).isCompound() ) { - numCompounds = info.getNumCompounds( i ); - cs = add( cs, getCompoundCSeq( i + 1, i + numCompounds, sdoGeom ) ); - } - else { - cs = add( cs, getElementCSeq( i, sdoGeom, false ) ); - } - if ( info.getElementType( i ).isInteriorRing() ) { - final LinearRing lr = getGeometryFactory().createLinearRing( cs ); - holes.add( lr ); - } - else { - if ( shell != null ) { - final Polygon polygon = getGeometryFactory().createPolygon( - shell, - holes.toArray( new LinearRing[holes.size()] ) - ); - polygons.add( polygon ); - shell = null; - } - shell = getGeometryFactory().createLinearRing( cs ); - holes = new ArrayList(); - } - i += 1 + numCompounds; - } - if ( shell != null ) { - final Polygon polygon = getGeometryFactory().createPolygon( - shell, - holes.toArray( new LinearRing[holes.size()] ) - ); - polygons.add( polygon ); - } - return getGeometryFactory().createMultiPolygon( polygons.toArray( new Polygon[polygons.size()] ) ); - } - - /** - * Gets the CoordinateSequence corresponding to a compound element. - * - * @param idxFirst the first sub-element of the compound element - * @param idxLast the last sub-element of the compound element - * @param sdoGeom the SDOGeometry that holds the compound element. - * - * @return - */ - private CoordinateSequence getCompoundCSeq(int idxFirst, int idxLast, SDOGeometry sdoGeom) { - CoordinateSequence cs = null; - for ( int i = idxFirst; i <= idxLast; i++ ) { - // pop off the last element as it is added with the next - // coordinate sequence - if ( cs != null && cs.size() > 0 ) { - final Coordinate[] coordinates = cs.toCoordinateArray(); - final Coordinate[] newCoordinates = new Coordinate[coordinates.length - 1]; - System.arraycopy( coordinates, 0, newCoordinates, 0, coordinates.length - 1 ); - cs = getGeometryFactory().getCoordinateSequenceFactory().create( newCoordinates ); - } - cs = add( cs, getElementCSeq( i, sdoGeom, ( i < idxLast ) ) ); - } - return cs; - } - - /** - * Gets the CoordinateSequence corresponding to an element. - * - * @param i - * @param sdoGeom - * - * @return - */ - private CoordinateSequence getElementCSeq(int i, SDOGeometry sdoGeom, boolean hasNextSE) { - final ElementType type = sdoGeom.getInfo().getElementType( i ); - final Double[] elemOrdinates = extractOrdinatesOfElement( i, sdoGeom, hasNextSE ); - CoordinateSequence cs; - if ( type.isStraightSegment() ) { - cs = convertOrdinateArray( elemOrdinates, sdoGeom ); - } - else if ( type.isArcSegment() || type.isCircle() ) { - final Coordinate[] linearized = linearize( - elemOrdinates, - sdoGeom.getDimension(), - sdoGeom.isLRSGeometry(), - type.isCircle() - ); - cs = getGeometryFactory().getCoordinateSequenceFactory().create( linearized ); - } - else if ( type.isRect() ) { - cs = convertOrdinateArray( elemOrdinates, sdoGeom ); - final Coordinate ll = cs.getCoordinate( 0 ); - final Coordinate ur = cs.getCoordinate( 1 ); - final Coordinate lr = new Coordinate( ur.x, ll.y ); - final Coordinate ul = new Coordinate( ll.x, ur.y ); - if ( type.isExteriorRing() ) { - cs = getGeometryFactory().getCoordinateSequenceFactory() - .create( new Coordinate[] { ll, lr, ur, ul, ll } ); - } - else { - cs = getGeometryFactory().getCoordinateSequenceFactory() - .create( new Coordinate[] { ll, ul, ur, lr, ll } ); - } - } - else { - throw new RuntimeException( - "Unexpected Element type in compound: " - + type - ); - } - return cs; - } - - private CoordinateSequence add(CoordinateSequence seq1, CoordinateSequence seq2) { - if ( seq1 == null ) { - return seq2; - } - if ( seq2 == null ) { - return seq1; - } - final Coordinate[] c1 = seq1.toCoordinateArray(); - final Coordinate[] c2 = seq2.toCoordinateArray(); - final Coordinate[] c3 = new Coordinate[c1.length + c2.length]; - System.arraycopy( c1, 0, c3, 0, c1.length ); - System.arraycopy( c2, 0, c3, c1.length, c2.length ); - return getGeometryFactory().getCoordinateSequenceFactory().create( c3 ); - } - - private Double[] extractOrdinatesOfElement(int element, SDOGeometry sdoGeom, boolean hasNextSE) { - final int start = sdoGeom.getInfo().getOrdinatesOffset( element ); - if ( element < sdoGeom.getInfo().getSize() - 1 ) { - int end = sdoGeom.getInfo().getOrdinatesOffset( element + 1 ); - // if this is a subelement of a compound geometry, - // the last point is the first point of - // the next subelement. - if ( hasNextSE ) { - end += sdoGeom.getDimension(); - } - return sdoGeom.getOrdinates().getOrdinatesArray( start, end ); - } - else { - return sdoGeom.getOrdinates().getOrdinatesArray( start ); - } - } - - private CoordinateSequence convertOrdinateArray(Double[] oordinates, SDOGeometry sdoGeom) { - final int dim = sdoGeom.getDimension(); - final Coordinate[] coordinates = new Coordinate[oordinates.length / dim]; - final int zDim = sdoGeom.getZDimension() - 1; -// final int lrsDim = sdoGeom.getLRSDimension() - 1; - for ( int i = 0; i < coordinates.length; i++ ) { - if ( dim == 2 ) { - coordinates[i] = new Coordinate( - oordinates[i * dim], - oordinates[i * dim + 1] - ); - } - else if ( dim == 3 ) { - if ( sdoGeom.isLRSGeometry() ) { - - throw new UnsupportedOperationException(); -// coordinates[i] = MCoordinate.create2dWithMeasure( -// oordinates[i * dim], // X -// oordinates[i * dim + 1], // Y -// oordinates[i * dim + lrsDim] -// ); // M - } - else { - coordinates[i] = new Coordinate( - //X - oordinates[i * dim], - //Y - oordinates[i * dim + 1], - oordinates[i * dim + zDim] - ); // Z - } - } -// else if ( dim == 4 ) { -// // This must be an LRS Geometry -// if ( !SDOGeom.isLRSGeometry() ) { -// throw new HibernateException( -// "4 dimensional Geometries must be LRS geometry" -// ); -// } -// coordinates[i] = MCoordinate.create3dWithMeasure( -// oordinates[i -// * dim], // X -// oordinates[i * dim + 1], // Y -// oordinates[i * dim + zDim], // Z -// oordinates[i * dim + lrsDim] -// ); // M -// } - } - return getGeometryFactory().getCoordinateSequenceFactory().create( - coordinates - ); - } - - /** - * Linearizes arcs and circles. - * - * @param arcOrdinates arc or circle coordinates - * @param dim coordinate dimension - * @param lrs whether this is an lrs geometry - * @param entireCirlce whether the whole arc should be linearized - * - * @return linearized interpolation of arcs or circle - */ - private Coordinate[] linearize(Double[] arcOrdinates, int dim, boolean lrs, boolean entireCirlce) { - Coordinate[] linearizedCoords = new Coordinate[0]; - // CoordDim is the dimension that includes only non-measure (X,Y,Z) - // ordinates in its value - final int coordDim = lrs ? dim - 1 : dim; - // this only works with 2-Dimensional geometries, since we use - // JGeometry linearization; - if ( coordDim != 2 ) { - throw new IllegalArgumentException( - "Can only linearize 2D arc segments, but geometry is " - + dim + "D." - ); - } - int numOrd = dim; - while ( numOrd < arcOrdinates.length ) { - numOrd = numOrd - dim; - final double x1 = arcOrdinates[numOrd++]; - final double y1 = arcOrdinates[numOrd++]; - final double m1 = lrs ? arcOrdinates[numOrd++] : Double.NaN; - final double x2 = arcOrdinates[numOrd++]; - final double y2 = arcOrdinates[numOrd++]; - final double m2 = lrs ? arcOrdinates[numOrd++] : Double.NaN; - final double x3 = arcOrdinates[numOrd++]; - final double y3 = arcOrdinates[numOrd++]; - final double m3 = lrs ? arcOrdinates[numOrd++] : Double.NaN; - - Coordinate[] coords; - if ( entireCirlce ) { - coords = Circle.linearizeCircle( x1, y1, x2, y2, x3, y3 ); - } - else { - coords = Circle.linearizeArc( x1, y1, x2, y2, x3, y3 ); - } - - // if this is an LRS geometry, fill the measure values into - // the linearized array - if ( lrs ) { - throw new UnsupportedOperationException(); -// MCoordinate[] mcoord = new MCoordinate[coords.length]; -// int lastIndex = coords.length - 1; -// mcoord[0] = MCoordinate.create2dWithMeasure( x1, y1, m1 ); -// mcoord[lastIndex] = MCoordinate.create2dWithMeasure( x3, y3, m3 ); -// // convert the middle coordinates to MCoordinate -// for ( int i = 1; i < lastIndex; i++ ) { -// mcoord[i] = MCoordinate.convertCoordinate( coords[i] ); -// // if we happen to split on the middle measure, then -// // assign it -// if ( Double.compare( mcoord[i].x, x2 ) == 0 -// && Double.compare( mcoord[i].y, y2 ) == 0 ) { -// mcoord[i].m = m2; -// } -// } -// coords = mcoord; - } - - // if this is not the first arcsegment, the first linearized - // point is already in linearizedArc, so disregard this. - int resultBegin = 1; - if ( linearizedCoords.length == 0 ) { - resultBegin = 0; - } - - final int destPos = linearizedCoords.length; - final Coordinate[] tmpCoords = new Coordinate[linearizedCoords.length + coords.length - resultBegin]; - System.arraycopy( linearizedCoords, 0, tmpCoords, 0, linearizedCoords.length ); - System.arraycopy( coords, resultBegin, tmpCoords, destPos, coords.length - resultBegin ); - linearizedCoords = tmpCoords; - } - return linearizedCoords; - } + private Geometry toGeomerty(SDOGeometry sdoGeom) { + return Decoders.decode(sdoGeom); + } } diff --git a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOPoint.java b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOPoint.java deleted file mode 100644 index ca291585ff..0000000000 --- a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SDOPoint.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This file is part of Hibernate Spatial, an extension to the - * hibernate ORM solution for spatial (geographic) data. - * - * Copyright © 2007-2012 Geovise BVBA - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package org.hibernate.spatial.dialect.oracle; - -import java.sql.SQLException; -import java.sql.Struct; - -/** - * @author Karel Maesen, Geovise BVBA - * creation-date: Jul 1, 2010 - */ -class SDOPoint { - public double x; - - public double y; - - public double z = Double.NaN; - - public SDOPoint(Struct struct) { - try { - final Object[] data = struct.getAttributes(); - this.x = ( (Number) data[0] ).doubleValue(); - this.y = ( (Number) data[1] ).doubleValue(); - if ( data[2] != null ) { - this.z = ( (Number) data[1] ).doubleValue(); - } - } - catch ( SQLException e ) { - throw new RuntimeException( e ); - } - } - - public String toString() { - final StringBuilder stb = new StringBuilder(); - stb.append( "(" ).append( x ).append( "," ).append( y ).append( "," ).append( - z - ).append( ")" ); - return stb.toString(); - } - -} diff --git a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SQLTypeFactory.java b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SQLTypeFactory.java deleted file mode 100644 index db8923b374..0000000000 --- a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/SQLTypeFactory.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of Hibernate Spatial, an extension to the - * hibernate ORM solution for spatial (geographic) data. - * - * Copyright © 2007-2012 Geovise BVBA - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package org.hibernate.spatial.dialect.oracle; - -import java.sql.Array; -import java.sql.Connection; -import java.sql.SQLException; -import java.sql.Struct; - -//TODO -- remove this interface.. - -/** - * @author Karel Maesen, Geovise BVBA - * creation-date: Jul 3, 2010 - */ -interface SQLTypeFactory { - - /** - * Creates a {@code Struct} representing the specified geometry, using the specified Connection. - * - * @param geom The {@code SDOGeometry} object - * @param conn The Oracle {@code Connection} used to create the {@code Struct} - * @return The {@code Struct} representation of the specified SDO Geometry - * @throws SQLException If a Struct object cannot be created. - */ - public abstract Struct createStruct(SDOGeometry geom, Connection conn) throws SQLException; - - public abstract Array createElemInfoArray(ElemInfo elemInfo, Connection conn) throws SQLException; - - public abstract Array createOrdinatesArray(Ordinates ordinates, Connection conn) throws SQLException; - -} diff --git a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/TypeGeometry.java b/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/TypeGeometry.java deleted file mode 100644 index b0f9892363..0000000000 --- a/hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/oracle/TypeGeometry.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * This file is part of Hibernate Spatial, an extension to the - * hibernate ORM solution for spatial (geographic) data. - * - * Copyright © 2007-2012 Geovise BVBA - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -package org.hibernate.spatial.dialect.oracle; - -/** - * @author Karel Maesen, Geovise BVBA - * creation-date: Jul 1, 2010 - */ -enum TypeGeometry { - - UNKNOWN_GEOMETRY( 0 ), POINT( 1 ), LINE( 2 ), POLYGON( 3 ), COLLECTION( 4 ), MULTIPOINT( - 5 - ), MULTILINE( 6 ), MULTIPOLYGON( 7 ), SOLID( 8 ), MULTISOLID( 9 ); - - private int gtype; - - TypeGeometry(int gtype) { - this.gtype = gtype; - } - - int intValue() { - return this.gtype; - } - - static TypeGeometry parse(int v) { - for ( TypeGeometry gt : values() ) { - if ( gt.intValue() == v ) { - return gt; - } - } - throw new RuntimeException( - "Value " + v - + " isn't a valid TypeGeometry value" - ); - } - -} diff --git a/hibernate-spatial/src/test/java/org/hibernate/spatial/testing/dialects/oracle/SDOGeometryExpectationsFactory.java b/hibernate-spatial/src/test/java/org/hibernate/spatial/testing/dialects/oracle/SDOGeometryExpectationsFactory.java index 3e99ed751d..d00f522674 100644 --- a/hibernate-spatial/src/test/java/org/hibernate/spatial/testing/dialects/oracle/SDOGeometryExpectationsFactory.java +++ b/hibernate-spatial/src/test/java/org/hibernate/spatial/testing/dialects/oracle/SDOGeometryExpectationsFactory.java @@ -266,6 +266,6 @@ public class SDOGeometryExpectationsFactory extends AbstractExpectationsFactory @Override protected Geometry decode(Object o) { - return decoder.toJTS( o ); + return decoder.convert(o); } }