package mil.nga.giat.geowave.core.store.memory;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import mil.nga.giat.geowave.core.index.ByteArrayId;
import mil.nga.giat.geowave.core.index.PersistenceUtils;
import mil.nga.giat.geowave.core.store.CloseableIterator;
import mil.nga.giat.geowave.core.store.adapter.AdapterStore;
import mil.nga.giat.geowave.core.store.adapter.DataAdapter;
/**
* This is a simple HashMap based in-memory implementation of the AdapterStore
* and can be useful if it is undesirable to persist and query objects within
* another storage mechanism such as an Accumulo table.
*/
public class MemoryAdapterStore implements
AdapterStore,
Serializable
{
/**
*
*/
private static final long serialVersionUID = 1L;
private Map<ByteArrayId, DataAdapter<?>> adapterMap;
public MemoryAdapterStore() {
adapterMap = Collections.synchronizedMap(new HashMap<ByteArrayId, DataAdapter<?>>());
}
public MemoryAdapterStore(
final DataAdapter<?>[] adapters ) {
adapterMap = Collections.synchronizedMap(new HashMap<ByteArrayId, DataAdapter<?>>());
for (final DataAdapter<?> adapter : adapters) {
adapterMap.put(
adapter.getAdapterId(),
adapter);
}
}
@Override
public void addAdapter(
final DataAdapter<?> adapter ) {
adapterMap.put(
adapter.getAdapterId(),
adapter);
}
@Override
public DataAdapter<?> getAdapter(
final ByteArrayId adapterId ) {
return adapterMap.get(adapterId);
}
@Override
public boolean adapterExists(
final ByteArrayId adapterId ) {
return adapterMap.containsKey(adapterId);
}
@Override
public CloseableIterator<DataAdapter<?>> getAdapters() {
return new CloseableIterator.Wrapper<DataAdapter<?>>(
new ArrayList<DataAdapter<?>>(
adapterMap.values()).iterator());
}
@Override
public void removeAll() {
adapterMap.clear();
}
private void writeObject(
final java.io.ObjectOutputStream out )
throws IOException {
final int count = adapterMap.size();
out.writeInt(count);
for (final Map.Entry<ByteArrayId, DataAdapter<?>> entry : adapterMap.entrySet()) {
out.writeObject(entry.getKey());
final byte[] val = PersistenceUtils.toBinary(entry.getValue());
out.writeObject(val);
}
}
private void readObject(
final java.io.ObjectInputStream in )
throws IOException,
ClassNotFoundException {
final int count = in.readInt();
adapterMap = Collections.synchronizedMap(new HashMap<ByteArrayId, DataAdapter<?>>());
for (int i = 0; i < count; i++) {
final ByteArrayId id = (ByteArrayId) in.readObject();
final byte[] data = (byte[]) in.readObject();
adapterMap.put(
id,
PersistenceUtils.fromBinary(
data,
DataAdapter.class));
}
}
}