/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, 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.geotools.arcsde.data;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.Serializable;
import java.util.Map;
import org.geotools.arcsde.ArcSdeException;
import org.geotools.arcsde.session.ISession;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.DataUtilities;
import org.geotools.data.DefaultTransaction;
import org.geotools.data.Query;
import org.geotools.data.Transaction;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.data.simple.SimpleFeatureStore;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import com.esri.sde.sdk.client.SeException;
import com.esri.sde.sdk.client.SeTable;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.io.WKTReader;
/**
* Functional tests for {@link ArcSdeFeatureStore} when working with versioned tables
*
* @author Gabriel Roldan
*
*
* @source $URL$
* http://svn.geotools.org/geotools/trunk/gt/modules/plugin/arcsde/da/src/test/java/org
* /geotools/arcsde/data/ArcSDEFeatureStoreTest.java $
* @version $Id$
*/
public class ArcSDEFeatureStoreVersionedTest {
private TestData testData;
/**
* Qualified name of the versioned table used for tests
*/
private String tableName;
/**
* loads {@code test-data/testparams.properties} into a Properties object, wich is used to
* obtain test tables names and is used as parameter to find the DataStore
*/
@Before
public void setUp() throws Exception {
testData = new TestData();
testData.setUp();
{
ISession session = testData.getConnectionPool().getSession();
try {
SeTable versionedTable = testData.createVersionedTable(session);
tableName = versionedTable.getQualifiedName();
} finally {
session.dispose();
}
}
}
@After
public void tearDown() throws Exception {
testData.tearDown(false, true);
}
@Test
public void testEditVersionedTableAutoCommit() throws Exception {
final ArcSDEDataStore dataStore = testData.getDataStore();
final SimpleFeatureSource source;
final SimpleFeatureStore store;
source = dataStore.getFeatureSource(tableName);
store = (SimpleFeatureStore) dataStore.getFeatureSource(tableName);
ArcSdeResourceInfo info = (ArcSdeResourceInfo) store.getInfo();
assertTrue(info.isVersioned());
final SimpleFeatureType schema = store.getSchema();
assertNull(schema.getDescriptor("ROW_ID"));
final int initialCount = store.getCount(Query.ALL);
assertEquals(0, initialCount);
final WKTReader reader = new WKTReader();
Object[] content = new Object[2];
SimpleFeature feature;
SimpleFeatureCollection collection;
int count;
content[0] = "Feature name 1";
content[1] = reader.read("POINT (0 0)");
feature = SimpleFeatureBuilder.build(schema, content, (String) null);
collection = DataUtilities.collection(feature);
store.addFeatures(collection);
count = store.getCount(Query.ALL);
assertEquals(1, count);
content[0] = "Feature name 2";
content[1] = reader.read("POINT (1 1)");
feature = SimpleFeatureBuilder.build(schema, content, (String) null);
collection = DataUtilities.collection(feature);
store.addFeatures(collection);
count = store.getCount(Query.ALL);
assertEquals(2, count);
assertEquals(2, source.getCount(Query.ALL));
}
@Test
public void testEditVersionedTableTransaction() throws Exception {
try {
final String tableName;
{
ISession session = testData.getConnectionPool().getSession();
try {
SeTable versionedTable = testData.createVersionedTable(session);
tableName = versionedTable.getQualifiedName();
} finally {
session.dispose();
}
}
final ArcSDEDataStore dataStore = testData.getDataStore();
final SimpleFeatureSource source;
final SimpleFeatureStore store;
source = dataStore.getFeatureSource(tableName);
store = (SimpleFeatureStore) dataStore.getFeatureSource(tableName);
Transaction transaction = new DefaultTransaction();
store.setTransaction(transaction);
ArcSdeResourceInfo info = (ArcSdeResourceInfo) store.getInfo();
assertTrue(info.isVersioned());
final SimpleFeatureType schema = store.getSchema();
final int initialCount = store.getCount(Query.ALL);
assertEquals(0, initialCount);
final WKTReader reader = new WKTReader();
Object[] content = new Object[2];
SimpleFeature feature;
SimpleFeatureCollection collection;
int count;
content[0] = "Feature name 1";
content[1] = reader.read("POINT (10 10)");
feature = SimpleFeatureBuilder.build(schema, content, (String) null);
collection = DataUtilities.collection(feature);
store.addFeatures(collection);
count = store.getCount(Query.ALL);
assertEquals(1, count);
assertEquals(0, source.getCount(Query.ALL));
{
SimpleFeatureIterator features = store.getFeatures().features();
SimpleFeature f = features.next();
features.close();
Object obj = f.getDefaultGeometry();
assertTrue(obj instanceof Point);
Point p = (Point) obj;
double x = p.getX();
double y = p.getY();
assertEquals(10D, x, 1E-5);
assertEquals(10D, y, 1E-5);
}
transaction.commit();
assertEquals(1, source.getCount(Query.ALL));
content[0] = "Feature name 2";
content[1] = reader.read("POINT (2 2)");
feature = SimpleFeatureBuilder.build(schema, content, (String) null);
collection = DataUtilities.collection(feature);
store.addFeatures(collection);
count = store.getCount(Query.ALL);
assertEquals(2, count);
assertEquals(1, source.getCount(Query.ALL));
transaction.rollback();
assertEquals(1, store.getCount(Query.ALL));
transaction.close();
{
SimpleFeatureIterator features = source.getFeatures().features();
SimpleFeature f = features.next();
features.close();
Object obj = f.getDefaultGeometry();
assertTrue(obj instanceof Point);
Point p = (Point) obj;
double x = p.getX();
double y = p.getY();
assertEquals(10D, x, 1E-5);
assertEquals(10D, y, 1E-5);
}
} catch (SeException e) {
throw new ArcSdeException(e);
}
}
@Test
public void testEditVersionedTableTransactionConcurrently() throws Exception {
Map<String, Serializable> conProps = testData.getConProps();
final ArcSDEDataStore dataStore1 = (ArcSDEDataStore) DataStoreFinder.getDataStore(conProps);
final ArcSDEDataStore dataStore2 = (ArcSDEDataStore) DataStoreFinder.getDataStore(conProps);
assertNotSame(dataStore1, dataStore2);
assertNotSame(dataStore1.connectionPool, dataStore2.connectionPool);
final SimpleFeatureStore store1, store2;
store1 = (SimpleFeatureStore) dataStore1.getFeatureSource(tableName);
store2 = (SimpleFeatureStore) dataStore2.getFeatureSource(tableName);
Transaction transaction1 = new DefaultTransaction();
store1.setTransaction(transaction1);
Transaction transaction2 = new DefaultTransaction();
store2.setTransaction(transaction2);
final SimpleFeatureType schema = store1.getSchema();
final int initialCount = store1.getCount(Query.ALL);
assertEquals(0, initialCount);
final WKTReader reader = new WKTReader();
Object[] content = new Object[2];
SimpleFeature feature;
SimpleFeatureCollection collection;
// add a feature to store1
content[0] = "Feature name 1";
content[1] = reader.read("POINT (10 10)");
feature = SimpleFeatureBuilder.build(schema, content, (String) null);
collection = DataUtilities.collection(feature);
store1.addFeatures(collection);
// transaction not committed, store1 expects a count of 1, store2 still 0
assertEquals(1, store1.getCount(Query.ALL));
assertEquals(0, store2.getCount(Query.ALL));
// add a feature to store2
content[0] = "Feature name 2";
content[1] = reader.read("POINT (20 20)");
feature = SimpleFeatureBuilder.build(schema, content, (String) null);
collection = DataUtilities.collection(feature);
store2.addFeatures(collection);
// neither transaction committed, both stores expect a count of 1
assertEquals(1, store1.getCount(Query.ALL));
assertEquals(1, store2.getCount(Query.ALL));
// commit t1, store1 still counts 1, store2 counts 2
transaction1.commit();
assertEquals(1, store1.getCount(Query.ALL));
// /assertEquals(2, store2.getCount(Query.ALL));
assertEquals(1, store2.getCount(Query.ALL));
// commit t2, overrides the state commited by t1
transaction2.commit();
assertEquals(1, store1.getCount(Query.ALL));
assertEquals(1, store2.getCount(Query.ALL));
}
}