package org.geoserver.gss; import static java.util.Collections.*; import static org.geotools.data.DataUtilities.*; import java.util.HashSet; import java.util.Set; import org.geotools.data.DefaultTransaction; import org.geotools.data.FeatureDiff; import org.geotools.data.FeatureDiffReader; import org.geotools.data.Transaction; import org.geotools.data.VersioningFeatureStore; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.filter.Id; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.io.WKTReader; public class MergingFeatureDiffReaderTest extends GSSTestSupport { public void testMergeSingle() throws Exception { // grab the datastore VersioningFeatureStore restricted = (VersioningFeatureStore) synchStore .getFeatureSource("restricted"); SimpleFeatureType schema = restricted.getSchema(); // an update Id updateFilter = ff.id(singleton(ff .featureId("restricted.be7cafea-d0b7-4257-9b9c-1ed3de3f7ef4"))); restricted.modifyFeatures(schema.getDescriptor("cat"), -48, updateFilter); // a delete Id removeFilter = ff.id(singleton(ff .featureId("restricted.d91fe390-bdc7-4b22-9316-2cd6c8737ef5"))); restricted.removeFeatures(removeFilter); // and an insert WKTReader wkt = new WKTReader(); SimpleFeature f = SimpleFeatureBuilder.build(schema, new Object[] { 123, wkt.read("POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))") }, null); restricted.addFeatures(collection(f)); // grab a diff reader FeatureDiffReader reader = restricted.getDifferences("FIRST", "LAST", null, null); FeatureDiffReader reader2 = restricted.getDifferences("FIRST", "LAST", null, null); // build a merging one, it should report the same resuls MergingFeatureDiffReader merge = new MergingFeatureDiffReader(reader2); int count = 0; Set<Integer> states = new HashSet<Integer>(); while (reader.hasNext()) { assertTrue(merge.hasNext()); FeatureDiff fd = reader.next(); FeatureDiff fdm = merge.next(); assertEquals(fd, fdm); count++; states.add(fd.getState()); } reader.close(); merge.close(); assertEquals(3, count); assertEquals(3, states.size()); } public void testDeleteReinsert() throws Exception { // grab the datastore VersioningFeatureStore restricted = (VersioningFeatureStore) synchStore .getFeatureSource("restricted"); SimpleFeatureType schema = restricted.getSchema(); // remove Id removeFilter = ff.id(singleton(ff .featureId("restricted.d91fe390-bdc7-4b22-9316-2cd6c8737ef5"))); Transaction t = new DefaultTransaction(); restricted.setTransaction(t); restricted.removeFeatures(removeFilter); String v1 = restricted.getVersion(); t.commit(); // revert String v2 = restricted.getVersion(); restricted.rollback("FIRST", null, null); t.commit(); t.close(); restricted.setTransaction(Transaction.AUTO_COMMIT); // grab the two readers, separate FeatureDiffReader r1 = restricted.getDifferences("FIRST", v1, null, null); FeatureDiffReader r2 = restricted.getDifferences(v1, v2, null, null); // build a merging one, it should report the same resuls MergingFeatureDiffReader merge = new MergingFeatureDiffReader(r1, r2); assertFalse(merge.hasNext()); merge.close(); } public void testMergeMulti() throws Exception { // grab the datastore VersioningFeatureStore restricted = (VersioningFeatureStore) synchStore .getFeatureSource("restricted"); SimpleFeatureType schema = restricted.getSchema(); // first update Id updateFilter = ff.id(singleton(ff .featureId("restricted.be7cafea-d0b7-4257-9b9c-1ed3de3f7ef4"))); Transaction t = new DefaultTransaction(); restricted.setTransaction(t); restricted.modifyFeatures(schema.getDescriptor("cat"), -48, updateFilter); String v1 = restricted.getVersion(); t.commit(); // second update WKTReader wkt = new WKTReader(); Geometry g = wkt.read("MULTIPOLYGON(((0 0, 0 10, 10 10, 10 0, 0 0)))"); restricted.modifyFeatures(schema.getDescriptor("the_geom"), g, updateFilter); String v2 = restricted.getVersion(); t.commit(); // clean up t.close(); restricted.setTransaction(Transaction.AUTO_COMMIT); // grab the two readers, separate FeatureDiffReader r1 = restricted.getDifferences("FIRST", v1, null, null); FeatureDiffReader r2 = restricted.getDifferences(v1, v2, null, null); // build a merging one, it should report the same resuls MergingFeatureDiffReader merge = new MergingFeatureDiffReader(r1, r2); assertTrue(merge.hasNext()); FeatureDiff fd = merge.next(); assertEquals(2, fd.getChangedAttributes().size()); assertEquals(-48l, fd.getFeature().getAttribute("cat")); assertTrue(g.equals((Geometry) fd.getFeature().getAttribute("the_geom"))); assertFalse(merge.hasNext()); merge.close(); } }