package freenet.support.io; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.IOException; import java.io.OutputStream; import java.io.Serializable; import freenet.client.async.ClientContext; import freenet.support.Logger; import freenet.support.api.RandomAccessBucket; public class PersistentTempFileBucket extends TempFileBucket implements Serializable { private static final long serialVersionUID = 1L; transient PersistentFileTracker tracker; private static volatile boolean logMINOR; static { Logger.registerClass(PersistentTempFileBucket.class); } public PersistentTempFileBucket(long id, FilenameGenerator generator, PersistentFileTracker tracker) { this(id, generator, tracker, true); } protected PersistentTempFileBucket(long id, FilenameGenerator generator, PersistentFileTracker tracker, boolean deleteOnFree) { super(id, generator, deleteOnFree); this.tracker = tracker; } protected PersistentTempFileBucket() { // For serialization. } @Override protected boolean deleteOnExit() { // DO NOT DELETE ON EXIT !!!! return false; } static final int BUFFER_SIZE = 4096; @Override public OutputStream getOutputStreamUnbuffered() throws IOException { OutputStream os = super.getOutputStreamUnbuffered(); os = new DiskSpaceCheckingOutputStream(os, tracker, getFile(), BUFFER_SIZE); return os; } @Override public OutputStream getOutputStream() throws IOException { return new BufferedOutputStream(getOutputStreamUnbuffered(), BUFFER_SIZE); } /** Must override createShadow() so it creates a persistent bucket, which will have * deleteOnExit() = deleteOnFinalize() = false. */ @Override public RandomAccessBucket createShadow() { PersistentTempFileBucket ret = new PersistentTempFileBucket(filenameID, generator, tracker, false); ret.setReadOnly(); if(!getFile().exists()) Logger.error(this, "File does not exist when creating shadow: "+getFile()); return ret; } @Override protected void innerResume(ClientContext context) throws ResumeFailedException { super.innerResume(context); if(logMINOR) Logger.minor(this, "Resuming "+this, new Exception("debug")); tracker = context.persistentFileTracker; tracker.register(getFile()); } @Override protected boolean persistent() { return true; } public static final int MAGIC = 0x2ffdd4cf; protected int magic() { return MAGIC; } protected PersistentTempFileBucket(DataInputStream dis) throws IOException, StorageFormatException { super(dis); } @Override protected long getPersistentTempID() { return filenameID; } }