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