/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.store;
import java.io.IOException;
import freenet.crypt.DSAPublicKey;
import freenet.keys.KeyVerifyException;
import freenet.node.stats.StoreAccessStats;
/**
* @author toad
*/
public abstract class StoreCallback<T extends StorableBlock> {
/** Length of a data block. Fixed for lifetime of the store. */
public abstract int dataLength();
/** Length of a header block. Fixed for the lifetime of the store. */
public abstract int headerLength();
/** Length of a routing key. Routing key is what we use to search for a block. Also fixed. */
public abstract int routingKeyLength();
/** Whether we should create a .keys file to keep full keys in in order to reconstruct. */
public abstract boolean storeFullKeys();
/** Whether we need the key in order to reconstruct a block. */
public abstract boolean constructNeedsKey();
/** Length of a full key. Full keys are stored in the .keys file. Also fixed. */
public abstract int fullKeyLength();
/** Can the same key be valid for two different StorableBlocks? */
public abstract boolean collisionPossible();
protected FreenetStore<T> store;
/** Called when first connecting to a FreenetStore. If the FreenetStore is a wrapper, it can be
* called more than once, but the last call will determine which store we use. */
public void setStore(FreenetStore<T> store) {
this.store = store;
}
public FreenetStore<T> getStore() {
return store;
}
// Reconstruction
/** Construct a StorableBlock from the data, headers, and optionally routing key or full key.
* IMPORTANT: Using the full key or routing key is OPTIONAL, and if we don't use them, WE DON'T
* CHECK THEM EITHER! Caller MUST check that the key is the one expected.
* @throws KeyVerifyException */
public abstract T construct(byte[] data, byte[] headers, byte[] routingKey, byte[] fullKey, boolean canReadClientCache, boolean canReadSlashdotCache, BlockMetadata meta, DSAPublicKey knownPubKey)
throws KeyVerifyException;
public void setMaxKeys(long maxStoreKeys, boolean shrinkNow) throws IOException {
store.setMaxKeys(maxStoreKeys, shrinkNow);
}
public long getMaxKeys() {
return store.getMaxKeys();
}
public long hits() {
return store.hits();
}
public long misses() {
return store.misses();
}
public long writes() {
return store.writes();
}
public long keyCount() {
return store.keyCount();
}
public long getBloomFalsePositive() {
return store.getBloomFalsePositive();
}
/** Generate a routing key from a full key */
public abstract byte[] routingKeyFromFullKey(byte[] keyBuf);
public StoreAccessStats getSessionAccessStats() {
return store.getSessionAccessStats();
}
/** Overall session access stats. We don't store the uptime in the datastore, so the
* caller will have to pass in its own estimate of total uptime.
* @return Null if not supported. */
public StoreAccessStats getTotalAccessStats() {
return store.getTotalAccessStats();
}
/** @return The total size in memory of a block with its key and routing key and data and headers. */
public int getTotalBlockSize() {
return dataLength() + headerLength() + fullKeyLength() + routingKeyLength();
}
}