diff --git a/deegree-datastores/deegree-featurestores/deegree-featurestore-commons/src/main/java/org/deegree/feature/persistence/FeatureStoreTransaction.java b/deegree-datastores/deegree-featurestores/deegree-featurestore-commons/src/main/java/org/deegree/feature/persistence/FeatureStoreTransaction.java index 407b4493aea..83315dec403 100644 --- a/deegree-datastores/deegree-featurestores/deegree-featurestore-commons/src/main/java/org/deegree/feature/persistence/FeatureStoreTransaction.java +++ b/deegree-datastores/deegree-featurestores/deegree-featurestore-commons/src/main/java/org/deegree/feature/persistence/FeatureStoreTransaction.java @@ -138,7 +138,7 @@ public List performUpdate( QName ftName, List * @throws FeatureStoreException * if the replace fails */ - public String performReplace( Feature replacement, Filter filter, Lock lock, IDGenMode idGenMode ) + public List performReplace( Feature replacement, Filter filter, Lock lock, IDGenMode idGenMode ) throws FeatureStoreException; /** 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 3a9a08dc37e..67968b309ae 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 @@ -544,7 +544,7 @@ public List performUpdate( QName ftName, List } @Override - public String performReplace( Feature replacement, Filter filter, Lock lock, IDGenMode idGenMode ) + public List performReplace( Feature replacement, Filter filter, Lock lock, IDGenMode idGenMode ) throws FeatureStoreException { if ( filter instanceof IdFilter ) { performDelete( (IdFilter) filter, lock ); @@ -554,10 +554,10 @@ public String performReplace( Feature replacement, Filter filter, Lock lock, IDG GenericFeatureCollection col = new GenericFeatureCollection(); col.add( replacement ); List ids = performInsert( col, idGenMode ); - if ( ids.isEmpty() || ids.size() > 1 ) { + if ( ids.isEmpty()) { throw new FeatureStoreException( "Unable to determine new feature id." ); } - return ids.get( 0 ); + return ids; } @Override 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 5ef7cdf97cd..0f58013d755 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 @@ -70,6 +70,7 @@ import org.deegree.cs.coordinatesystems.ICRS; import org.deegree.feature.Feature; import org.deegree.feature.FeatureCollection; +import org.deegree.feature.GenericFeatureCollection; import org.deegree.feature.persistence.BBoxTracker; import org.deegree.feature.persistence.FeatureInspector; import org.deegree.feature.persistence.FeatureStore; @@ -995,9 +996,21 @@ private IdFilter getIdFilter( QName ftName, OperatorFilter filter ) } @Override - public String performReplace( Feature replacement, Filter filter, Lock lock, IDGenMode idGenMode ) + public List performReplace( final Feature replacement, final Filter filter, final Lock lock, + final IDGenMode idGenMode ) throws FeatureStoreException { - throw new FeatureStoreException( "Replace is not supported yet." ); + if ( filter instanceof IdFilter ) { + performDelete( (IdFilter) filter, lock ); + } else { + performDelete( replacement.getName(), (OperatorFilter) filter, lock ); + } + final GenericFeatureCollection col = new GenericFeatureCollection(); + col.add( replacement ); + final List ids = performInsert( col, idGenMode ); + if ( ids.isEmpty()) { + throw new FeatureStoreException( "Unable to determine new feature id." ); + } + return ids; } } diff --git a/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java b/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java index 6ac76fdc28b..8032dabe6cd 100644 --- a/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java +++ b/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java @@ -676,8 +676,10 @@ private void doReplace( Replace replace, Lock lock ) FeatureStoreTransaction ta = acquireTransaction( fs ); try { - String newFid = ta.performReplace( replacementFeature, filter, lock, idGenMode ); - replaced.add( newFid, replace.getHandle() ); + List newFids = ta.performReplace( replacementFeature, filter, lock, idGenMode ); + for (String newFid : newFids){ + replaced.add( newFid, replace.getHandle() ); + } } catch ( FeatureStoreException e ) { throw new OWSException( "Error performing replace: " + e.getMessage(), e, NO_APPLICABLE_CODE ); }