Hey Justin,

as I was updating the wfs2-v branch to work against geotools trunk's
ResourceId work, I would need to commit the attached patch to
GeoServer trunk in order to <see subject>.

We discussed this already while working on the wfs2-v branch, but
wanted to get confirmation it'd be ok to commit it to trunk,
especially because it implies a scan of the results on
TransactionUpdate to get the updated FeatureIds.

Cheers,
Gabriel

-- 
Gabriel Roldan
OpenGeo - http://opengeo.org
Expert service straight from the developers.
commit e35fbdc58827724afdc60e98bcaddd72ae4d5df5
Author: Gabriel Roldan <gabriel.rol...@gmail.com>
Date:   Wed Nov 9 15:40:31 2011 -0300

    fix assumtions about FeatureId.getID() being the full representational state of a feature identifier in transactions

diff --git a/wfs/src/main/java/org/geoserver/wfs/InsertElementHandler.java b/wfs/src/main/java/org/geoserver/wfs/InsertElementHandler.java
index 6e6a900..cb1a73f 100644
--- a/wfs/src/main/java/org/geoserver/wfs/InsertElementHandler.java
+++ b/wfs/src/main/java/org/geoserver/wfs/InsertElementHandler.java
@@ -193,10 +193,10 @@ public class InsertElementHandler extends AbstractTransactionElementHandler {
                 SimpleFeatureType schema = feature.getFeatureType();
 
                 // get the next fid
-                LinkedList fids = (LinkedList) schema2fids.get(schema.getTypeName());
-                String fid = ((FeatureId) fids.removeFirst()).getID();
+                LinkedList<FeatureId> fids = (LinkedList<FeatureId>) schema2fids.get(schema.getTypeName());
+                FeatureId fid = fids.removeFirst();
 
-                response.addInsertedFeature(insert.getHandle(), filterFactory.featureId(fid));
+                response.addInsertedFeature(insert.getHandle(), fid);
             }
 
             // update the insert counter
diff --git a/wfs/src/main/java/org/geoserver/wfs/UpdateElementHandler.java b/wfs/src/main/java/org/geoserver/wfs/UpdateElementHandler.java
index 788e93b..9165bf1 100644
--- a/wfs/src/main/java/org/geoserver/wfs/UpdateElementHandler.java
+++ b/wfs/src/main/java/org/geoserver/wfs/UpdateElementHandler.java
@@ -6,6 +6,7 @@ package org.geoserver.wfs;
 
 import java.io.IOException;
 import java.math.BigInteger;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -34,6 +35,7 @@ import org.geotools.data.DataUtilities;
 import org.geotools.data.FeatureLocking;
 import org.geotools.data.FeatureStore;
 import org.geotools.data.simple.SimpleFeatureCollection;
+import org.geotools.data.simple.SimpleFeatureIterator;
 import org.geotools.data.simple.SimpleFeatureLocking;
 import org.geotools.data.simple.SimpleFeatureStore;
 import org.geotools.factory.CommonFactoryFinder;
@@ -52,6 +54,7 @@ import org.opengis.filter.FilterFactory;
 import org.opengis.filter.FilterFactory2;
 import org.opengis.filter.Id;
 import org.opengis.filter.expression.PropertyName;
+import org.opengis.filter.identity.FeatureId;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.opengis.referencing.operation.MathTransform;
 
@@ -224,7 +227,7 @@ public class UpdateElementHandler extends AbstractTransactionElementHandler {
             // region
             // for validation
             //
-            Set fids = new HashSet();
+            Set<FeatureId> fids = new HashSet<FeatureId>();
             LOGGER.finer("Preprocess to remember modification as a set of fids");
             
             SimpleFeatureCollection features = store.getFeatures(filter);
@@ -239,7 +242,7 @@ public class UpdateElementHandler extends AbstractTransactionElementHandler {
             try {
                 while (preprocess.hasNext()) {
                     SimpleFeature feature = (SimpleFeature) preprocess.next();
-                    fids.add(feature.getID());
+                    fids.add(feature.getIdentifier());
                 }
             } catch (NoSuchElementException e) {
                 throw new WFSException(request, "Could not aquire FeatureIDs", e);
@@ -271,20 +274,35 @@ public class UpdateElementHandler extends AbstractTransactionElementHandler {
             if (!fids.isEmpty()) {
                 LOGGER.finer("Post process update for boundary update and featureValidation");
 
-                Set featureIds = new HashSet();
+                Set<FeatureId> featureIds = new HashSet<FeatureId>();
 
                 FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(GeoTools.getDefaultHints());
-                for (Iterator f = fids.iterator(); f.hasNext();) {
-                    featureIds.add(ff.featureId((String) f.next()));
+                for (Iterator<FeatureId> f = fids.iterator(); f.hasNext();) {
+                    // create new FeatureIds without any possible version information in order to
+                    // query for the latest version
+                    featureIds.add(ff.featureId(f.next().getID()));
                 }
 
                 Id modified = ff.id(featureIds);
 
-                response.addUpdatedFeatures(handle, featureIds);
-                
                 SimpleFeatureCollection changed = store.getFeatures(modified);
+                
+                // grab final ids. Not using fetureIds as they may contain different version
+                // information after the update
+                Set<FeatureId> changedIds = new HashSet<FeatureId>();
+                SimpleFeatureIterator iterator = changed.features();
+                try{
+                    while(iterator.hasNext()){
+                        changedIds.add(iterator.next().getIdentifier());
+                    }
+                }finally{
+                    iterator.close();
+                }
+                response.addUpdatedFeatures(handle, changedIds);
+
                 listener.dataStoreChange(new TransactionEvent(TransactionEventType.POST_UPDATE,
                         request, elementName, changed, update));
+                
             }
 
             // update the update counter
------------------------------------------------------------------------------
RSA(R) Conference 2012
Save $700 by Nov 18
Register now
http://p.sf.net/sfu/rsa-sfdev2dev1
_______________________________________________
Geoserver-devel mailing list
Geoserver-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-devel

Reply via email to