package org.geotools.data.memory;
import org.geotools.data.DataTestCase;
import org.geotools.data.FeatureReader;
import org.geotools.data.Query;
import org.geotools.data.Transaction;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
/**
* Concurrency test from GEOT-2515.
*
* @author Frank Gasdorf
*/
public class MemoryDataStoreConcurrencyTest extends DataTestCase {
public MemoryDataStoreConcurrencyTest(String name) {
super(name);
}
public void testConcurrencyReadsAndWrite() throws Exception {
final MemoryDataStore dataStore = new MemoryDataStore();
dataStore.createSchema(roadType);
// start thread to write each second a feature
Runnable writeSomeFeatures = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
if (Thread.interrupted())
break;
SimpleFeature feature = SimpleFeatureBuilder
.build(roadType,
new Object[] { new Integer(i),
line(new int[] { 10, 10, 20, 10 }), "r" + i },
"road.rd" + i);
dataStore.addFeature(feature);
}
}
};
Thread writeThread = new Thread(writeSomeFeatures);
writeThread.start();
try {
// start some reads from FeatureSource
for (int i = 0; i < 10; i++) {
// just run through the features
assertTrue(dataStore != null);
Query query = new Query(roadType.getTypeName());
FeatureReader<SimpleFeatureType, SimpleFeature> featureReader = dataStore
.getFeatureReader(query,Transaction.AUTO_COMMIT);
assertTrue(featureReader != null);
while (featureReader.hasNext()) {
featureReader.next();
}
}
} catch (Exception e) {
throw e;
} finally {
writeThread.interrupt();
writeThread.join();
}
}
}