/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2011, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geoserver.data.geogit;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.geogit.api.GeoGIT;
import org.geogit.test.RepositoryTestCase;
import org.geotools.data.DataUtilities;
import org.geotools.data.DefaultTransaction;
import org.geotools.data.Transaction;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.factory.Hints;
import org.geotools.feature.FeatureCollection;
import org.opengis.feature.Feature;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.filter.FilterFactory2;
import org.opengis.filter.Id;
import org.opengis.filter.identity.FeatureId;
import org.opengis.filter.identity.ResourceId;
public class GeoGitFeatureStoreTest extends RepositoryTestCase {
private static final FilterFactory2 ff = CommonFactoryFinder
.getFilterFactory2(null);
private GeoGitDataStore dataStore;
private GeoGitFeatureStore points;
private GeoGitFeatureStore lines;
@Override
protected void setUpInternal() throws Exception {
dataStore = new GeoGitDataStore(repo);
dataStore.createSchema(super.pointsType);
dataStore.createSchema(super.linesType);
points = (GeoGitFeatureStore) dataStore
.getFeatureSource(pointsTypeName);
lines = (GeoGitFeatureStore) dataStore.getFeatureSource(linesTypeName);
}
public void testAddFeatures() throws Exception {
FeatureCollection<SimpleFeatureType, SimpleFeature> collection;
collection = DataUtilities.collection(Arrays.asList(
(SimpleFeature) points1, (SimpleFeature) points2,
(SimpleFeature) points3));
try {
points.addFeatures(collection);
fail("Expected UnsupportedOperationException on AUTO_COMMIT");
} catch (UnsupportedOperationException e) {
assertTrue(e.getMessage().contains("AUTO_COMMIT"));
}
final Set<String> insertedFids = new HashSet<String>(Arrays.asList(
idP1, idP2, idP3));
Transaction tx = new DefaultTransaction();
points.setTransaction(tx);
assertSame(tx, points.getTransaction());
try {
List<FeatureId> addedFeatures = points.addFeatures(collection);
assertNotNull(addedFeatures);
assertEquals(3, addedFeatures.size());
for (FeatureId id : addedFeatures) {
assertFalse(id instanceof ResourceId);
assertNotNull(id.getFeatureVersion());
}
// assert transaction isolation
assertEquals(3, points.getFeatures().size());
assertEquals(0, dataStore.getFeatureSource(pointsTypeName)
.getFeatures().size());
tx.commit();
assertEquals(3, dataStore.getFeatureSource(pointsTypeName)
.getFeatures().size());
} catch (Exception e) {
tx.rollback();
throw e;
} finally {
tx.close();
}
}
public void testUseProvidedFIDSupported() throws Exception {
assertTrue(points.getQueryCapabilities().isUseProvidedFIDSupported());
FeatureCollection<SimpleFeatureType, SimpleFeature> collection;
collection = DataUtilities.collection(Arrays.asList(
(SimpleFeature) points1, (SimpleFeature) points2,
(SimpleFeature) points3));
Transaction tx = new DefaultTransaction();
points.setTransaction(tx);
try {
List<FeatureId> newFids = points.addFeatures(collection);
assertNotNull(newFids);
assertEquals(3, newFids.size());
FeatureId fid1 = newFids.get(0);
FeatureId fid2 = newFids.get(1);
FeatureId fid3 = newFids.get(2);
// new ids should have been generated...
assertFalse(idP1.equals(fid1.getID()));
assertFalse(idP1.equals(fid1.getID()));
assertFalse(idP1.equals(fid1.getID()));
// now force the use of provided feature ids
points1.getUserData().put(Hints.USE_PROVIDED_FID, Boolean.TRUE);
points2.getUserData().put(Hints.USE_PROVIDED_FID, Boolean.TRUE);
points3.getUserData().put(Hints.USE_PROVIDED_FID, Boolean.TRUE);
List<FeatureId> providedFids = points.addFeatures(collection);
assertNotNull(providedFids);
assertEquals(3, providedFids.size());
FeatureId fid11 = providedFids.get(0);
FeatureId fid21 = providedFids.get(1);
FeatureId fid31 = providedFids.get(2);
// ids should match provided
assertEquals(idP1, fid11.getID());
assertEquals(idP2, fid21.getID());
assertEquals(idP3, fid31.getID());
tx.commit();
assertEquals(1,
points.getFeatures(ff.id(Collections.singleton(fid1)))
.size());
assertEquals(1,
points.getFeatures(ff.id(Collections.singleton(fid2)))
.size());
assertEquals(1,
points.getFeatures(ff.id(Collections.singleton(fid3)))
.size());
assertEquals(1,
points.getFeatures(ff.id(Collections.singleton(fid11)))
.size());
assertEquals(1,
points.getFeatures(ff.id(Collections.singleton(fid21)))
.size());
assertEquals(1,
points.getFeatures(ff.id(Collections.singleton(fid31)))
.size());
} catch (Exception e) {
tx.rollback();
throw e;
} finally {
tx.close();
}
}
@SuppressWarnings("deprecation")
public void testModifyFeatures() throws Exception {
// add features circunventing FeatureStore.addFeatures to keep the test
// independent of the
// addFeatures functionality
insertAndAdd(lines1, lines2, lines3, points1, points2, points3);
new GeoGIT(repo).commit().call();
Id filter = ff.id(Collections.singleton(ff.featureId(idP1)));
Transaction tx = new DefaultTransaction();
points.setTransaction(tx);
try {
// initial value
assertEquals("StringProp1_1", points.getFeatures(filter).iterator()
.next().getAttribute("sp"));
// modify
points.modifyFeatures("sp", "modified", filter);
// modified value before commit
assertEquals("modified", points.getFeatures(filter).iterator()
.next().getAttribute("sp"));
// unmodified value before commit on another store instance (tx
// isolation)
assertEquals(
"StringProp1_1",
dataStore.getFeatureSource(pointsTypeName)
.getFeatures(filter).iterator().next()
.getAttribute("sp"));
tx.commit();
// modified value after commit on another store instance
assertEquals("modified", dataStore.getFeatureSource(pointsTypeName)
.getFeatures(filter).iterator().next().getAttribute("sp"));
} catch (Exception e) {
tx.rollback();
throw e;
} finally {
tx.close();
}
SimpleFeature modified = points.getFeatures(filter).iterator().next();
assertEquals("modified", modified.getAttribute("sp"));
}
private void setUseProvidedFidHint(boolean useProvidedFid,
Feature... features) {
for (Feature f : features) {
f.getUserData().put(Hints.USE_PROVIDED_FID,
Boolean.valueOf(useProvidedFid));
}
}
public void testRemoveFeatures() throws Exception {
// add features circunventing FeatureStore.addFeatures to keep the test
// independent of the
// addFeatures functionality
insertAndAdd(lines1, lines2, lines3, points1, points2, points3);
new GeoGIT(repo).commit().call();
Id filter = ff.id(Collections.singleton(ff.featureId(idP1)));
Transaction tx = new DefaultTransaction();
points.setTransaction(tx);
try {
// initial # of features
assertEquals(3, points.getFeatures().size());
// remove feature
points.removeFeatures(filter);
// #of features before commit on the same store
assertEquals(2, points.getFeatures().size());
// #of features before commit on a different store instance
assertEquals(3, dataStore.getFeatureSource(pointsTypeName)
.getFeatures().size());
tx.commit();
// #of features after commit on a different store instance
assertEquals(2, dataStore.getFeatureSource(pointsTypeName)
.getFeatures().size());
} catch (Exception e) {
tx.rollback();
throw e;
} finally {
tx.close();
}
assertEquals(2, points.getFeatures().size());
assertEquals(0, points.getFeatures(filter).size());
}
}