/* 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.client;
import freenet.keys.FreenetURI;
import freenet.support.LogThresholdCallback;
import freenet.support.Logger;
import freenet.support.Logger.LogLevel;
import freenet.support.api.Bucket;
import freenet.support.io.MultiReaderBucket;
class RealArchiveStoreItem extends ArchiveStoreItem {
private final MultiReaderBucket mb;
private final Bucket bucket;
private final long spaceUsed;
private static volatile boolean logMINOR;
static {
Logger.registerLogThresholdCallback(new LogThresholdCallback(){
@Override
public void shouldUpdate(){
logMINOR = Logger.shouldLog(LogLevel.MINOR, this);
}
});
}
/**
* Create an ArchiveStoreElement from a TempStoreElement.
* @param key2 The key of the archive the file came from.
* @param realName The name of the file in that archive.
* @param temp The TempStoreElement currently storing the data.
* @param manager The parent ArchiveManager within which this item is stored.
*/
RealArchiveStoreItem(ArchiveStoreContext ctx, FreenetURI key2, String realName, Bucket bucket) {
super(new ArchiveKey(key2, realName), ctx);
if(bucket == null) throw new NullPointerException();
mb = new MultiReaderBucket(bucket);
this.bucket = mb.getReaderBucket();
if(this.bucket == null) throw new NullPointerException();
this.bucket.setReadOnly();
spaceUsed = this.bucket.size();
}
/**
* Return the data, as a Bucket, in plaintext.
*/
Bucket dataAsBucket() {
return bucket;
}
/**
* Return the length of the data.
*/
long dataSize() {
return bucket.size();
}
/**
* Return the estimated space used by the data.
*/
@Override
long spaceUsed() {
return spaceUsed;
}
@Override
void innerClose() {
if(logMINOR)
Logger.minor(this, "innerClose(): "+this+" : "+bucket);
if(bucket == null) {
// This still happens. It is clearly impossible as we check in the constructor and throw if it is null.
// Nonetheless there is little we can do here ...
Logger.error(this, "IMPOSSIBLE: BUCKET IS NULL!", new Exception("error"));
return;
}
bucket.free();
}
@Override
Bucket getDataOrThrow() throws ArchiveFailureException {
return dataAsBucket();
}
@Override
Bucket getReaderBucket() throws ArchiveFailureException {
return mb.getReaderBucket();
}
}