diff --git a/composites/ebean-net-postgis/pom.xml b/composites/ebean-net-postgis/pom.xml new file mode 100644 index 0000000000..80f0c48c0d --- /dev/null +++ b/composites/ebean-net-postgis/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + ebean-parent + io.ebean + 14.4.0 + ../.. + + + ebean-net-postgis + ebean-net-postgis composite + ebean-net-postgis + + + 2023.1.0 + 42.7.2 + + + + + + io.ebean + ebean-api + 14.4.0 + + + + io.ebean + ebean-core + 14.4.0 + + + + io.ebean + ebean-datasource + ${ebean-datasource.version} + + + + io.ebean + ebean-migration + ${ebean-migration.version} + + + + + io.ebean + ebean-querybean + 14.4.0 + + + + io.ebean + ebean-platform-postgres + 14.4.0 + + + + io.ebean + ebean-net-postgis-types + 14.4.0 + + + + org.postgresql + postgresql + ${postgres.jdbc.version} + + + + * + * + + + + + + net.postgis + postgis-jdbc + ${postgis.jdbc.version} + + + + diff --git a/composites/ebean-net-postgis/src/main/java/io/ebean/postgis/assembly/Assembly.java b/composites/ebean-net-postgis/src/main/java/io/ebean/postgis/assembly/Assembly.java new file mode 100644 index 0000000000..fea71cbb3d --- /dev/null +++ b/composites/ebean-net-postgis/src/main/java/io/ebean/postgis/assembly/Assembly.java @@ -0,0 +1,7 @@ +package io.ebean.postgis.assembly; + +/** + * Nothing interesting here - required placeholder for javadoc. + */ +public class Assembly { +} diff --git a/composites/ebean-net-postgis/src/main/java/module-info.java b/composites/ebean-net-postgis/src/main/java/module-info.java new file mode 100644 index 0000000000..63bf6fcb15 --- /dev/null +++ b/composites/ebean-net-postgis/src/main/java/module-info.java @@ -0,0 +1,10 @@ +module io.ebean.postgis { + + requires transitive io.ebean.api; + requires transitive io.ebean.core; + requires transitive io.ebean.datasource; + requires transitive io.ebean.querybean; + requires transitive io.ebean.platform.postgres; + // requires transitive io.ebean.postgis.types; + +} diff --git a/composites/pom.xml b/composites/pom.xml index dbc3de1a75..5afd41e421 100644 --- a/composites/pom.xml +++ b/composites/pom.xml @@ -24,6 +24,7 @@ ebean-oracle ebean-postgres ebean-postgis + ebean-net-postgis ebean-sqlite ebean-sqlserver diff --git a/ebean-api/src/main/java/module-info.java b/ebean-api/src/main/java/module-info.java index be58361b4b..06bc066d68 100644 --- a/ebean-api/src/main/java/module-info.java +++ b/ebean-api/src/main/java/module-info.java @@ -8,6 +8,7 @@ uses io.ebean.service.SpiRawSqlService; uses io.ebean.service.SpiProfileLocationFactory; uses io.ebean.service.SpiFetchGroupService; + uses io.ebean.service.SpiJsonService; requires transitive java.sql; requires transitive io.avaje.config; diff --git a/ebean-core/src/main/java/module-info.java b/ebean-core/src/main/java/module-info.java index d12bd34828..5560c21530 100644 --- a/ebean-core/src/main/java/module-info.java +++ b/ebean-core/src/main/java/module-info.java @@ -47,7 +47,7 @@ exports io.ebeanservice.docstore.api.support to io.ebean.elastic, io.ebean.test; exports io.ebeanservice.docstore.api.mapping to io.ebean.elastic; - exports io.ebeaninternal.api to io.ebean.ddl.generator, io.ebean.querybean, io.ebean.autotune, io.ebean.postgis, io.ebean.test, io.ebean.elastic, io.ebean.spring.txn; + exports io.ebeaninternal.api to io.ebean.ddl.generator, io.ebean.querybean, io.ebean.autotune, io.ebean.postgis, io.ebean.test, io.ebean.elastic, io.ebean.spring.txn, io.ebean.postgis.types; exports io.ebeaninternal.api.json to io.ebean.test; exports io.ebeaninternal.json to io.ebean.test; exports io.ebeaninternal.server.autotune to io.ebean.autotune; @@ -69,7 +69,7 @@ exports io.ebeaninternal.server.querydefn to io.ebean.autotune, io.ebean.querybean, io.ebean.test, io.ebean.elastic; exports io.ebeaninternal.server.rawsql to io.ebean.test; exports io.ebeaninternal.server.json to io.ebean.test, io.ebean.elastic; - exports io.ebeaninternal.server.type to io.ebean.postgis, io.ebean.test; + exports io.ebeaninternal.server.type to io.ebean.postgis, io.ebean.test, io.ebean.postgis.types; exports io.ebeaninternal.server.transaction to io.ebean.test, io.ebean.elastic, io.ebean.spring.txn, io.ebean.k8scache; exports io.ebeaninternal.server.util to io.ebean.querybean; diff --git a/ebean-ddl-generator/src/main/java/module-info.java b/ebean-ddl-generator/src/main/java/module-info.java index d3a8affe56..50a8c62311 100644 --- a/ebean-ddl-generator/src/main/java/module-info.java +++ b/ebean-ddl-generator/src/main/java/module-info.java @@ -15,4 +15,6 @@ // support existing tests exports io.ebeaninternal.extraddl.model to io.ebean.test; + + opens io.ebeaninternal.extraddl.model to jakarta.xml.bind; } diff --git a/ebean-net-postgis-types/.editorconfig b/ebean-net-postgis-types/.editorconfig new file mode 100644 index 0000000000..d67326c696 --- /dev/null +++ b/ebean-net-postgis-types/.editorconfig @@ -0,0 +1,17 @@ +# editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true +spaces_around_operators = true +max_line_length = 130 + +[pom.xml] +# Because of + + 4.0.0 + + ebean-parent + io.ebean + 14.4.0 + + + ebean net postgis types + ebean-net-postgis-types + + + 2023.1.0 + + + + + + io.ebean + ebean-platform-postgres + 14.4.0 + + + + + io.ebean + ebean-core + 14.4.0 + provided + + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + true + + + + net.postgis + postgis-jdbc + ${postgis.jdbc.version} + + + + + org.postgresql + postgresql + 42.7.2 + provided + + + + io.ebean + ebean-test + 14.4.0 + test + + + + org.avaje.composite + logback + 1.1 + test + + + + + + + + + + io.repaint.maven + tiles-maven-plugin + 2.40 + true + + + io.ebean.tile:enhancement:14.3.0 + + + + + + + + + diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisExtraTypeFactory.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisExtraTypeFactory.java new file mode 100644 index 0000000000..72a731c76a --- /dev/null +++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisExtraTypeFactory.java @@ -0,0 +1,23 @@ +package io.ebean.postgis; + +import io.ebean.DatabaseBuilder; +import io.ebean.core.type.ExtraTypeFactory; +import io.ebean.core.type.ScalarType; + +import java.util.Arrays; +import java.util.List; + +public class PostgisExtraTypeFactory implements ExtraTypeFactory { + + @Override + public List> createTypes(DatabaseBuilder.Settings config, Object objectMapper) { + return Arrays.asList( + new ScalarTypePgisPoint(), + new ScalarTypePgisPolygon(), + new ScalarTypePgisLineString(), + new ScalarTypePgisMultiPolygon(), + new ScalarTypePgisMultiPoint(), + new ScalarTypePgisMultiLineString() + ); + } +} diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisGeoTypeBindProvider.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisGeoTypeBindProvider.java new file mode 100644 index 0000000000..be7fdc273f --- /dev/null +++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisGeoTypeBindProvider.java @@ -0,0 +1,13 @@ +package io.ebean.postgis; + +import io.ebean.DatabaseBuilder; +import io.ebeaninternal.api.GeoTypeProvider; +import io.ebeaninternal.server.type.GeoTypeBinder; + +public class PostgisGeoTypeBindProvider implements GeoTypeProvider { + + @Override + public GeoTypeBinder createBinder(DatabaseBuilder.Settings config) { + return new PostgisGeoTypeBinder(); + } +} diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisGeoTypeBinder.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisGeoTypeBinder.java new file mode 100644 index 0000000000..f24ee37d38 --- /dev/null +++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisGeoTypeBinder.java @@ -0,0 +1,21 @@ +package io.ebean.postgis; + +import io.ebean.core.type.DataBinder; +import io.ebeaninternal.server.type.GeoTypeBinder; +import net.postgis.jdbc.PGgeometryLW; +import net.postgis.jdbc.geometry.Geometry; + +import java.sql.SQLException; + +class PostgisGeoTypeBinder implements GeoTypeBinder { + + PostgisGeoTypeBinder() { + } + + @Override + public void bind(DataBinder binder, int dataType, Object data) throws SQLException { + if (data instanceof Geometry) { + binder.setObject(new PGgeometryLW((Geometry) data)); + } + } +} diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisBase.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisBase.java new file mode 100644 index 0000000000..8ed62a3874 --- /dev/null +++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisBase.java @@ -0,0 +1,118 @@ +package io.ebean.postgis; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import io.ebean.core.type.DataBinder; +import io.ebean.core.type.DataReader; +import io.ebean.core.type.DocPropertyType; +import io.ebean.core.type.ScalarType; +import net.postgis.jdbc.PGgeometry; +import net.postgis.jdbc.PGgeometryLW; +import net.postgis.jdbc.geometry.Geometry; +import net.postgis.jdbc.geometry.GeometryBuilder; +import net.postgis.jdbc.geometry.binary.BinaryParser; +import org.postgresql.util.PGobject; + +import java.io.DataInput; +import java.io.DataOutput; +import java.sql.SQLException; +import java.sql.Types; + +abstract class ScalarTypePgisBase implements ScalarType { + + private final int jdbcType; + + private final Class cls; + + ScalarTypePgisBase(int jdbcType, Class cls) { + this.jdbcType = jdbcType; + this.cls = cls; + } + + @Override + public void bind(DataBinder binder, T value) throws SQLException { + if (value == null) { + binder.setNull(Types.NULL); + } else { + binder.setObject(new PGgeometryLW(value)); + } + } + + + @Override + @SuppressWarnings("unchecked") + public T read(DataReader reader) throws SQLException { + Object object = reader.getObject(); + if (object == null) { + return null; + } + if (object instanceof PGgeometryLW) { + return (T) ((PGgeometryLW) object).getGeometry(); + + } else if (object instanceof PGgeometry) { + return (T) ((PGgeometry) object).getGeometry(); + + } else if (object instanceof PGobject) { + return (T) GeometryBuilder.geomFromString(((PGobject) object).getValue(), new BinaryParser(), false); + + } else { + throw new IllegalStateException("Could not convert from " + object.getClass() + " to " + cls); + } + } + + + @Override + public boolean jdbcNative() { + return true; + } + + @Override + public int jdbcType() { + return jdbcType; + } + + @Override + public Class type() { + return cls; + } + + @Override + public T readData(DataInput dataInput) { + return null; + } + + @Override + public void writeData(DataOutput dataOutput, T v) { + + } + + @Override + public Object toJdbcType(Object value) { + return null; + } + + @Override + public T toBeanType(Object value) { + return null; + } + + @Override + public String formatValue(T value) { + return value.toString(); + } + + @Override + public DocPropertyType docType() { + return null; + } + + @Override + public T jsonRead(JsonParser parser) { + return null; + } + + @Override + public void jsonWrite(JsonGenerator writer, T value) { + + } +} diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisLineString.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisLineString.java new file mode 100644 index 0000000000..4fa4ff2f76 --- /dev/null +++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisLineString.java @@ -0,0 +1,22 @@ +package io.ebean.postgis; + +import io.ebean.config.dbplatform.ExtraDbTypes; +import net.postgis.jdbc.geometry.LineString; + +import java.sql.SQLException; + +public class ScalarTypePgisLineString extends ScalarTypePgisBase { + + public ScalarTypePgisLineString() { + super(ExtraDbTypes.LINESTRING, LineString.class); + } + + @Override + public LineString parse(String value) { + try { + return new LineString(value); + } catch (SQLException e) { + throw new IllegalStateException(e); + } + } +} diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiLineString.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiLineString.java new file mode 100644 index 0000000000..777c6583e7 --- /dev/null +++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiLineString.java @@ -0,0 +1,22 @@ +package io.ebean.postgis; + +import io.ebean.config.dbplatform.ExtraDbTypes; +import net.postgis.jdbc.geometry.MultiLineString; + +import java.sql.SQLException; + +public class ScalarTypePgisMultiLineString extends ScalarTypePgisBase { + + public ScalarTypePgisMultiLineString() { + super(ExtraDbTypes.MULTILINESTRING, MultiLineString.class); + } + + @Override + public MultiLineString parse(String value) { + try { + return new MultiLineString(value); + } catch (SQLException e) { + throw new IllegalStateException(e); + } + } +} diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiPoint.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiPoint.java new file mode 100644 index 0000000000..44b6a461b8 --- /dev/null +++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiPoint.java @@ -0,0 +1,22 @@ +package io.ebean.postgis; + +import io.ebean.config.dbplatform.ExtraDbTypes; +import net.postgis.jdbc.geometry.MultiPoint; + +import java.sql.SQLException; + +public class ScalarTypePgisMultiPoint extends ScalarTypePgisBase { + + public ScalarTypePgisMultiPoint() { + super(ExtraDbTypes.MULTIPOINT, MultiPoint.class); + } + + @Override + public MultiPoint parse(String value) { + try { + return new MultiPoint(value); + } catch (SQLException e) { + throw new IllegalStateException(e); + } + } +} diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiPolygon.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiPolygon.java new file mode 100644 index 0000000000..26b9f3970d --- /dev/null +++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiPolygon.java @@ -0,0 +1,22 @@ +package io.ebean.postgis; + +import io.ebean.config.dbplatform.ExtraDbTypes; +import net.postgis.jdbc.geometry.MultiPolygon; + +import java.sql.SQLException; + +public class ScalarTypePgisMultiPolygon extends ScalarTypePgisBase { + + public ScalarTypePgisMultiPolygon() { + super(ExtraDbTypes.MULTIPOLYGON, MultiPolygon.class); + } + + @Override + public MultiPolygon parse(String value) { + try { + return new MultiPolygon(value); + } catch (SQLException e) { + throw new IllegalStateException(e); + } + } +} diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisPoint.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisPoint.java new file mode 100644 index 0000000000..3f9e81b701 --- /dev/null +++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisPoint.java @@ -0,0 +1,22 @@ +package io.ebean.postgis; + +import io.ebean.config.dbplatform.ExtraDbTypes; +import net.postgis.jdbc.geometry.Point; + +import java.sql.SQLException; + +public class ScalarTypePgisPoint extends ScalarTypePgisBase { + + public ScalarTypePgisPoint() { + super(ExtraDbTypes.POINT, Point.class); + } + + @Override + public Point parse(String value) { + try { + return new Point(value); + } catch (SQLException e) { + throw new IllegalStateException(e); + } + } +} diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisPolygon.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisPolygon.java new file mode 100644 index 0000000000..6727e7c0ed --- /dev/null +++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisPolygon.java @@ -0,0 +1,22 @@ +package io.ebean.postgis; + +import io.ebean.config.dbplatform.ExtraDbTypes; +import net.postgis.jdbc.geometry.Polygon; + +import java.sql.SQLException; + +public class ScalarTypePgisPolygon extends ScalarTypePgisBase { + + public ScalarTypePgisPolygon() { + super(ExtraDbTypes.POLYGON, Polygon.class); + } + + @Override + public Polygon parse(String value) { + try { + return new Polygon(value); + } catch (SQLException e) { + throw new IllegalStateException(e); + } + } +} diff --git a/ebean-net-postgis-types/src/main/java/module-info.java b/ebean-net-postgis-types/src/main/java/module-info.java new file mode 100644 index 0000000000..9c32cec543 --- /dev/null +++ b/ebean-net-postgis-types/src/main/java/module-info.java @@ -0,0 +1,17 @@ +import io.ebean.core.type.ExtraTypeFactory; +import io.ebeaninternal.api.GeoTypeProvider; + +/** + * Provides GeoTypeProvider and ExtraTypeFactory. + */ +module io.ebean.postgis.types { + + provides ExtraTypeFactory with io.ebean.postgis.PostgisExtraTypeFactory; + provides GeoTypeProvider with io.ebean.postgis.PostgisGeoTypeBindProvider; + + requires io.ebean.core; + requires org.postgresql.jdbc; + requires net.postgis.jdbc; + requires net.postgis.jdbc.geometry; + requires com.fasterxml.jackson.core; +} diff --git a/ebean-net-postgis-types/src/main/resources/META-INF/services/io.ebean.core.type.ExtraTypeFactory b/ebean-net-postgis-types/src/main/resources/META-INF/services/io.ebean.core.type.ExtraTypeFactory new file mode 100644 index 0000000000..54cd37d748 --- /dev/null +++ b/ebean-net-postgis-types/src/main/resources/META-INF/services/io.ebean.core.type.ExtraTypeFactory @@ -0,0 +1 @@ +io.ebean.postgis.PostgisExtraTypeFactory diff --git a/ebean-net-postgis-types/src/main/resources/META-INF/services/io.ebeaninternal.api.GeoTypeProvider b/ebean-net-postgis-types/src/main/resources/META-INF/services/io.ebeaninternal.api.GeoTypeProvider new file mode 100644 index 0000000000..c69d76d20d --- /dev/null +++ b/ebean-net-postgis-types/src/main/resources/META-INF/services/io.ebeaninternal.api.GeoTypeProvider @@ -0,0 +1 @@ +io.ebean.postgis.PostgisGeoTypeBindProvider \ No newline at end of file diff --git a/ebean-net-postgis-types/src/test/java/org/example/domain/BaseEntity.java b/ebean-net-postgis-types/src/test/java/org/example/domain/BaseEntity.java new file mode 100644 index 0000000000..6dc59d1e20 --- /dev/null +++ b/ebean-net-postgis-types/src/test/java/org/example/domain/BaseEntity.java @@ -0,0 +1,20 @@ +package org.example.domain; + +import jakarta.persistence.Id; +import jakarta.persistence.MappedSuperclass; + +@MappedSuperclass +abstract class BaseEntity { + + @Id + Long id; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + +} diff --git a/ebean-net-postgis-types/src/test/java/org/example/domain/CachedBean.java b/ebean-net-postgis-types/src/test/java/org/example/domain/CachedBean.java new file mode 100644 index 0000000000..9967a7ec53 --- /dev/null +++ b/ebean-net-postgis-types/src/test/java/org/example/domain/CachedBean.java @@ -0,0 +1,43 @@ +package org.example.domain; + +import io.ebean.annotation.Cache; + +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import net.postgis.jdbc.geometry.Point; +import net.postgis.jdbc.geometry.Polygon; + +@Entity +@Table(name="mybean_cached") +@Cache +public class CachedBean extends BaseEntity { + String name; + + Point point; + + Polygon polygon; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Point getPoint() { + return point; + } + + public void setPoint(Point point) { + this.point = point; + } + + public Polygon getPolygon() { + return polygon; + } + + public void setPolygon(Polygon polygon) { + this.polygon = polygon; + } +} diff --git a/ebean-net-postgis-types/src/test/java/org/example/domain/MyBean.java b/ebean-net-postgis-types/src/test/java/org/example/domain/MyBean.java new file mode 100644 index 0000000000..d314bc69d3 --- /dev/null +++ b/ebean-net-postgis-types/src/test/java/org/example/domain/MyBean.java @@ -0,0 +1,92 @@ +package org.example.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import net.postgis.jdbc.geometry.*; + +@Entity +@Table(name="mybean") +public class MyBean extends BaseEntity { + + String name; + + Point point; + + Polygon poly; + + LineString lineString; + + MultiLineString multiLineString; + + MultiPoint multiPoint; + + MultiPolygon mpoly; + + @Column(columnDefinition = "geometry(Point, 4326)", unique = true) + Point wgs84Point; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Point getPoint() { + return point; + } + + public void setPoint(Point point) { + this.point = point; + } + + public Polygon getPoly() { + return poly; + } + + public void setPoly(Polygon poly) { + this.poly = poly; + } + + public LineString getLineString() { + return lineString; + } + + public void setLineString(LineString lineString) { + this.lineString = lineString; + } + + public MultiLineString getMultiLineString() { + return multiLineString; + } + + public void setMultiLineString(MultiLineString multiLineString) { + this.multiLineString = multiLineString; + } + + public MultiPoint getMultiPoint() { + return multiPoint; + } + + public void setMultiPoint(MultiPoint multiPoint) { + this.multiPoint = multiPoint; + } + + public MultiPolygon getMpoly() { + return mpoly; + } + + public void setMpoly(MultiPolygon mpoly) { + this.mpoly = mpoly; + } + + public Point getWgs84Point() { + return wgs84Point; + } + + public void setWgs84Point(final Point wgs84Point) { + this.wgs84Point = wgs84Point; + } +} diff --git a/ebean-net-postgis-types/src/test/java/org/example/domain/TestCacheSerialization.java b/ebean-net-postgis-types/src/test/java/org/example/domain/TestCacheSerialization.java new file mode 100644 index 0000000000..4c71a174c3 --- /dev/null +++ b/ebean-net-postgis-types/src/test/java/org/example/domain/TestCacheSerialization.java @@ -0,0 +1,84 @@ +package org.example.domain; + +import io.ebean.DB; +import net.postgis.jdbc.geometry.Point; +import net.postgis.jdbc.geometry.Polygon; +import org.junit.jupiter.api.Test; + +import java.sql.SQLException; + +import static org.junit.jupiter.api.Assertions.*; + +public class TestCacheSerialization { + @Test + public void testCache() throws SQLException { + Point p1=new Point(1.0, 2.0); + p1.setSrid(4674); + + Polygon pol=new Polygon("SRID=4674;POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 1 2, 2 2, 2 1, 1 1))"); + + CachedBean tb=new CachedBean(); + tb.setId(2080L); + tb.setName("Serialize Test"); + tb.setPoint(p1); + tb.setPolygon(pol); + + DB.insert(tb); + + CachedBean r1=DB.find(CachedBean.class, tb.getId()); + assertNotNull(r1); + assertEquals(p1, r1.getPoint()); + assertEquals(pol, r1.getPolygon()); + + CachedBean r2=DB.find(CachedBean.class, tb.getId()); // this is returned from cache + assertNotNull(r2); + assertEquals(p1, r2.getPoint()); // and did fail https://github.com/ebean-orm/ebean/issues/3026 + assertEquals(pol, r2.getPolygon()); + + DB.delete(tb); + + } + + @Test + public void testNullCache() throws SQLException { + Point p1=new Point(1.0, 2.0); + p1.setSrid(4674); + Polygon pol=new Polygon("SRID=4674;POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 1 2, 2 2, 2 1, 1 1))"); + + CachedBean tb=new CachedBean(); + tb.setId(2081L); + tb.setName("Serialize Test"); + tb.setPoint(p1); + tb.setPolygon(null); + + DB.insert(tb); + + CachedBean r1=DB.find(CachedBean.class, tb.getId()); + assertNotNull(r1); + assertEquals(p1, r1.getPoint()); + assertNull(r1.getPolygon()); + + CachedBean r2=DB.find(CachedBean.class, tb.getId()); // this is returned from cache + assertNotNull(r2); + assertEquals(p1, r2.getPoint()); // and did fail https://github.com/ebean-orm/ebean/issues/3026 + assertNull(r1.getPolygon()); + + tb.setPoint(null); + tb.setPolygon(pol); + + DB.save(tb); + + r1=DB.find(CachedBean.class, tb.getId()); + assertNotNull(r1); + assertEquals(pol, r1.getPolygon()); + assertNull(r1.getPoint()); + + r2=DB.find(CachedBean.class, tb.getId()); // this is returned from cache + assertNotNull(r2); + assertEquals(pol, r2.getPolygon()); // and did fail https://github.com/ebean-orm/ebean/issues/3026 + assertNull(r1.getPoint()); + + DB.delete(tb); + + } +} diff --git a/ebean-net-postgis-types/src/test/java/org/example/domain/TestInsertQuery.java b/ebean-net-postgis-types/src/test/java/org/example/domain/TestInsertQuery.java new file mode 100644 index 0000000000..0b33867b57 --- /dev/null +++ b/ebean-net-postgis-types/src/test/java/org/example/domain/TestInsertQuery.java @@ -0,0 +1,57 @@ +package org.example.domain; + +import io.ebean.DB; +import net.postgis.jdbc.geometry.*; +import org.junit.jupiter.api.Test; + +import java.sql.SQLException; +import java.util.List; + +public class TestInsertQuery { + + /** + * Not automated this test yet. + */ + @Test + public void insert() throws SQLException { + + + List list = DB.find(MyBean.class).findList(); + for (MyBean MyBean : list) { + System.out.println(MyBean.getPoint()); + } + + List list1 = DB.find(MyBean.class) + .where() + .raw("st_within(st_pointfromwkb(st_point(?, ?), 4674), poly)", 1.9, 1.9) + .findList(); + + System.out.println(list1); + + + Point point = new Point("SRID=4674;POINT(2.8 1.7)"); + Polygon poly = new Polygon("SRID=4674;POLYGON((2 2, 2 -2, -2 -2, -2 2, 2 2))"); + LineString lineString = new LineString("SRID=4674;LINESTRING(0 0, 1 2)"); + MultiLineString multiLineString = new MultiLineString("SRID=4674;MULTILINESTRING((0 0, 1 2), (1 2, 3 -1))"); + MultiPoint multiPoint = new MultiPoint("SRID=4674;MULTIPOINT((2 3), (7 8))"); + MultiPolygon mpoly = new MultiPolygon("SRID=4674;MULTIPOLYGON(((1 1, 1 -1, -1 -1, -1 1, 1 1)),((1 1, 3 1, 3 3, 1 3, 1 1)))"); + + MyBean p = new MyBean(); + p.setName("me at "+System.currentTimeMillis()); + p.setPoint(point); + p.setPoly(poly); + p.setLineString(lineString); + p.setMultiLineString(multiLineString); + p.setMultiPoint(multiPoint); + p.setMpoly(mpoly); + + DB.save(p); + + List content = + DB.find(MyBean.class) + .select("ST_AsText(lineString)::String") + .findSingleAttributeList(); + + System.out.println(content); + } +} diff --git a/ebean-net-postgis-types/src/test/resources/application-test.yml b/ebean-net-postgis-types/src/test/resources/application-test.yml new file mode 100644 index 0000000000..8b04a51bff --- /dev/null +++ b/ebean-net-postgis-types/src/test/resources/application-test.yml @@ -0,0 +1,18 @@ +ebean: + dbSchema: mygisapp + geometrySRID: 4674 + + test: +# useDocker: false +# shutdown: stop # stop | remove + platform: netpostgis + ddlMode: dropCreate # none | dropCreate | create | migration | createOnly | migrationDropCreate + dbName: mygisapp + + postgis: + containerName: ebeanbuild_postgis + port: 9432 + image: ghcr.io/baosystems/postgis:15 +# extensions: postgis +# url: jdbc:postgresql_lwgis://localhost:6432/mygisapp +# driver: org.postgis.DriverWrapperLW diff --git a/ebean-net-postgis-types/src/test/resources/logback-test.xml b/ebean-net-postgis-types/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..11ba301e03 --- /dev/null +++ b/ebean-net-postgis-types/src/test/resources/logback-test.xml @@ -0,0 +1,23 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + + + + + diff --git a/ebean-net-postgis-types/src/test/resources/notused-test-ebean.properties b/ebean-net-postgis-types/src/test/resources/notused-test-ebean.properties new file mode 100644 index 0000000000..2319590018 --- /dev/null +++ b/ebean-net-postgis-types/src/test/resources/notused-test-ebean.properties @@ -0,0 +1,18 @@ + +## when running tests + +ebean.ddl.generate=true +#ebean.ddl.run=true +#ebean.ddl.createOnly=true + +ebean.geometrySRID=4674 + +datasource.default=db + +datasource.db.username=pgis +datasource.db.password=pgis +datasource.db.databaseUrl=jdbc:postgresql_lwgis://127.0.0.1:5432/pgis +datasource.db.databaseDriver=net.postgis.jdbc.DriverWrapperLW + + + diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/NetPostgisSetup.java b/ebean-test/src/main/java/io/ebean/test/config/platform/NetPostgisSetup.java new file mode 100644 index 0000000000..6b7437413d --- /dev/null +++ b/ebean-test/src/main/java/io/ebean/test/config/platform/NetPostgisSetup.java @@ -0,0 +1,56 @@ +package io.ebean.test.config.platform; + +import java.util.Properties; + +/** + * A variation of Postgres that expected Postgis extension support. + * + * Uses postgis/postgis image by default. + */ +class NetPostgisSetup implements PlatformSetup { + + @Override + public Properties setup(Config config) { + int defaultPort = config.isUseDocker() ? 7432 : 5432; + config.setDockerPlatform("postgis"); + config.ddlMode("dropCreate"); + config.setDefaultPort(defaultPort); + config.setUsernameDefault(); + config.setPasswordDefault(); + config.setDriver("net.postgis.jdbc.DriverWrapperLW"); + config.setUrl("jdbc:postgresql_lwgis://${host}:${port}/${databaseName}"); + + String schema = config.getSchema(); + if (schema != null && !schema.equals(config.getUsername())) { + config.urlAppend("?currentSchema=" + schema); + } + config.datasourceDefaults(); + return dockerProperties(config); + } + + private Properties dockerProperties(Config config) { + if (!config.isUseDocker()) { + return new Properties(); + } + config.setExtensions("hstore,pgcrypto,postgis"); + config.setDockerContainerName("ut_postgis"); + config.setDockerVersion("14-3.2"); + return config.getDockerProperties(); + } + + @Override + public void setupExtraDbDataSource(Config config) { + int defaultPort = config.isUseDocker() ? 7432 : 5432; + config.setDefaultPort(defaultPort); + config.setExtraUsernameDefault(); + config.setExtraDbPasswordDefault(); + config.setExtraUrl("jdbc:postgresql_lwgis://${host}:${port}/${databaseName}"); + config.extraDatasourceDefaults(); + } + + @Override + public boolean isLocal() { + return false; + } + +} diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/PlatformAutoConfig.java b/ebean-test/src/main/java/io/ebean/test/config/platform/PlatformAutoConfig.java index 8ef841025b..e3afc43c4e 100644 --- a/ebean-test/src/main/java/io/ebean/test/config/platform/PlatformAutoConfig.java +++ b/ebean-test/src/main/java/io/ebean/test/config/platform/PlatformAutoConfig.java @@ -26,6 +26,7 @@ public class PlatformAutoConfig { KNOWN_PLATFORMS.put("sqlite", new SqliteSetup()); KNOWN_PLATFORMS.put("postgres", new PostgresSetup()); KNOWN_PLATFORMS.put("postgis", new PostgisSetup()); + KNOWN_PLATFORMS.put("netpostgis", new NetPostgisSetup()); KNOWN_PLATFORMS.put("nuodb", new NuoDBSetup()); KNOWN_PLATFORMS.put("mysql", new MySqlSetup()); KNOWN_PLATFORMS.put("mariadb", new MariaDBSetup()); diff --git a/pom.xml b/pom.xml index 00f0c4e7d5..dd2bc01b24 100644 --- a/pom.xml +++ b/pom.xml @@ -94,6 +94,7 @@ kotlin-querybean-generator ebean-querybean ebean-postgis-types + ebean-net-postgis-types ebean-redis platforms composites