package freenet.support.io; import java.io.File; import java.io.IOException; import java.util.Random; import freenet.support.api.LockableRandomAccessBuffer; import freenet.support.api.LockableRandomAccessBufferFactory; /** Creates temporary RAFs using a FilenameGenerator. */ public class PooledFileRandomAccessBufferFactory implements LockableRandomAccessBufferFactory { private final FilenameGenerator fg; private final Random seedRandom; private volatile boolean enableCrypto; public PooledFileRandomAccessBufferFactory(FilenameGenerator filenameGenerator, Random seedRandom) { fg = filenameGenerator; this.seedRandom = seedRandom; } public void enableCrypto(boolean enable) { this.enableCrypto = enable; } @Override public LockableRandomAccessBuffer makeRAF(long size) throws IOException { long id = fg.makeRandomFilename(); File file = fg.getFilename(id); LockableRandomAccessBuffer ret = null; try { ret = new PooledFileRandomAccessBuffer(file, false, size, enableCrypto ? seedRandom : null, id, true); return ret; } finally { if(ret == null) file.delete(); } } @Override public LockableRandomAccessBuffer makeRAF(byte[] initialContents, int offset, int size, boolean readOnly) throws IOException { long id = fg.makeRandomFilename(); File file = fg.getFilename(id); LockableRandomAccessBuffer ret = null; try { ret = new PooledFileRandomAccessBuffer(file, "rw", initialContents, offset, size, id, true, readOnly); return ret; } finally { if(ret == null) file.delete(); } } }