package mil.nga.giat.geowave.core.ingest.kafka;
import java.io.Closeable;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import mil.nga.giat.geowave.core.index.ByteArrayId;
import mil.nga.giat.geowave.core.ingest.GeoWaveData;
import mil.nga.giat.geowave.core.store.DataStore;
import mil.nga.giat.geowave.core.store.IndexWriter;
import mil.nga.giat.geowave.core.store.adapter.AdapterStore;
import mil.nga.giat.geowave.core.store.adapter.DataAdapter;
import mil.nga.giat.geowave.core.store.adapter.WritableDataAdapter;
import mil.nga.giat.geowave.core.store.adapter.exceptions.MismatchedIndexToAdapterMapping;
import mil.nga.giat.geowave.core.store.index.PrimaryIndex;
import mil.nga.giat.geowave.core.store.memory.MemoryAdapterStore;
/**
* A class to hold intermediate run data that must be used throughout the life
* of an ingest process.
*/
public class KafkaIngestRunData implements
Closeable
{
private final Map<ByteArrayId, IndexWriter> adapterIdToWriterCache = new HashMap<ByteArrayId, IndexWriter>();
private final AdapterStore adapterCache;
private final DataStore dataStore;
public KafkaIngestRunData(
final List<WritableDataAdapter<?>> adapters,
final DataStore dataStore ) {
this.dataStore = dataStore;
adapterCache = new MemoryAdapterStore(
adapters.toArray(new WritableDataAdapter[adapters.size()]));
}
public WritableDataAdapter<?> getDataAdapter(
final GeoWaveData<?> data ) {
return data.getAdapter(adapterCache);
}
public synchronized IndexWriter getIndexWriter(
final DataAdapter<?> adapter,
final PrimaryIndex... requiredIndices )
throws MismatchedIndexToAdapterMapping {
IndexWriter indexWriter = adapterIdToWriterCache.get(adapter.getAdapterId());
if (indexWriter == null) {
indexWriter = dataStore.createWriter(
adapter,
requiredIndices);
adapterIdToWriterCache.put(
adapter.getAdapterId(),
indexWriter);
}
return indexWriter;
}
@Override
public void close()
throws IOException {
synchronized (this) {
for (final IndexWriter indexWriter : adapterIdToWriterCache.values()) {
indexWriter.close();
}
adapterIdToWriterCache.clear();
}
}
public void flush() {
synchronized (this) {
for (final IndexWriter indexWriter : adapterIdToWriterCache.values()) {
indexWriter.flush();
}
}
}
}