From 89ea5210389945d4aa230a27e5222061ccd8bb9c Mon Sep 17 00:00:00 2001 From: Lyn Elisa Goltz Date: Mon, 13 Jun 2016 10:03:43 +0200 Subject: [PATCH 1/3] #3559 - use existing id in replace --- .../persistence/sql/SQLFeatureStoreTransaction.java | 5 +++-- .../feature/persistence/sql/insert/FeatureRow.java | 11 +++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/deegree-datastores/deegree-featurestores/deegree-featurestore-sql/src/main/java/org/deegree/feature/persistence/sql/SQLFeatureStoreTransaction.java b/deegree-datastores/deegree-featurestores/deegree-featurestore-sql/src/main/java/org/deegree/feature/persistence/sql/SQLFeatureStoreTransaction.java index f25ed747d8..818a515f96 100644 --- a/deegree-datastores/deegree-featurestores/deegree-featurestore-sql/src/main/java/org/deegree/feature/persistence/sql/SQLFeatureStoreTransaction.java +++ b/deegree-datastores/deegree-featurestores/deegree-featurestore-sql/src/main/java/org/deegree/feature/persistence/sql/SQLFeatureStoreTransaction.java @@ -37,6 +37,7 @@ import static org.deegree.feature.Features.findFeaturesAndGeometries; import static org.deegree.feature.types.property.GeometryPropertyType.CoordinateDimension.DIM_2; +import static org.deegree.protocol.wfs.transaction.action.IDGenMode.USE_EXISTING; import java.io.ByteArrayOutputStream; import java.sql.Connection; @@ -1062,11 +1063,11 @@ public String performReplace( final Feature replacement, final Filter filter, fi } final GenericFeatureCollection col = new GenericFeatureCollection(); col.add( replacement ); - final List ids = performInsert( col, idGenMode ); + final List ids = performInsert( col, USE_EXISTING ); if ( ids.isEmpty() || ids.size() > 1 ) { throw new FeatureStoreException( "Unable to determine new feature id." ); } return ids.get( 0 ); } -} +} \ No newline at end of file diff --git a/deegree-datastores/deegree-featurestores/deegree-featurestore-sql/src/main/java/org/deegree/feature/persistence/sql/insert/FeatureRow.java b/deegree-datastores/deegree-featurestores/deegree-featurestore-sql/src/main/java/org/deegree/feature/persistence/sql/insert/FeatureRow.java index 696dcb0602..3e03e67376 100644 --- a/deegree-datastores/deegree-featurestores/deegree-featurestore-sql/src/main/java/org/deegree/feature/persistence/sql/insert/FeatureRow.java +++ b/deegree-datastores/deegree-featurestores/deegree-featurestore-sql/src/main/java/org/deegree/feature/persistence/sql/insert/FeatureRow.java @@ -44,6 +44,9 @@ import org.deegree.commons.jdbc.SQLIdentifier; import org.deegree.commons.tom.primitive.BaseType; +import org.deegree.commons.tom.primitive.PrimitiveType; +import org.deegree.commons.tom.primitive.PrimitiveValue; +import org.deegree.commons.tom.sql.PrimitiveParticleConverter; import org.deegree.commons.utils.Pair; import org.deegree.feature.Feature; import org.deegree.feature.persistence.FeatureStoreException; @@ -199,9 +202,13 @@ private void preInsertUseExisting( FeatureTypeMapping ftMapping ) } for ( int i = 0; i < fidMapping.getColumns().size(); i++ ) { Pair idColumn = fidMapping.getColumns().get( i ); - // TODO mapping to non-string columns Object value = idKernels[i]; - addPreparedArgument( idColumn.getFirst(), value ); + BaseType baseType = idColumn.second != null ? idColumn.second : BaseType.STRING; + PrimitiveType type = new PrimitiveType( baseType ); + PrimitiveValue primitiveValue = new PrimitiveValue( value, type ); + PrimitiveParticleConverter primitiveConverter = mgr.getDialect().getPrimitiveConverter( idColumn.first.getName(), + type ); + addPreparedArgument( idColumn.getFirst(), primitiveValue, primitiveConverter ); } } From 455df25e812eb1a8dbd281d3bca8b7b5a830de15 Mon Sep 17 00:00:00 2001 From: Dirk Stenger Date: Tue, 14 Jun 2016 13:47:14 +0200 Subject: [PATCH 2/3] Extended the handbook to describe the behaviour when a feature is replaced via transaction --- .../src/main/sphinx/webservices.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/deegree-services/deegree-webservices-handbook/src/main/sphinx/webservices.rst b/deegree-services/deegree-webservices-handbook/src/main/sphinx/webservices.rst index a0e31627db..d73fb705dc 100644 --- a/deegree-services/deegree-webservices-handbook/src/main/sphinx/webservices.rst +++ b/deegree-services/deegree-webservices-handbook/src/main/sphinx/webservices.rst @@ -130,6 +130,9 @@ By default, WFS-T requests will be rejected. Setting the ``EnableTransactions`` .. hint:: In a WFS 1.1.0 insert, the id generation mode can be overridden by attribute *idGenMode* of the ``Insert`` element. WFS 1.0.0 and WFS 2.0.0 don't support to specify the id generation mode on a request basis. +.. hint:: + When a feature is replaced the ``UseExisting`` option is always activated for that transaction. The gml:id of the feature is used for the new version of the feature. The filter is used to identify the feature to be replaced. + ^^^^^^^^^^^^^^^^^^ SupportedRequests ^^^^^^^^^^^^^^^^^^ From a0a0897cb5589baadf6c8da6e3fc9b3b6b34c36e Mon Sep 17 00:00:00 2001 From: Dirk Stenger Date: Wed, 15 Jun 2016 10:24:21 +0200 Subject: [PATCH 3/3] Extended replace of MemoryFeatureStoreTransaction to always use idGenMode USE_EXISTING --- .../persistence/memory/MemoryFeatureStoreTransaction.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deegree-datastores/deegree-featurestores/deegree-featurestore-memory/src/main/java/org/deegree/feature/persistence/memory/MemoryFeatureStoreTransaction.java b/deegree-datastores/deegree-featurestores/deegree-featurestore-memory/src/main/java/org/deegree/feature/persistence/memory/MemoryFeatureStoreTransaction.java index d6ec55c7f3..3d7d726595 100644 --- a/deegree-datastores/deegree-featurestores/deegree-featurestore-memory/src/main/java/org/deegree/feature/persistence/memory/MemoryFeatureStoreTransaction.java +++ b/deegree-datastores/deegree-featurestores/deegree-featurestore-memory/src/main/java/org/deegree/feature/persistence/memory/MemoryFeatureStoreTransaction.java @@ -36,6 +36,7 @@ package org.deegree.feature.persistence.memory; import static org.deegree.feature.i18n.Messages.getMessage; +import static org.deegree.protocol.wfs.transaction.action.IDGenMode.USE_EXISTING; import java.util.ArrayList; import java.util.List; @@ -569,7 +570,7 @@ public String performReplace( Feature replacement, Filter filter, Lock lock, IDG } GenericFeatureCollection col = new GenericFeatureCollection(); col.add( replacement ); - List ids = performInsert( col, idGenMode ); + List ids = performInsert( col, USE_EXISTING ); if ( ids.isEmpty() || ids.size() > 1 ) { throw new FeatureStoreException( "Unable to determine new feature id." ); }