public void testTransactionMultithreadAccess() throws Exception {
testData.insertTestData();
// start with an empty table
final String typeName = testData.getTempTableName();
final int featureCount = 2;
final SimpleFeatureCollection testFeatures = testData.createTestFeatures(LineString.class,
featureCount);
final DataStore ds = testData.getDataStore();
final SimpleFeatureStore fStore = (SimpleFeatureStore) ds.getFeatureSource(typeName);
final Transaction transaction = new DefaultTransaction("testTransactionMultithreadAccess");
fStore.setTransaction(transaction);
final boolean[] done = { false, false };
final Throwable[] errors = new Throwable[2];
Runnable worker1 = new Runnable() {
public void run() {
try {
System.err.println("adding..");
List<FeatureId> addedFids = fStore.addFeatures(testFeatures);
System.err.println("got " + addedFids);
final FilterFactory ff = CommonFactoryFinder.getFilterFactory(null);
final Set<FeatureId> fids = new HashSet<FeatureId>();
for (FeatureId fid : addedFids) {
fids.add(fid);
}
final Id newFidsFilter = ff.id(fids);
System.err.println("querying..");
SimpleFeatureCollection features = fStore.getFeatures(newFidsFilter);
System.err.println("querying returned...");
int size = features.size();
System.err.println("Collection Size: " + size);
assertEquals(2, size);
System.err.println("commiting...");
transaction.commit();
System.err.println("commited.");
size = fStore.getCount(new Query(typeName, newFidsFilter));
System.err.println("Size: " + size);
assertEquals(2, size);
} catch (Throwable e) {
errors[0] = e;
try {
System.err.println("rolling back!.");
transaction.rollback();
} catch (IOException e1) {
e1.printStackTrace();
}
} finally {
done[0] = true;
}
}
};
Runnable worker2 = new Runnable() {
public void run() {
try {
System.err.println("worker2 calling getFeartures()");
SimpleFeatureCollection collection = fStore.getFeatures();
System.err.println("worker2 opening iterator...");
SimpleFeatureIterator features = collection.features();
try {
System.err.println("worker2 iterating...");
while (features.hasNext()) {
SimpleFeature next = features.next();
System.out.println("**Got feature " + next.getID());