Initial add

This commit is contained in:
Rob Bygrave
2016-10-21 02:37:13 +13:00
parent eff61ae5fc
commit e17283726a
20 changed files with 836 additions and 2 deletions
+22
View File
@@ -0,0 +1,22 @@
*.autofetch
*create-all.sql
*drop-all.sql
*.orig
.classpath
.project
.settings/
target/
logs/
log/
ebean-autotune.xml
ebean-profiling*.xml
/db
/mydb.db
!src/test/ddl-review/*.sql
# Intellij project files
*.iml
*.ipr
*.iws
.idea/
+2 -2
View File
@@ -1,2 +1,2 @@
# ebean-postgis
Ebean support for Postgres Geometry types - org.postgis and org.geolatte.geom
# ebean-com.avaje.ebean.postgis
Ebean support for Postgres Geometry types - org.com.avaje.ebean.postgis and org.geolatte.geom
+111
View File
@@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.avaje.ebean</groupId>
<artifactId>ebean-postgis</artifactId>
<version>1.1.1-SNAPSHOT</version>
<parent>
<groupId>org.avaje</groupId>
<artifactId>oss-parent</artifactId>
<version>1.1</version>
</parent>
<properties>
<postgis.jdbc.version>2.2.1</postgis.jdbc.version>
<java.version>1.8</java.version>
<ebeanorm-enhancement.plugin.args>debug=1</ebeanorm-enhancement.plugin.args>
</properties>
<dependencies>
<dependency>
<groupId>net.postgis</groupId>
<artifactId>postgis-jdbc</artifactId>
<version>[2.2.1]</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4.1211.jre7</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.geolatte</groupId>
<artifactId>geolatte-geom</artifactId>
<version>1.0.6</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.20</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.avaje.ebean</groupId>
<artifactId>ebean</artifactId>
<version>8.5.2-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
<scope>test</scope>
</dependency>
<!--<dependency>-->
<!--<groupId>ch.qos.logback</groupId>-->
<!--<artifactId>logback-classic</artifactId>-->
<!--<version>1.1.6</version>-->
<!--<scope>test</scope>-->
<!--</dependency>-->
<dependency>
<groupId>org.avaje.composite</groupId>
<artifactId>composite-testing</artifactId>
<version>3.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>io.repaint.maven</groupId>
<artifactId>tiles-maven-plugin</artifactId>
<version>2.8</version>
<extensions>true</extensions>
<configuration>
<tiles>
<tile>org.avaje.ebean.tile:enhancement:1.1</tile>
</tiles>
</configuration>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,32 @@
package com.avaje.ebean.postgis;
import com.avaje.ebean.config.ServerConfig;
import com.avaje.ebean.plugin.ExtraTypeFactory;
import com.avaje.ebean.postgis.latte.ScalarTypeGeoLatteMultiPolygon;
import com.avaje.ebean.postgis.latte.ScalarTypeGeoLattePoint;
import com.avaje.ebean.postgis.latte.ScalarTypeGeoLattePolygon;
import com.avaje.ebeaninternal.server.type.ScalarType;
import java.util.ArrayList;
import java.util.List;
public class RegisterFactory implements ExtraTypeFactory {
@Override
public List<ScalarType<?>> createTypes(ServerConfig serverConfig, Object objectMapper) {
List<ScalarType<?>> list = new ArrayList<ScalarType<?>>();
list.add(new ScalarTypePgisPoint());
list.add(new ScalarTypePgisPolygon());
list.add(new ScalarTypePgisMultiPolygon());
if (serverConfig.getClassLoadConfig().isPresent("org.geolatte.geom.Geometry")) {
list.add(new ScalarTypeGeoLattePoint());
list.add(new ScalarTypeGeoLattePolygon());
list.add(new ScalarTypeGeoLatteMultiPolygon());
}
return list;
}
}
@@ -0,0 +1,165 @@
package com.avaje.ebean.postgis;
import com.avaje.ebeaninternal.server.type.CtCompoundTypeScalarList;
import com.avaje.ebeaninternal.server.type.DataBind;
import com.avaje.ebeaninternal.server.type.DataReader;
import com.avaje.ebeaninternal.server.type.ScalarType;
import com.avaje.ebeanservice.docstore.api.mapping.DocPropertyType;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import org.postgis.Geometry;
import org.postgis.PGgeometryLW;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.sql.SQLException;
import java.sql.Types;
abstract class ScalarTypePgisBase<T extends Geometry> implements ScalarType<T> {
private final int jdbcType;
private final Class<T> cls;
ScalarTypePgisBase(int jdbcType, Class<T> cls) {
this.jdbcType = jdbcType;
this.cls = cls;
}
@Override
public void bind(DataBind bind, T value) throws SQLException {
if (value == null) {
bind.setNull(Types.NULL);
} else {
bind.setObject(new PGgeometryLW(value));
}
}
@Override
@SuppressWarnings("unchecked")
public T read(DataReader reader) throws SQLException {
Object object = reader.getObject();
if (object == null) {
return null;
}
PGgeometryLW gro = (PGgeometryLW)object;
Geometry pts = gro.getGeometry();
return (T)pts;
}
@Override
public boolean isJdbcNative() {
return true;
}
@Override
public int getJdbcType() {
return jdbcType;
}
@Override
public Class<T> getType() {
return cls;
}
@Override
public T readData(DataInput dataInput) throws IOException {
return null;
}
@Override
public void writeData(DataOutput dataOutput, T v) throws IOException {
}
@Override
public boolean isBinaryType() {
return false;
}
@Override
public boolean isMutable() {
return false;
}
@Override
public boolean isDirty(Object value) {
return false;
}
@Override
public int getLength() {
return 0;
}
@Override
public void loadIgnore(DataReader reader) {
}
@Override
public void accumulateScalarTypes(String propName, CtCompoundTypeScalarList list) {
}
@Override
public Object toJdbcType(Object value) {
return null;
}
@Override
public T toBeanType(Object value) {
return null;
}
@Override
public String formatValue(T value) {
return null;
}
@Override
public String format(Object value) {
return null;
}
@Override
public T parse(String value) {
return null;
}
@Override
public DocPropertyType getDocType() {
return null;
}
@Override
public boolean isDateTimeCapable() {
return false;
}
@Override
public long asVersion(T value) {
return 0;
}
@Override
public T convertFromMillis(long dateTime) {
return null;
}
@Override
public T jsonRead(JsonParser parser) throws IOException {
return null;
}
@Override
public void jsonWrite(JsonGenerator writer, T value) throws IOException {
}
}
@@ -0,0 +1,12 @@
package com.avaje.ebean.postgis;
import com.avaje.ebean.config.dbplatform.ExtraDbTypes;
import org.postgis.MultiPolygon;
public class ScalarTypePgisMultiPolygon extends ScalarTypePgisBase<MultiPolygon> {
public ScalarTypePgisMultiPolygon() {
super(ExtraDbTypes.POLYGON, MultiPolygon.class);
}
}
@@ -0,0 +1,12 @@
package com.avaje.ebean.postgis;
import com.avaje.ebean.config.dbplatform.ExtraDbTypes;
import org.postgis.Point;
public class ScalarTypePgisPoint extends ScalarTypePgisBase<Point> {
public ScalarTypePgisPoint() {
super(ExtraDbTypes.POINT, Point.class);
}
}
@@ -0,0 +1,11 @@
package com.avaje.ebean.postgis;
import com.avaje.ebean.config.dbplatform.ExtraDbTypes;
import org.postgis.Polygon;
public class ScalarTypePgisPolygon extends ScalarTypePgisBase<Polygon> {
public ScalarTypePgisPolygon() {
super(ExtraDbTypes.POLYGON, Polygon.class);
}
}
@@ -0,0 +1,168 @@
package com.avaje.ebean.postgis.latte;
import com.avaje.ebeaninternal.server.type.CtCompoundTypeScalarList;
import com.avaje.ebeaninternal.server.type.DataBind;
import com.avaje.ebeaninternal.server.type.DataReader;
import com.avaje.ebeaninternal.server.type.ScalarType;
import com.avaje.ebeanservice.docstore.api.mapping.DocPropertyType;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import org.geolatte.geom.Geometry;
import org.geolatte.geom.codec.Wkt;
import org.postgis.PGgeometry;
import org.postgis.PGgeometryLW;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.sql.SQLException;
import java.sql.Types;
abstract class ScalarTypeGeoLatteBase<T extends Geometry> implements ScalarType<T> {
private final int jdbcType;
private final Class<T> cls;
ScalarTypeGeoLatteBase(int jdbcType, Class<T> cls) {
this.jdbcType = jdbcType;
this.cls = cls;
}
@Override
public boolean isJdbcNative() {
return true;
}
@Override
public int getJdbcType() {
return jdbcType;
}
@Override
public Class<T> getType() {
return cls;
}
@Override
public void bind(DataBind bind, T value) throws SQLException {
if (value == null) {
bind.setNull(Types.OTHER);
} else {
String wkt = Wkt.newEncoder(Wkt.Dialect.POSTGIS_EWKT_1).encode(value);
bind.setObject(new PGgeometryLW(wkt));
}
}
@Override
@SuppressWarnings("unchecked")
public T read(DataReader reader) throws SQLException {
Object object = reader.getObject();
if (object == null) {
return null;
}
if (object instanceof PGgeometry) {
org.postgis.Geometry geometry = ((PGgeometry) object).getGeometry();
return (T) Wkt.newDecoder(Wkt.Dialect.POSTGIS_EWKT_1).decode(geometry.toString());
}
throw new IllegalStateException("Received object of type " + object.getClass().getCanonicalName());
}
@Override
public T readData(DataInput dataInput) throws IOException {
return null;
}
@Override
public void writeData(DataOutput dataOutput, T v) throws IOException {
}
@Override
public boolean isBinaryType() {
return false;
}
@Override
public boolean isMutable() {
return false;
}
@Override
public boolean isDirty(Object value) {
return false;
}
@Override
public int getLength() {
return 0;
}
@Override
public void loadIgnore(DataReader reader) {
}
@Override
public void accumulateScalarTypes(String propName, CtCompoundTypeScalarList list) {
}
@Override
public Object toJdbcType(Object value) {
return null;
}
@Override
public T toBeanType(Object value) {
return null;
}
@Override
public String formatValue(T value) {
return null;
}
@Override
public String format(Object value) {
return null;
}
@Override
public T parse(String value) {
return null;
}
@Override
public DocPropertyType getDocType() {
return null;
}
@Override
public boolean isDateTimeCapable() {
return false;
}
@Override
public long asVersion(T value) {
return 0;
}
@Override
public T convertFromMillis(long dateTime) {
return null;
}
@Override
public T jsonRead(JsonParser parser) throws IOException {
return null;
}
@Override
public void jsonWrite(JsonGenerator writer, T value) throws IOException {
}
}
@@ -0,0 +1,12 @@
package com.avaje.ebean.postgis.latte;
import com.avaje.ebean.config.dbplatform.ExtraDbTypes;
import org.geolatte.geom.MultiPolygon;
public class ScalarTypeGeoLatteMultiPolygon extends ScalarTypeGeoLatteBase<MultiPolygon> {
public ScalarTypeGeoLatteMultiPolygon() {
super(ExtraDbTypes.MULTIPOLYGON, MultiPolygon.class);
}
}
@@ -0,0 +1,11 @@
package com.avaje.ebean.postgis.latte;
import com.avaje.ebean.config.dbplatform.ExtraDbTypes;
import org.geolatte.geom.Point;
public class ScalarTypeGeoLattePoint extends ScalarTypeGeoLatteBase<Point> {
public ScalarTypeGeoLattePoint() {
super(ExtraDbTypes.POINT, Point.class);
}
}
@@ -0,0 +1,11 @@
package com.avaje.ebean.postgis.latte;
import com.avaje.ebean.config.dbplatform.ExtraDbTypes;
import org.geolatte.geom.Polygon;
public class ScalarTypeGeoLattePolygon extends ScalarTypeGeoLatteBase<Polygon> {
public ScalarTypeGeoLattePolygon() {
super(ExtraDbTypes.POLYGON, Polygon.class);
}
}
@@ -0,0 +1 @@
com.avaje.ebean.postgis.RegisterFactory
@@ -0,0 +1,20 @@
package org.example.domain;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
@MappedSuperclass
abstract class BaseEntity {
@Id
Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
@@ -0,0 +1,54 @@
package org.example.domain;
import org.postgis.MultiPolygon;
import org.postgis.Point;
import org.postgis.Polygon;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name="mybean")
public class MyBean extends BaseEntity {
String name;
Point point;
Polygon poly;
MultiPolygon mpoly;
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 MultiPolygon getMpoly() {
return mpoly;
}
public void setMpoly(MultiPolygon mpoly) {
this.mpoly = mpoly;
}
}
@@ -0,0 +1,54 @@
package org.example.domain;
import org.geolatte.geom.MultiPolygon;
import org.geolatte.geom.Point;
import org.geolatte.geom.Polygon;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name="mybean")
public class OtherBeanGeoLatte extends BaseEntity {
String name;
Point point;
Polygon poly;
MultiPolygon mpoly;
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 MultiPolygon getMpoly() {
return mpoly;
}
public void setMpoly(MultiPolygon mpoly) {
this.mpoly = mpoly;
}
}
@@ -0,0 +1,40 @@
package org.example.domain;
import com.avaje.ebean.Ebean;
import org.postgis.Point;
import org.postgis.Polygon;
import org.testng.annotations.Test;
import java.sql.SQLException;
import java.util.List;
public class TestInsertQuery {
@Test
public void insert() throws SQLException {
List<MyBean> list = Ebean.find(MyBean.class).findList();
for (MyBean MyBean : list) {
System.out.println(MyBean.getPoint());
}
List<MyBean> list1 = Ebean.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))");
MyBean p = new MyBean();
p.setName("me at "+System.currentTimeMillis());
p.setPoint(point);
p.setPoly(poly);
Ebean.save(p);
}
}
@@ -0,0 +1,41 @@
package org.example.domain;
import com.avaje.ebean.Ebean;
import org.geolatte.geom.Point;
import org.geolatte.geom.Polygon;
import org.geolatte.geom.codec.Wkt;
import org.testng.annotations.Test;
import java.sql.SQLException;
import java.util.List;
public class TestOtherInsertQuery {
@Test
public void insert() throws SQLException {
List<OtherBeanGeoLatte> list = Ebean.find(OtherBeanGeoLatte.class).findList();
for (OtherBeanGeoLatte OtherBeanGeoLatte : list) {
System.out.println(OtherBeanGeoLatte.getPoint());
}
List<OtherBeanGeoLatte> list1 = Ebean.find(OtherBeanGeoLatte.class)
.where()
.raw("st_within(st_pointfromwkb(st_point(?, ?), 4674), poly)", 1.9, 1.9)
.findList();
System.out.println(list1);
Point point = (Point) Wkt.fromWkt("SRID=4674;POINT (12 23)");
Polygon poly = (Polygon) Wkt.fromWkt("SRID=4674;POLYGON((2 2, 2 -2, -2 -2, -2 2, 2 2))");
OtherBeanGeoLatte p = new OtherBeanGeoLatte();
p.setName("geolatte at "+System.currentTimeMillis());
p.setPoint(point);
p.setPoly(poly);
Ebean.save(p);
}
}
+39
View File
@@ -0,0 +1,39 @@
<configuration scan="true" scanPeriod="3 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</encoder>
</appender>
<appender name="APPLICATION"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>log/application.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>log/application.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>90</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="APPLICATION" />
<appender-ref ref="STDOUT" />
</root>
<logger name="org.avaje" level="INFO" />
<logger name="com.avaje" level="INFO" />
<!-- Logging for SQL etc -->
<logger name="org.avaje.ebean.SQL" level="TRACE" />
<logger name="org.avaje.ebean.TXN" level="TRACE" />
<logger name="org.avaje.ebean.SUM" level="TRACE" />
<logger name="com.avaje.ebean.dbmigration.DdlRunner" level="INFO"/>
</configuration>
+18
View File
@@ -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=org.postgis.DriverWrapperLW