package com.sleepycat.je.log;
public abstract class FileReader {
protected ChecksumValidator cksumValidator;
private boolean doValidateChecksum;
private boolean alwaysValidateChecksum;
/**
* Whether to always validate the checksum, even for non-target entries.
*/
public void setAlwaysValidateChecksum( boolean validate){
alwaysValidateChecksum=validate;
}
/**
* Reset the checksum and add the header bytes. This method must be called
* with the entry header data at the buffer mark.
*/
private void startChecksum( ByteBuffer dataBuffer) throws DatabaseException {
cksumValidator.reset();
int entryStart=threadSafeBufferPosition(dataBuffer);
dataBuffer.reset();
cksumValidator.update(env,dataBuffer,LogManager.HEADER_CONTENT_BYTES(),anticipateChecksumErrors);
threadSafeBufferPosition(dataBuffer,entryStart);
}
/**
* Add the entry bytes to the checksum and check the value. This method must
* be called with the buffer positioned at the start of the entry.
*/
private void validateChecksum( ByteBuffer entryBuffer) throws DatabaseException {
cksumValidator.update(env,entryBuffer,currentEntrySize,anticipateChecksumErrors);
cksumValidator.validate(env,currentEntryChecksum,readBufferFileNum,currentEntryOffset,anticipateChecksumErrors);
}
protected void hook472() throws IOException, DatabaseException {
if (doValidateChecksum) {
cksumValidator=new ChecksumValidator();
}
original();
}
protected void hook473( EnvironmentImpl env) throws IOException, DatabaseException {
this.doValidateChecksum=env.getLogManager().getChecksumOnRead();
original(env);
}
@MethodObject static class FileReader_readNextEntry {
protected void hook474() throws DatabaseException, IOException, EOFException {
if (doValidate) {
_this.validateChecksum(dataBuffer);
}
original();
}
protected void hook475() throws DatabaseException, IOException, EOFException {
collectData|=doValidate;
if (doValidate) {
_this.startChecksum(dataBuffer);
}
original();
}
protected void hook476() throws DatabaseException, IOException, EOFException {
doValidate=_this.doValidateChecksum && (isTargetEntry || _this.alwaysValidateChecksum);
original();
}
}
}