diff --git a/deegree-core/deegree-connectionprovider-datasource/src/main/resources/META-INF/schemas/connectionprovider/datasource/example_dbcp_gpkg.xml b/deegree-core/deegree-connectionprovider-datasource/src/main/resources/META-INF/schemas/connectionprovider/datasource/example_dbcp_gpkg.xml
new file mode 100644
index 00000000000..bb7dfffb3e7
--- /dev/null
+++ b/deegree-core/deegree-connectionprovider-datasource/src/main/resources/META-INF/schemas/connectionprovider/datasource/example_dbcp_gpkg.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
diff --git a/deegree-core/deegree-core-db/pom.xml b/deegree-core/deegree-core-db/pom.xml
index 185732f3cf7..19036830eac 100644
--- a/deegree-core/deegree-core-db/pom.xml
+++ b/deegree-core/deegree-core-db/pom.xml
@@ -39,6 +39,10 @@
junit
junit
+
+ org.xerial
+ sqlite-jdbc
+
diff --git a/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/pom.xml b/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/pom.xml
new file mode 100644
index 00000000000..16479abc52f
--- /dev/null
+++ b/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/pom.xml
@@ -0,0 +1,34 @@
+
+ 4.0.0
+ deegree-sqldialect-gpkg
+ deegree-sqldialect-gpkg
+ jar
+ SQL dialect for GeoPackage
+
+
+ rework
+
+
+
+ org.deegree
+ deegree-core-sqldialect
+ 3.5.0-SNAPSHOT
+
+
+
+
+ org.deegree
+ deegree-sqldialect-commons
+ ${project.version}
+
+
+ org.deegree
+ deegree-core-db
+ ${project.version}
+
+
+ org.xerial
+ sqlite-jdbc
+
+
+
diff --git a/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/src/main/java/org/deegree/sqldialect/gpkg/GpkgDialect.java b/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/src/main/java/org/deegree/sqldialect/gpkg/GpkgDialect.java
new file mode 100644
index 00000000000..ed4a3f62307
--- /dev/null
+++ b/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/src/main/java/org/deegree/sqldialect/gpkg/GpkgDialect.java
@@ -0,0 +1,186 @@
+/*----------------------------------------------------------------------------
+ This file is part of deegree, http://deegree.org/
+ Copyright (C) 2001-2010 by:
+ - Department of Geography, University of Bonn -
+ and
+ - lat/lon GmbH -
+
+ 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
+
+ Contact information:
+
+ lat/lon GmbH
+ Aennchenstr. 19, 53177 Bonn
+ Germany
+ http://lat-lon.de/
+
+ Department of Geography, University of Bonn
+ Prof. Dr. Klaus Greve
+ Postfach 1147, 53001 Bonn
+ Germany
+ http://www.geographie.uni-bonn.de/deegree/
+
+ e-mail: info@deegree.org
+ ----------------------------------------------------------------------------*/
+package org.deegree.sqldialect.gpkg;
+
+import org.deegree.commons.jdbc.SQLIdentifier;
+import org.deegree.commons.jdbc.TableName;
+import org.deegree.commons.tom.primitive.PrimitiveType;
+import org.deegree.commons.tom.sql.DefaultPrimitiveConverter;
+import org.deegree.commons.tom.sql.PrimitiveParticleConverter;
+import org.deegree.cs.coordinatesystems.ICRS;
+import org.deegree.filter.FilterEvaluationException;
+import org.deegree.filter.OperatorFilter;
+import org.deegree.filter.sort.SortProperty;
+import org.deegree.geometry.Envelope;
+import org.deegree.geometry.utils.GeometryParticleConverter;
+import org.deegree.sqldialect.SQLDialect;
+import org.deegree.sqldialect.SortCriterion;
+import org.deegree.sqldialect.filter.AbstractWhereBuilder;
+import org.deegree.sqldialect.filter.PropertyNameMapper;
+import org.deegree.sqldialect.filter.UnmappableException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+
+/**
+ * {@link SQLDialect} for GeoPackage databases.
+ *
+ * @author Diego Migliavacca
+ * @since 3.5
+ */
+public class GpkgDialect implements SQLDialect {
+
+ private static Logger LOG = LoggerFactory.getLogger(GpkgDialect.class);
+
+ private char defaultEscapeChar = Character.UNASSIGNED;
+
+ @Override
+ public int getMaxColumnNameLength() {
+ return 2000;
+ }
+
+ @Override
+ public int getMaxTableNameLength() {
+ return 2000;
+ }
+
+ public String getDefaultSchema() {
+ return "main";
+ }
+
+ public String stringPlus() {
+ return "||";
+ }
+
+ public String stringIndex(String pattern, String string) {
+ return "INSTR(" + string + "," + pattern + ")";
+ }
+
+ public String cast(String expr, String type) {
+ return "CAST(" + expr + " AS " + type + ")";
+ }
+
+ @Override
+ public String geometryMetadata(TableName qTable, String column, boolean isGeographical) {
+ return null;
+ }
+
+ @Override
+ public AbstractWhereBuilder getWhereBuilder(PropertyNameMapper mapper, OperatorFilter filter,
+ SortProperty[] sortCrit, List defaultSortCriteria, boolean allowPartialMappings)
+ throws UnmappableException, FilterEvaluationException {
+ return new GpkgWhereBuilder(this, mapper, filter, sortCrit, defaultSortCriteria, allowPartialMappings);
+ }
+
+ @Override
+ public String getUndefinedSrid() {
+ return "-1";
+ }
+
+ @Override
+ public String getBBoxAggregateSnippet(String column) {
+ return null;
+ }
+
+ @Override
+ public Envelope getBBoxAggregateValue(ResultSet rs, int colIdx, ICRS crs) throws SQLException {
+ return null;
+ }
+
+ @Override
+ public GeometryParticleConverter getGeometryConverter(String column, ICRS crs, String srid, boolean is2D) {
+ return new GpkgGeometryConverter(column, crs, srid);
+ }
+
+ @Override
+ public PrimitiveParticleConverter getPrimitiveConverter(String column, PrimitiveType pt) {
+ return new DefaultPrimitiveConverter(pt, column);
+ }
+
+ @Override
+ public void createDB(Connection adminConn, String dbName) throws SQLException {
+ }
+
+ @Override
+ public void dropDB(Connection adminConn, String dbName) throws SQLException {
+ }
+
+ @Override
+ public void createAutoColumn(StringBuffer currentStmt, List additionalSmts, SQLIdentifier column,
+ SQLIdentifier table) {
+ currentStmt.append(column);
+ }
+
+ @Override
+ public ResultSet getTableColumnMetadata(DatabaseMetaData md, TableName qTable) throws SQLException {
+ String schema = qTable.getSchema() != null ? qTable.getSchema() : getDefaultSchema();
+ String table = qTable.getTable();
+ return md.getColumns(null, schema.toLowerCase(), table.toLowerCase(), null);
+ }
+
+ @Override
+ public boolean requiresTransactionForCursorMode() {
+ return false;
+ }
+
+ @Override
+ public String getSelectSequenceNextVal(String sequence) {
+ return null;
+ }
+
+ @Override
+ public boolean isRowLimitingCapable() {
+ // TODO Auto-generated method stub
+ return true;
+ }
+
+ @Override
+ public char getTailingEscapeChar() {
+ // TODO Auto-generated method stub
+ return defaultEscapeChar;
+ }
+
+ @Override
+ public char getLeadingEscapeChar() {
+ // TODO Auto-generated method stub
+ return defaultEscapeChar;
+ }
+
+}
diff --git a/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/src/main/java/org/deegree/sqldialect/gpkg/GpkgDialectProvider.java b/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/src/main/java/org/deegree/sqldialect/gpkg/GpkgDialectProvider.java
new file mode 100644
index 00000000000..8f8d7ee5955
--- /dev/null
+++ b/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/src/main/java/org/deegree/sqldialect/gpkg/GpkgDialectProvider.java
@@ -0,0 +1,73 @@
+/*----------------------------------------------------------------------------
+ This file is part of deegree, http://deegree.org/
+ Copyright (C) 2001-2012 by:
+ - Department of Geography, University of Bonn -
+ and
+ - lat/lon GmbH -
+
+ 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
+
+ Contact information:
+
+ lat/lon GmbH
+ Aennchenstr. 19, 53177 Bonn
+ Germany
+ http://lat-lon.de/
+
+ Department of Geography, University of Bonn
+ Prof. Dr. Klaus Greve
+ Postfach 1147, 53001 Bonn
+ Germany
+ http://www.geographie.uni-bonn.de/deegree/
+
+ e-mail: info@deegree.org
+ ----------------------------------------------------------------------------*/
+package org.deegree.sqldialect.gpkg;
+
+import java.sql.Connection;
+
+import org.deegree.sqldialect.SQLDialect;
+import org.deegree.db.dialect.SqlDialectProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link SqlDialectProvider} for GeoPackage databases.
+ *
+ * @author Diego Migliavacca
+ * @since 3.5
+ */
+public class GpkgDialectProvider implements SqlDialectProvider {
+
+ private static Logger LOG = LoggerFactory.getLogger(GpkgDialectProvider.class);
+
+ @Override
+ public boolean supportsConnection(final Connection connection) {
+ String url;
+ try {
+ url = connection.getMetaData().getURL();
+ }
+ catch (Exception e) {
+ LOG.debug("Could not determine metadata/url of connection: {}", e.getLocalizedMessage());
+ LOG.trace("Stack trace:", e);
+ return false;
+ }
+ return url.startsWith("jdbc:sqlite:");
+ }
+
+ @Override
+ public SQLDialect createDialect(final Connection conn) {
+ return new GpkgDialect();
+ }
+
+}
diff --git a/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/src/main/java/org/deegree/sqldialect/gpkg/GpkgGeometryConverter.java b/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/src/main/java/org/deegree/sqldialect/gpkg/GpkgGeometryConverter.java
new file mode 100644
index 00000000000..34b7c06172d
--- /dev/null
+++ b/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/src/main/java/org/deegree/sqldialect/gpkg/GpkgGeometryConverter.java
@@ -0,0 +1,173 @@
+/*----------------------------------------------------------------------------
+ This file is part of deegree, http://deegree.org/
+ Copyright (C) 2001-2011 by:
+ - Department of Geography, University of Bonn -
+ and
+ - lat/lon GmbH -
+
+ 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
+
+ Contact information:
+
+ lat/lon GmbH
+ Aennchenstr. 19, 53177 Bonn
+ Germany
+ http://lat-lon.de/
+
+ Department of Geography, University of Bonn
+ Prof. Dr. Klaus Greve
+ Postfach 1147, 53001 Bonn
+ Germany
+ http://www.geographie.uni-bonn.de/deegree/
+
+ e-mail: info@deegree.org
+ ----------------------------------------------------------------------------*/
+package org.deegree.sqldialect.gpkg;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.deegree.cs.coordinatesystems.ICRS;
+import org.deegree.geometry.Geometry;
+import org.deegree.geometry.io.WKBReader;
+import org.deegree.geometry.utils.GeometryParticleConverter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link GeometryParticleConverter} for GeoPackage databases.
+ *
+ * @author Diego Migliavacca
+ * @since 3.5
+ */
+public class GpkgGeometryConverter implements GeometryParticleConverter {
+
+ private static Logger LOG = LoggerFactory.getLogger(GpkgGeometryConverter.class);
+
+ private final String column;
+
+ private final ICRS crs;
+
+ private final String srid;
+
+ /**
+ * Creates a new {@link GpkgGeometryConverter} instance.
+ * @param column (unqualified) column that stores the geometry, must not be
+ * null
+ * @param crs CRS of the stored geometries, can be null
+ * @param srid PostGIS spatial reference identifier, must not be null
+ */
+ public GpkgGeometryConverter(String column, ICRS crs, String srid) {
+ this.column = column;
+ this.crs = crs;
+ this.srid = srid;
+ }
+
+ @Override
+ public String getSelectSnippet(String tableAlias) {
+ if (tableAlias != null) {
+ return tableAlias + "." + column;
+ }
+ return column;
+ }
+
+ @Override
+ public String getSetSnippet(Geometry particle) {
+ return null;
+ }
+
+ @Override
+ public Geometry toParticle(ResultSet rs, int colIndex) throws SQLException {
+ ByteBuffer bb = ByteBuffer.wrap(rs.getBytes(colIndex));
+ if (bb == null) {
+ return null;
+ }
+ try {
+ int[] header = parseGpkgHeader(bb);
+ int headerLength = header[0];
+ int endian = header[1];
+ return parseGpkgGeometry(bb, headerLength, endian);
+ }
+ catch (Throwable t) {
+ throw new IllegalArgumentException(t.getMessage(), t);
+ }
+ }
+
+ private int[] parseGpkgHeader(ByteBuffer pgb) throws Exception {
+ byte bytes = pgb.get(3);
+ int endian = bytes & 0x01;
+ int headerLength = getFlags(bytes);
+ return new int[] { headerLength, endian };
+ }
+
+ private int getFlags(byte bytes) throws Exception {
+ int flags = (bytes & 0x0E) >> 1;
+ return getHeaderLength(flags);
+ }
+
+ @SuppressWarnings("unchecked")
+ private int getHeaderLength(int flag) throws Exception {
+ Map eb = new HashMap();
+ eb.put(0, 8);
+ eb.put(1, 40);
+ eb.put(2, 56);
+ eb.put(3, 56);
+ eb.put(4, 72);
+
+ int envelopeLength = 0;
+ try {
+ envelopeLength = eb.get(flag);
+ }
+ catch (Exception e) {
+ System.out.println("Invalid envelope code value:" + flag);
+ }
+ return envelopeLength;
+ }
+
+ private Geometry parseGpkgGeometry(ByteBuffer byb, int headerLength, int endian) throws Exception {
+ WKBReader wkbReader = new WKBReader();
+ if (endian == 0)
+ byb.order(ByteOrder.BIG_ENDIAN);
+ else {
+ byb.order(ByteOrder.LITTLE_ENDIAN);
+ }
+ byte[] wkb = new byte[byb.capacity() - headerLength];
+ byb.position(headerLength);
+ byb.get(wkb, 0, wkb.length);
+ Geometry gpkgGeom = wkbReader.read(wkb, crs);
+ if (gpkgGeom == null) {
+ throw new Exception("Unable to parse the GeoPackage geometry");
+ }
+ return gpkgGeom;
+ }
+
+ @Override
+ public void setParticle(PreparedStatement stmt, Geometry particle, int paramIndex) throws SQLException {
+ }
+
+ @Override
+ public String getSrid() {
+ return srid;
+ }
+
+ @Override
+ public ICRS getCrs() {
+ return crs;
+ }
+
+}
diff --git a/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/src/main/java/org/deegree/sqldialect/gpkg/GpkgWhereBuilder.java b/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/src/main/java/org/deegree/sqldialect/gpkg/GpkgWhereBuilder.java
new file mode 100644
index 00000000000..ec0841418a5
--- /dev/null
+++ b/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/src/main/java/org/deegree/sqldialect/gpkg/GpkgWhereBuilder.java
@@ -0,0 +1,108 @@
+/*----------------------------------------------------------------------------
+ This file is part of deegree, http://deegree.org/
+ Copyright (C) 2001-2009 by:
+ - Department of Geography, University of Bonn -
+ and
+ - lat/lon GmbH -
+
+ 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
+
+ Contact information:
+
+ lat/lon GmbH
+ Aennchenstr. 19, 53177 Bonn
+ Germany
+ http://lat-lon.de/
+
+ Department of Geography, University of Bonn
+ Prof. Dr. Klaus Greve
+ Postfach 1147, 53001 Bonn
+ Germany
+ http://www.geographie.uni-bonn.de/deegree/
+
+ e-mail: info@deegree.org
+ ----------------------------------------------------------------------------*/
+package org.deegree.sqldialect.gpkg;
+
+import org.deegree.filter.FilterEvaluationException;
+import org.deegree.filter.OperatorFilter;
+import org.deegree.filter.comparison.PropertyIsLike;
+import org.deegree.filter.expression.ValueReference;
+import org.deegree.filter.sort.SortProperty;
+import org.deegree.filter.spatial.SpatialOperator;
+import org.deegree.sqldialect.SortCriterion;
+import org.deegree.sqldialect.filter.AbstractWhereBuilder;
+import org.deegree.sqldialect.filter.PropertyNameMapper;
+import org.deegree.sqldialect.filter.UnmappableException;
+import org.deegree.sqldialect.filter.expression.SQLExpression;
+import org.deegree.sqldialect.filter.expression.SQLOperation;
+import org.deegree.sqldialect.filter.expression.SQLOperationBuilder;
+
+import java.util.List;
+
+/**
+ * {@link AbstractWhereBuilder} implementation for GeoPackage databases.
+ *
+ * @author Diego Migliavacca
+ * @since 3.5
+ */
+public class GpkgWhereBuilder extends AbstractWhereBuilder {
+
+ /**
+ * Creates a new {@link GpkgWhereBuilder} instance.
+ * @param dialect SQL dialect
+ * @param mapper provides the mapping from {@link ValueReference}s to DB columns, must
+ * not be null
+ * @param filter Filter to use for generating the WHERE clause, can be
+ * null
+ * @param sortCrit criteria to use for generating the ORDER BY clause, can be
+ * null
+ * @param defaultSortCriteria
+ * @param allowPartialMappings if false, any unmappable expression will cause an
+ * {@link UnmappableException} to be thrown
+ * @throws FilterEvaluationException if the expression contains invalid
+ * {@link ValueReference}s
+ * @throws UnmappableException if allowPartialMappings is false and an expression
+ * could not be mapped to the db
+ */
+ public GpkgWhereBuilder(GpkgDialect dialect, PropertyNameMapper mapper, OperatorFilter filter,
+ SortProperty[] sortCrit, List defaultSortCriteria, boolean allowPartialMappings)
+ throws FilterEvaluationException, UnmappableException {
+ super(dialect, mapper, filter, sortCrit, defaultSortCriteria);
+ build(allowPartialMappings);
+ }
+
+ /**
+ * Translates the given {@link PropertyIsLike} into an {@link SQLOperation}
+ * @param op comparison operator to be translated, must not be null
+ * @return corresponding SQL expression, never null
+ * @throws UnmappableException if translation is not possible (usually due to
+ * unmappable property names)
+ * @throws FilterEvaluationException if the expression contains invalid
+ * {@link ValueReference}s
+ */
+ @Override
+ protected SQLOperation toProtoSQL(PropertyIsLike op) throws UnmappableException, FilterEvaluationException {
+ return null;
+ }
+
+ @Override
+ protected SQLOperation toProtoSQL(SpatialOperator op) throws UnmappableException, FilterEvaluationException {
+ return null;
+ }
+
+ @Override
+ protected void addExpression(SQLOperationBuilder builder, SQLExpression expr, Boolean matchCase) {
+ }
+
+}
diff --git a/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/src/main/resources/META-INF/services/org.deegree.db.dialect.SqlDialectProvider b/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/src/main/resources/META-INF/services/org.deegree.db.dialect.SqlDialectProvider
new file mode 100644
index 00000000000..8b41e7124d1
--- /dev/null
+++ b/deegree-core/deegree-core-sqldialect/deegree-sqldialect-gpkg/src/main/resources/META-INF/services/org.deegree.db.dialect.SqlDialectProvider
@@ -0,0 +1 @@
+org.deegree.sqldialect.gpkg.GpkgDialectProvider
diff --git a/deegree-core/deegree-core-sqldialect/pom.xml b/deegree-core/deegree-core-sqldialect/pom.xml
index 4a14537702b..2c45baceb35 100644
--- a/deegree-core/deegree-core-sqldialect/pom.xml
+++ b/deegree-core/deegree-core-sqldialect/pom.xml
@@ -13,6 +13,7 @@
deegree-sqldialect-commons
+ deegree-sqldialect-gpkg
deegree-sqldialect-postgis
deegree-sqldialect-oracle
deegree-sqldialect-mssql
diff --git a/deegree-datastores/deegree-featurestores/deegree-featurestore-sql/pom.xml b/deegree-datastores/deegree-featurestores/deegree-featurestore-sql/pom.xml
index 05e887affeb..7692afd86fe 100644
--- a/deegree-datastores/deegree-featurestores/deegree-featurestore-sql/pom.xml
+++ b/deegree-datastores/deegree-featurestores/deegree-featurestore-sql/pom.xml
@@ -53,6 +53,11 @@
${project.version}
test
+
+ deegree-sqldialect-gpkg
+ org.deegree
+ ${project.version}
+
junit
junit
diff --git a/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/pom.xml b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/pom.xml
new file mode 100644
index 00000000000..6ed1d33b5a9
--- /dev/null
+++ b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/pom.xml
@@ -0,0 +1,52 @@
+
+ 4.0.0
+ deegree-tilestore-gpkg
+ deegree-tilestore-gpkg
+ jar
+ Tile store implementation that accesses tiles stored in GeoPackage databases
+
+
+ ok
+
+
+
+ org.deegree
+ deegree-tilestores
+ 3.5.0-SNAPSHOT
+
+
+
+
+
+ org.jvnet.jaxb2.maven2
+ maven-jaxb2-plugin
+
+
+
+
+
+
+ org.deegree
+ deegree-tilestore-commons
+ ${project.version}
+
+
+ org.deegree
+ deegree-core-db
+ ${project.version}
+
+
+ com.sun.media
+ jai-codec
+
+
+ com.sun.media
+ jai_imageio
+
+
+ junit
+ junit
+
+
+
+
diff --git a/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTile.java b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTile.java
new file mode 100644
index 00000000000..9199483c503
--- /dev/null
+++ b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTile.java
@@ -0,0 +1,105 @@
+//$HeadURL$
+/*----------------------------------------------------------------------------
+ This file is part of deegree, http://deegree.org/
+ Copyright (C) 2001-2010 by:
+ - Department of Geography, University of Bonn -
+ and
+ - lat/lon GmbH -
+
+ 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
+
+ Contact information:
+
+ lat/lon GmbH
+ Aennchenstr. 19, 53177 Bonn
+ Germany
+ http://lat-lon.de/
+
+ Department of Geography, University of Bonn
+ Prof. Dr. Klaus Greve
+ Postfach 1147, 53001 Bonn
+ Germany
+ http://www.geographie.uni-bonn.de/deegree/
+
+ Occam Labs UG (haftungsbeschränkt)
+ Godesberger Allee 139, 53175 Bonn
+ Germany
+ http://www.occamlabs.de/
+
+ e-mail: info@deegree.org
+ ----------------------------------------------------------------------------*/
+
+package org.deegree.tile.persistence.gpkg;
+
+import org.deegree.feature.FeatureCollection;
+import org.deegree.geometry.Envelope;
+import org.deegree.tile.Tile;
+import org.deegree.tile.TileIOException;
+import org.deegree.tile.TileMatrix;
+import org.slf4j.Logger;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * A GpkgTile.
+ *
+ * @author Diego Migliavacca
+ * @since 3.5
+ */
+public class GpkgTile implements Tile {
+
+ private static final Logger LOG = getLogger(GpkgTile.class);
+
+ private TileMatrix tm;
+
+ private byte[] bytes;
+
+ public GpkgTile(TileMatrix tm, byte[] bytes) {
+ this.tm = tm;
+ this.bytes = bytes;
+ }
+
+ @Override
+ public BufferedImage getAsImage() throws TileIOException {
+ try {
+ return ImageIO.read(new ByteArrayInputStream(bytes));
+ }
+ catch (IOException e) {
+ String msg = "Error decoding image from byte array: " + e.getMessage();
+ LOG.trace(msg, e);
+ throw new TileIOException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public InputStream getAsStream() {
+ return new ByteArrayInputStream(bytes);
+ }
+
+ @Override
+ public Envelope getEnvelope() {
+ return tm.getSpatialMetadata().getEnvelope();
+ }
+
+ @Override
+ public FeatureCollection getFeatures(int i, int j, int limit) throws UnsupportedOperationException {
+ throw new UnsupportedOperationException("Feature retrieval is not supported by the GpkgTileStore.");
+ }
+
+}
diff --git a/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTileDataLevel.java b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTileDataLevel.java
new file mode 100644
index 00000000000..014de0746a2
--- /dev/null
+++ b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTileDataLevel.java
@@ -0,0 +1,90 @@
+//$HeadURL$
+/*----------------------------------------------------------------------------
+ This file is part of deegree, http://deegree.org/
+ Copyright (C) 2001-2010 by:
+ - Department of Geography, University of Bonn -
+ and
+ - lat/lon GmbH -
+
+ 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
+
+ Contact information:
+
+ lat/lon GmbH
+ Aennchenstr. 19, 53177 Bonn
+ Germany
+ http://lat-lon.de/
+
+ Department of Geography, University of Bonn
+ Prof. Dr. Klaus Greve
+ Postfach 1147, 53001 Bonn
+ Germany
+ http://www.geographie.uni-bonn.de/deegree/
+
+ Occam Labs UG (haftungsbeschränkt)
+ Godesberger Allee 139, 53175 Bonn
+ Germany
+ http://www.occamlabs.de/
+
+ e-mail: info@deegree.org
+ ----------------------------------------------------------------------------*/
+
+package org.deegree.tile.persistence.gpkg;
+
+import org.deegree.commons.utils.Pair;
+import org.deegree.tile.Tile;
+import org.deegree.tile.TileDataLevel;
+import org.deegree.tile.TileMatrix;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A GpkgTileDataLevel
+ *
+ * @author Diego Migliavacca
+ * @since 3.5
+ */
+
+public class GpkgTileDataLevel implements TileDataLevel {
+
+ private final TileMatrix tm;
+
+ private Map, byte[]> tileMap;
+
+ public GpkgTileDataLevel(TileMatrix tm, Map, byte[]> tileMap) {
+ this.tm = tm;
+ this.tileMap = tileMap;
+ }
+
+ @Override
+ public TileMatrix getMetadata() {
+ return tm;
+ }
+
+ @Override
+ public Tile getTile(long x, long y) {
+ Pair k = new Pair();
+ k.setFirst(x);
+ k.setSecond(y);
+ byte[] byteArr = tileMap.get(k);
+ return new GpkgTile(tm, byteArr);
+ }
+
+ @Override
+ public List getStyles() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTileDataSetBuilder.java b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTileDataSetBuilder.java
new file mode 100644
index 00000000000..ee5b8d52882
--- /dev/null
+++ b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTileDataSetBuilder.java
@@ -0,0 +1,124 @@
+//$HeadURL$
+/*----------------------------------------------------------------------------
+ This file is part of deegree, http://deegree.org/
+ Copyright (C) 2001-2012 by:
+ - Department of Geography, University of Bonn -
+ and
+ - lat/lon GmbH -
+ and
+ - Occam Labs UG (haftungsbeschränkt) -
+
+ 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
+
+ Contact information:
+
+ lat/lon GmbH
+ Aennchenstr. 19, 53177 Bonn
+ Germany
+ http://lat-lon.de/
+
+ Department of Geography, University of Bonn
+ Prof. Dr. Klaus Greve
+ Postfach 1147, 53001 Bonn
+ Germany
+ http://www.geographie.uni-bonn.de/deegree/
+
+ Occam Labs UG (haftungsbeschränkt)
+ Godesberger Allee 139, 53175 Bonn
+ Germany
+
+ e-mail: info@deegree.org
+ ----------------------------------------------------------------------------*/
+package org.deegree.tile.persistence.gpkg;
+
+import org.deegree.commons.config.ResourceInitException;
+import org.deegree.commons.utils.Pair;
+import org.deegree.db.legacy.LegacyConnectionProvider;
+import org.deegree.tile.*;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.*;
+
+/**
+ * Builds tile data sets from jaxb config beans.
+ *
+ * @author Diego Migliavacca
+ * @since 3.5
+ */
+class GpkgTileDataSetBuilder {
+
+ private final org.deegree.tile.persistence.gpkg.jaxb.GpkgTileStoreJAXB cfg;
+
+ private String format;
+
+ private String identifier;
+
+ private TileMatrixSet tms;
+
+ GpkgTileDataSetBuilder(org.deegree.tile.persistence.gpkg.jaxb.GpkgTileStoreJAXB cfg, TileMatrixSet tms) {
+ this.cfg = cfg;
+ this.tms = tms;
+ this.format = cfg.getTileDataSet().getImageFormat();
+ this.identifier = cfg.getTileDataSet().getIdentifier();
+ }
+
+ Map extractTileDataSets() throws ResourceInitException {
+ Map tileDataSet = new HashMap();
+ tileDataSet.put(identifier, buildTileDataSet());
+ return tileDataSet;
+ }
+
+ public TileDataSet buildTileDataSet() throws ResourceInitException {
+ List list = new ArrayList();
+ for (TileMatrix tm : tms.getTileMatrices()) {
+ String idTm = tm.getIdentifier();
+ Map, byte[]> ts = getTileData(idTm);
+ TileDataLevel tdl = new GpkgTileDataLevel(tm, ts);
+ list.add(tdl);
+ }
+ // if ( format == null ) {
+ // format = "image/jpg";
+ // }
+ return new DefaultTileDataSet(list, tms, format);
+ }
+
+ public Map, byte[]> getTileData(String id) {
+ Map, byte[]> mapTile = new LinkedHashMap, byte[]>();
+ try {
+ LegacyConnectionProvider connProvider = new LegacyConnectionProvider(
+ "jdbc:sqlite:/" + cfg.getTileDataSet().getFile(), "", "", false, null);
+ Connection conn = connProvider.getConnection();
+ Statement stmt = conn.createStatement();
+ String table = cfg.getTileDataSet().getTileMapping().getTable();
+ String query = "select * from " + table + " where zoom_level = " + id;
+ ResultSet rs = stmt.executeQuery(query);
+ while (rs.next()) {
+ long row = rs.getLong(4);
+ long column = rs.getLong(3);
+ byte[] imgBytes = rs.getBytes(5);
+ Pair keyTile = new Pair();
+ keyTile.setFirst(row);
+ keyTile.setSecond(column);
+ mapTile.put(keyTile, imgBytes);
+ }
+ }
+ catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return mapTile;
+ }
+
+}
diff --git a/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTileStoreBuilder.java b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTileStoreBuilder.java
new file mode 100644
index 00000000000..962974669b8
--- /dev/null
+++ b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTileStoreBuilder.java
@@ -0,0 +1,165 @@
+/*----------------------------------------------------------------------------
+ This file is part of deegree
+ Copyright (C) 2001-2013 by:
+ - Department of Geography, University of Bonn -
+ and
+ - lat/lon GmbH -
+ and
+ - Occam Labs UG (haftungsbeschränkt) -
+ and others
+
+ 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
+
+ Contact information:
+
+ e-mail: info@deegree.org
+ website: http://www.deegree.org/
+----------------------------------------------------------------------------*/
+package org.deegree.tile.persistence.gpkg;
+
+import org.deegree.cs.coordinatesystems.ICRS;
+import org.deegree.cs.exceptions.UnknownCRSException;
+import org.deegree.cs.persistence.CRSManager;
+import org.deegree.db.legacy.LegacyConnectionProvider;
+import org.deegree.geometry.Envelope;
+import org.deegree.geometry.GeometryFactory;
+import org.deegree.geometry.metadata.SpatialMetadata;
+import org.deegree.tile.TileDataSet;
+import org.deegree.tile.TileMatrix;
+import org.deegree.tile.TileMatrixSet;
+import org.deegree.tile.persistence.GenericTileStore;
+import org.deegree.tile.persistence.TileStore;
+import org.deegree.workspace.ResourceBuilder;
+import org.deegree.workspace.ResourceInitException;
+import org.deegree.workspace.ResourceMetadata;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import static java.util.Collections.singletonList;
+
+/**
+ * This class is responsible for building GeoPackage tile stores.
+ *
+ * @author Diego Migliavacca
+ * @since 3.5
+ */
+public class GpkgTileStoreBuilder implements ResourceBuilder {
+
+ private org.deegree.tile.persistence.gpkg.jaxb.GpkgTileStoreJAXB cfg;
+
+ private ResourceMetadata metadata;
+
+ private String table;
+
+ private Connection conn = null;
+
+ private List matrices;
+
+ private final GeometryFactory fac = new GeometryFactory();
+
+ public GpkgTileStoreBuilder(org.deegree.tile.persistence.gpkg.jaxb.GpkgTileStoreJAXB cfg,
+ ResourceMetadata metadata) {
+ this.cfg = cfg;
+ this.metadata = metadata;
+ }
+
+ @Override
+ public TileStore build() {
+ try {
+ table = cfg.getTileDataSet().getTileMapping().getTable();
+ String id;
+ LegacyConnectionProvider connProvider = new LegacyConnectionProvider(
+ "jdbc:sqlite:/" + cfg.getTileDataSet().getFile(), "", "", false, null);
+ conn = connProvider.getConnection();
+ TileMatrix tm;
+ matrices = new ArrayList();
+ try {
+ Statement stmt = conn.createStatement();
+ String query = "select * from gpkg_tile_matrix where table_name = '" + table + "'";
+ ResultSet rs = stmt.executeQuery(query);
+ if (rs == null) {
+ throw new ResourceInitException(
+ "No information could be read from gpkg_tile_matrix table. Please add the table to the GeoPackage.");
+ }
+ SpatialMetadata sm = getTileMatrixSet().getSpatialMetadata();
+ while (rs.next()) {
+ id = rs.getString(2);
+ long numx = rs.getLong(3);
+ long numy = rs.getLong(4);
+ long tileWidth = rs.getLong(5);
+ long tsx = rs.getLong(7);
+ long tsy = rs.getLong(8);
+ double res = (double) (tsx / tileWidth);
+ tm = new TileMatrix(id, sm, tsx, tsy, res, numx, numy);
+ matrices.add(tm);
+ }
+ }
+ catch (SQLException e) {
+ e.printStackTrace();
+ }
+ GpkgTileDataSetBuilder builder = new GpkgTileDataSetBuilder(cfg, getTileMatrixSet());
+ Map map = builder.extractTileDataSets();
+ return new GenericTileStore(map, metadata);
+ }
+ catch (Exception e) {
+ throw new ResourceInitException("Error when parsing configuration: " + e.getLocalizedMessage(), e);
+ }
+ }
+
+ public TileMatrixSet getTileMatrixSet() {
+ String id = null;
+ SpatialMetadata spatialMetadata = null;
+ try {
+ Statement stmt = conn.createStatement();
+ String query = "select * from gpkg_tile_matrix_set where table_name = '" + table + "'";
+ ResultSet rs = stmt.executeQuery(query);
+ if (rs == null) {
+ throw new ResourceInitException(
+ "No information could be read from gpkg_tile_matrix_set table. Please add the table to the GeoPackage.");
+ }
+ id = rs.getString(1);
+ ICRS srs = CRSManager.lookup("EPSG:" + rs.getString(2));
+ if (srs == null) {
+ throw new ResourceInitException(
+ "No SRS information could be read from GeoPackage. Please add one to the GeoPackage.");
+ }
+ double minx = rs.getDouble(3);
+ double miny = rs.getDouble(4);
+ double maxx = rs.getDouble(5);
+ double maxy = rs.getDouble(6);
+ Envelope env = fac.createEnvelope(minx, miny, maxx, maxy, srs);
+ if (env == null) {
+ throw new ResourceInitException(
+ "No envelope information could be read from GeoPackage. Please add one to the GeoPackage.");
+ }
+ spatialMetadata = new SpatialMetadata(env, singletonList(env.getCoordinateSystem()));
+ }
+ catch (SQLException e) {
+ e.printStackTrace();
+ }
+ catch (UnknownCRSException e) {
+ e.printStackTrace();
+ }
+ catch (ResourceInitException e) {
+ e.printStackTrace();
+ }
+ return new TileMatrixSet(id, null, matrices, spatialMetadata, null);
+ }
+
+}
diff --git a/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTileStoreMetadata.java b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTileStoreMetadata.java
new file mode 100644
index 00000000000..2619a4e3fef
--- /dev/null
+++ b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTileStoreMetadata.java
@@ -0,0 +1,67 @@
+/*----------------------------------------------------------------------------
+ This file is part of deegree
+ Copyright (C) 2001-2013 by:
+ - Department of Geography, University of Bonn -
+ and
+ - lat/lon GmbH -
+ and
+ - Occam Labs UG (haftungsbeschränkt) -
+ and others
+
+ 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
+
+ Contact information:
+
+ e-mail: info@deegree.org
+ website: http://www.deegree.org/
+----------------------------------------------------------------------------*/
+package org.deegree.tile.persistence.gpkg;
+
+import org.deegree.tile.persistence.TileStore;
+import org.deegree.workspace.ResourceBuilder;
+import org.deegree.workspace.ResourceInitException;
+import org.deegree.workspace.ResourceLocation;
+import org.deegree.workspace.Workspace;
+import org.deegree.workspace.standard.AbstractResourceMetadata;
+import org.deegree.workspace.standard.AbstractResourceProvider;
+
+import static org.deegree.commons.xml.jaxb.JAXBUtils.unmarshall;
+
+/**
+ * Resource metadata implementation for geotiff tile stores.
+ *
+ * @author Diego Migliavacca
+ * @since 3.5
+ */
+public class GpkgTileStoreMetadata extends AbstractResourceMetadata {
+
+ public GpkgTileStoreMetadata(Workspace workspace, ResourceLocation location,
+ AbstractResourceProvider provider) {
+ super(workspace, location, provider);
+ }
+
+ @Override
+ public ResourceBuilder prepare() {
+ try {
+ org.deegree.tile.persistence.gpkg.jaxb.GpkgTileStoreJAXB cfg = (org.deegree.tile.persistence.gpkg.jaxb.GpkgTileStoreJAXB) unmarshall(
+ "org.deegree.tile.persistence.gpkg.jaxb", provider.getSchema(), location.getAsStream(), workspace);
+
+ return new GpkgTileStoreBuilder(cfg, this);
+ }
+ catch (Exception e) {
+ throw new ResourceInitException(
+ "Unable to prepare resource " + getIdentifier() + ": " + e.getLocalizedMessage(), e);
+ }
+ }
+
+}
diff --git a/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTileStoreProvider.java b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTileStoreProvider.java
new file mode 100644
index 00000000000..fa08c1e41b4
--- /dev/null
+++ b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/java/org/deegree/tile/persistence/gpkg/GpkgTileStoreProvider.java
@@ -0,0 +1,78 @@
+//$HeadURL$
+/*----------------------------------------------------------------------------
+ This file is part of deegree, http://deegree.org/
+ Copyright (C) 2001-2010 by:
+ - Department of Geography, University of Bonn -
+ and
+ - lat/lon GmbH -
+
+ 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
+
+ Contact information:
+
+ lat/lon GmbH
+ Aennchenstr. 19, 53177 Bonn
+ Germany
+ http://lat-lon.de/
+
+ Department of Geography, University of Bonn
+ Prof. Dr. Klaus Greve
+ Postfach 1147, 53001 Bonn
+ Germany
+ http://www.geographie.uni-bonn.de/deegree/
+
+ Occam Labs UG (haftungsbeschränkt)
+ Godesberger Allee 139, 53175 Bonn
+ Germany
+ http://www.occamlabs.de/
+
+ e-mail: info@deegree.org
+ ----------------------------------------------------------------------------*/
+package org.deegree.tile.persistence.gpkg;
+
+import org.deegree.tile.persistence.TileStore;
+import org.deegree.tile.persistence.TileStoreProvider;
+import org.deegree.workspace.ResourceLocation;
+import org.deegree.workspace.ResourceMetadata;
+import org.deegree.workspace.Workspace;
+
+import java.net.URL;
+
+/**
+ * The GpkgTileStoreProvider provides a TileSet out of a GeoPackage database.
+ *
+ * @author Diego Migliavacca
+ * @since 3.5
+ */
+
+public class GpkgTileStoreProvider extends TileStoreProvider {
+
+ private static final URL SCHEMA = GpkgTileStoreProvider.class
+ .getResource("/META-INF/schemas/datasource/tile/gpkg/geopackage.xsd");
+
+ @Override
+ public String getNamespace() {
+ return "http://www.deegree.org/datasource/tile/gpkg";
+ }
+
+ @Override
+ public ResourceMetadata createFromLocation(Workspace workspace, ResourceLocation location) {
+ return new GpkgTileStoreMetadata(workspace, location, this);
+ }
+
+ @Override
+ public URL getSchema() {
+ return SCHEMA;
+ }
+
+}
diff --git a/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/resources/META-INF/schemas/datasource/tile/gpkg/example.xml b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/resources/META-INF/schemas/datasource/tile/gpkg/example.xml
new file mode 100644
index 00000000000..ecc6566a50c
--- /dev/null
+++ b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/resources/META-INF/schemas/datasource/tile/gpkg/example.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+ test
+ home/user/World.gpkg
+
+
+ image/jpg
+
+
+
diff --git a/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/resources/META-INF/schemas/datasource/tile/gpkg/geopackage.xsd b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/resources/META-INF/schemas/datasource/tile/gpkg/geopackage.xsd
new file mode 100644
index 00000000000..3e4abbeffed
--- /dev/null
+++ b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/resources/META-INF/schemas/datasource/tile/gpkg/geopackage.xsd
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/resources/META-INF/services/org.deegree.tile.persistence.TileStoreProvider b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/resources/META-INF/services/org.deegree.tile.persistence.TileStoreProvider
new file mode 100644
index 00000000000..5c555428528
--- /dev/null
+++ b/deegree-datastores/deegree-tilestores/deegree-tilestore-gpkg/src/main/resources/META-INF/services/org.deegree.tile.persistence.TileStoreProvider
@@ -0,0 +1 @@
+org.deegree.tile.persistence.gpkg.GpkgTileStoreProvider
diff --git a/deegree-datastores/deegree-tilestores/pom.xml b/deegree-datastores/deegree-tilestores/pom.xml
index f2c1a58e69d..aa111f83f5d 100644
--- a/deegree-datastores/deegree-tilestores/pom.xml
+++ b/deegree-datastores/deegree-tilestores/pom.xml
@@ -17,6 +17,7 @@
deegree-tilestore-filesystem
deegree-tilestore-gdal
deegree-tilestore-geotiff
+ deegree-tilestore-gpkg
deegree-tilestore-merge
deegree-tilestore-remotewms
deegree-tilestore-remotewmts
diff --git a/deegree-services/deegree-webservices/pom.xml b/deegree-services/deegree-webservices/pom.xml
index 294f9098261..6e5934b8e0e 100644
--- a/deegree-services/deegree-webservices/pom.xml
+++ b/deegree-services/deegree-webservices/pom.xml
@@ -256,6 +256,11 @@
deegree-tilestore-remotewmts
${project.version}
+
+ org.deegree
+ deegree-tilestore-gpkg
+ ${project.version}
+
org.deegree
deegree-connectionprovider-datasource
diff --git a/deegree-services/deegree-webservices/src/main/java/org/deegree/console/connection/sql/JdbcBean.java b/deegree-services/deegree-webservices/src/main/java/org/deegree/console/connection/sql/JdbcBean.java
index a8c54011ce4..421c2c1b0d9 100644
--- a/deegree-services/deegree-webservices/src/main/java/org/deegree/console/connection/sql/JdbcBean.java
+++ b/deegree-services/deegree-webservices/src/main/java/org/deegree/console/connection/sql/JdbcBean.java
@@ -90,6 +90,10 @@ public void setDbType(String dbType) {
dbConn = "jdbc:postgresql://" + dbHost + ":" + dbPort + "/" + dbName;
return;
}
+ if (dbType.equals("sqlite")) {
+ dbConn = "jdbc:sqlite:" + dbName;
+ return;
+ }
}
public void setDbPort(String dbPort) {
@@ -144,6 +148,10 @@ public void update() {
dbConn = "jdbc:postgresql://" + dbHost + ":" + dbPort + "/" + dbName;
return;
}
+ if (dbType.equals("sqlite")) {
+ dbConn = "jdbc:sqlite:" + dbName;
+ return;
+ }
}
public String editAsXml() throws IOException {
diff --git a/deegree-services/deegree-webservices/src/main/resources/META-INF/console/resourceprovider/org.deegree.db.datasource.DataSourceConnectionProviderProvider b/deegree-services/deegree-webservices/src/main/resources/META-INF/console/resourceprovider/org.deegree.db.datasource.DataSourceConnectionProviderProvider
index a9b696a1fa3..8a0f8f0ecbe 100644
--- a/deegree-services/deegree-webservices/src/main/resources/META-INF/console/resourceprovider/org.deegree.db.datasource.DataSourceConnectionProviderProvider
+++ b/deegree-services/deegree-webservices/src/main/resources/META-INF/console/resourceprovider/org.deegree.db.datasource.DataSourceConnectionProviderProvider
@@ -5,7 +5,9 @@ example2_name=Oracle (minimal)
example2_location=/META-INF/schemas/connectionprovider/datasource/example_dbcp_oracle.xml
example3_name=MySQL (minimal)
example3_location=/META-INF/schemas/connectionprovider/datasource/example_dbcp_mssql.xml
-example4_name=JNDI
-example4_location=/META-INF/schemas/connectionprovider/datasource/example_jndi.xml
-example5_name=UCP
-example5_location=/META-INF/schemas/connectionprovider/datasource/example_ucp.xml
+example4_name=GeoPackage
+example4_location=/META-INF/schemas/connectionprovider/datasource/example_dbcp_gpkg.xml
+example5_name=JNDI
+example5_location=/META-INF/schemas/connectionprovider/datasource/example_jndi.xml
+example6_name=UCP
+example6_location=/META-INF/schemas/connectionprovider/datasource/example_ucp.xml
diff --git a/deegree-services/deegree-webservices/src/main/resources/META-INF/console/resourceprovider/org.deegree.tile.persistence.gpkg.GpkgTileStoreProvider b/deegree-services/deegree-webservices/src/main/resources/META-INF/console/resourceprovider/org.deegree.tile.persistence.gpkg.GpkgTileStoreProvider
new file mode 100644
index 00000000000..455ba37e71c
--- /dev/null
+++ b/deegree-services/deegree-webservices/src/main/resources/META-INF/console/resourceprovider/org.deegree.tile.persistence.gpkg.GpkgTileStoreProvider
@@ -0,0 +1,2 @@
+name=GpkgTilestore
+example1_location=/META-INF/schemas/datasource/tile/gpkg/example.xml
diff --git a/deegree-services/deegree-webservices/src/main/resources/log4j2.properties b/deegree-services/deegree-webservices/src/main/resources/log4j2.properties
index 807d2c33e35..10e9ea92da2 100644
--- a/deegree-services/deegree-webservices/src/main/resources/log4j2.properties
+++ b/deegree-services/deegree-webservices/src/main/resources/log4j2.properties
@@ -31,7 +31,7 @@ appender.rolling.strategy.max = 10
loggers = org.deegree, org.reflections
logger.org.deegree.name = org.deegree
-logger.org.deegree.level = info
+logger.org.deegree.level = trace
logger.org.deegree.additivity = false
logger.org.deegree.appenderRef.rolling.ref = RollingFile
logger.org.deegree.appenderRef.stdout.ref = STDOUT
diff --git a/deegree-services/deegree-webservices/src/main/webapp/console/connection/sql/jdbcparams.xhtml b/deegree-services/deegree-webservices/src/main/webapp/console/connection/sql/jdbcparams.xhtml
index bcaf358f40b..c87da2e302e 100644
--- a/deegree-services/deegree-webservices/src/main/webapp/console/connection/sql/jdbcparams.xhtml
+++ b/deegree-services/deegree-webservices/src/main/webapp/console/connection/sql/jdbcparams.xhtml
@@ -21,6 +21,7 @@
+
diff --git a/pom.xml b/pom.xml
index beb809b7d6a..9f9fd0d9982 100644
--- a/pom.xml
+++ b/pom.xml
@@ -870,6 +870,12 @@
mssql-jdbc
10.2.2.jre11
+
+
+ org.xerial
+ sqlite-jdbc
+ 3.40.0.0
+
org.apache.xmlgraphics