package be.bagofwords.db; import be.bagofwords.iterator.CloseableIterator; import be.bagofwords.util.KeyValue; import java.util.Iterator; public abstract class LayeredDataInterface<T> extends DataInterface<T> { protected DataInterface<T> baseInterface; public LayeredDataInterface(DataInterface<T> baseInterface) { super(baseInterface.getName(), baseInterface.getObjectClass(), baseInterface.getCombinator(), baseInterface.isTemporaryDataInterface()); this.baseInterface = baseInterface; } @Override public T read(long key) { return baseInterface.read(key); } @Override public void write(long key, T value) { baseInterface.write(key, value); } @Override public CloseableIterator<KeyValue<T>> iterator() { return baseInterface.iterator(); } @Override public void dropAllData() { baseInterface.dropAllData(); } @Override public void flush() { baseInterface.flush(); } @Override public void optimizeForReading() { flush(); baseInterface.optimizeForReading(); } @Override public DataInterface getCoreDataInterface() { return baseInterface.getCoreDataInterface(); } @Override public long apprSize() { return baseInterface.apprSize(); } public void write(Iterator<KeyValue<T>> entries) { baseInterface.write(entries); } public CloseableIterator<KeyValue<T>> iterator(final Iterator<Long> keyIterator) { return baseInterface.iterator(keyIterator); } public CloseableIterator<Long> keyIterator() { return baseInterface.keyIterator(); } public CloseableIterator<T> valueIterator() { return baseInterface.valueIterator(); } public boolean mightContain(long key) { return baseInterface.mightContain(key); } protected final void doClose() { try { doCloseImpl(); } finally { //even if the doCloseImpl() method failed, we still try to close the base interface baseInterface.close(); } } @Override protected void requestClose() { super.requestClose(); baseInterface.requestClose(); } @Override public CloseableIterator<KeyValue<T>> cachedValueIterator() { return baseInterface.cachedValueIterator(); } protected abstract void doCloseImpl(); }