package org.dcache.pool.repository.meta.db; import com.sleepycat.bind.EntryBinding; import com.sleepycat.bind.serial.ClassCatalog; import com.sleepycat.bind.serial.SerialBinding; import com.sleepycat.collections.StoredMap; import com.sleepycat.je.DatabaseEntry; import com.sleepycat.je.DiskOrderedCursor; import com.sleepycat.je.OperationStatus; import java.util.stream.Collector; import diskCacheV111.vehicles.StorageInfo; /** * MetaDataRepositoryViews encapsulates creation of views into * MetaDataRepositoryDatabase. */ class ReplicaStoreView { private final ReplicaStoreDatabase db; private final StoredMap<String, StorageInfo> storageInfoMap; private final StoredMap<String, CacheRepositoryEntryState> stateMap; private final EntryBinding<String> keyBinding; private final EntryBinding<StorageInfo> storageInfoBinding; private final EntryBinding<CacheRepositoryEntryState> stateBinding; public ReplicaStoreView(ReplicaStoreDatabase db) { this.db = db; ClassCatalog catalog = db.getClassCatalog(); keyBinding = new SerialBinding<>(catalog, String.class); storageInfoBinding = new SerialBinding<>(catalog, StorageInfo.class); stateBinding = new SerialBinding<>(catalog, CacheRepositoryEntryState.class); storageInfoMap = new StoredMap<>(db.getStorageInfoDatabase(), keyBinding, storageInfoBinding, true); stateMap = new StoredMap<>(db.getStateDatabase(), keyBinding, stateBinding, true); } public final StoredMap<String, StorageInfo> getStorageInfoMap() { return storageInfoMap; } public final StoredMap<String, CacheRepositoryEntryState> getStateMap() { return stateMap; } public final <A,R> R collectKeys(Collector<String,A,R> collector) { A accumulator = collector.supplier().get(); DatabaseEntry key = new DatabaseEntry(); DatabaseEntry data = new DatabaseEntry(); try (DiskOrderedCursor cursor = db.openKeyCursor()) { while (cursor.getNext(key, data, null) == OperationStatus.SUCCESS) { collector.accumulator().accept(accumulator, keyBinding.entryToObject(key)); } } return collector.finisher().apply(accumulator); } }