package org.realityforge.jeo.geolatte.jpa;
import javax.persistence.EntityManager;
import org.geolatte.geom.Geometry;
import org.geolatte.geom.GeometryCollection;
import org.geolatte.geom.LineString;
import org.geolatte.geom.MultiLineString;
import org.geolatte.geom.MultiPoint;
import org.geolatte.geom.MultiPolygon;
import org.geolatte.geom.Point;
import org.geolatte.geom.Polygon;
import org.realityforge.jeo.geolatte.jpa.mssql.MsGeometryCollectionEntity;
import org.realityforge.jeo.geolatte.jpa.mssql.MsGeometryEntity;
import org.realityforge.jeo.geolatte.jpa.mssql.MsLineStringEntity;
import org.realityforge.jeo.geolatte.jpa.mssql.MsMultiLineStringEntity;
import org.realityforge.jeo.geolatte.jpa.mssql.MsMultiPointEntity;
import org.realityforge.jeo.geolatte.jpa.mssql.MsMultiPolygonEntity;
import org.realityforge.jeo.geolatte.jpa.mssql.MsPointEntity;
import org.realityforge.jeo.geolatte.jpa.mssql.MsPolygonEntity;
import org.realityforge.jeo.geolatte.jpa.pg.PgGeometryCollectionEntity;
import org.realityforge.jeo.geolatte.jpa.pg.PgGeometryEntity;
import org.realityforge.jeo.geolatte.jpa.pg.PgLineStringEntity;
import org.realityforge.jeo.geolatte.jpa.pg.PgMultiLineStringEntity;
import org.realityforge.jeo.geolatte.jpa.pg.PgMultiPointEntity;
import org.realityforge.jeo.geolatte.jpa.pg.PgMultiPolygonEntity;
import org.realityforge.jeo.geolatte.jpa.pg.PgPointEntity;
import org.realityforge.jeo.geolatte.jpa.pg.PgPolygonEntity;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import static org.testng.Assert.*;
public abstract class AbstractConverterTest
{
protected abstract boolean isPostgres();
@BeforeMethod
public void setup()
throws Exception
{
DatabaseTestUtil.setupDatabase( isPostgres() );
}
@AfterMethod
public void tearDown()
throws Exception
{
DatabaseTestUtil.tearDownDatabase( isPostgres() );
}
protected void performTests()
throws Exception
{
doTests( isPostgres() );
}
private void doTests( final boolean postgres )
throws Exception
{
testType( postgres,
postgres ? PgGeometryEntity.class : MsGeometryEntity.class,
Geometry.class,
"POINT ( 1 1 )" );
testType( postgres,
postgres ? PgGeometryCollectionEntity.class : MsGeometryCollectionEntity.class,
GeometryCollection.class,
"GEOMETRYCOLLECTION ( POINT ( 1 1 ) , POINT ( 1 1 ))" );
testType( postgres,
postgres ? PgPointEntity.class : MsPointEntity.class,
Point.class,
"POINT ( 1 1 )" );
testType( postgres,
postgres ? PgMultiPointEntity.class : MsMultiPointEntity.class,
MultiPoint.class,
"MULTIPOINT ( (100.0 0.0) , (101.0 1.0) )" );
testType( postgres,
postgres ? PgLineStringEntity.class : MsLineStringEntity.class,
LineString.class,
"LINESTRING ( 1 1, 2 1 )" );
testType( postgres,
postgres ? PgMultiLineStringEntity.class : MsMultiLineStringEntity.class,
MultiLineString.class,
"MULTILINESTRING ( ( 100.0 0.0, 101.0 1.0 ), ( 102.0 2.0, 103.0 3.0 ) )" );
testType( postgres,
postgres ? PgPolygonEntity.class : MsPolygonEntity.class,
Polygon.class,
"POLYGON((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 0.0))" );
testType( postgres,
postgres ? PgMultiPolygonEntity.class : MsMultiPolygonEntity.class,
MultiPolygon.class,
"MULTIPOLYGON(((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 0.0)))" );
}
private void testType( final boolean postgres,
final Class<?> entityType,
final Class<?> geomType,
final String value )
throws Exception
{
final EntityManager em = DatabaseTestUtil.createEntityManager( isPostgres(), "GeolatteEclipselinkTest" );
assertEntityClassPresent( em, entityType );
assertNull( em.find( entityType, 22 ) );
em.getTransaction().begin();
final String fromTextFunction = postgres ? "ST_GeometryFromText(?)" : "geometry::STGeomFromText(?,0)";
final String insertSQL =
"INSERT INTO " + entityType.getSimpleName() + "(id,geom) VALUES (22," + fromTextFunction + ")";
em.createNativeQuery( insertSQL ).setParameter( 1, value ).executeUpdate();
em.getTransaction().commit();
final Object entity = em.find( entityType, 22 );
final Object geom = entityType.getMethod( "getGeom" ).invoke( entity );
assertNotNull( entity );
em.remove( entity );
assertNull( em.find( entityType, 22 ) );
final Object e2 = entityType.newInstance();
entityType.getMethod( "setId", Integer.class ).invoke( e2, 23 );
entityType.getMethod( "setGeom", geomType ).invoke( e2, geom );
em.persist( e2 );
final Object e2FromDB = em.find( entityType, 23 );
assertNotNull( e2FromDB );
assertEquals( entityType.getMethod( "getGeom" ).invoke( entity ), geom );
em.remove( e2 );
em.close();
}
private void assertEntityClassPresent( final EntityManager em, final Class<?> entityClass )
{
assertNotNull( em.getMetamodel().managedType( entityClass ) );
}
}