package org.openslx.imagemaster.serverconnection; import java.io.File; import java.io.FileNotFoundException; import java.nio.ByteBuffer; import java.util.List; import java.util.UUID; import org.openslx.bwlp.thrift.iface.ImagePublishData; import org.openslx.bwlp.thrift.iface.TInvocationException; import org.openslx.bwlp.thrift.iface.TransferInformation; import org.openslx.filetransfer.util.ChunkStatus; import org.openslx.filetransfer.util.FileChunk; import org.openslx.filetransfer.util.IncomingTransferBase; import org.openslx.imagemaster.Globals; import org.openslx.imagemaster.db.mappers.DbImageBlock; import org.openslx.imagemaster.util.Util; import org.openslx.util.ThriftUtil; public class IncomingTransfer extends IncomingTransferBase { private static final long MIN_FREE_SPACE_BYTES = FileChunk.CHUNK_SIZE * 10; private final String imageVersionId; public IncomingTransfer( ImagePublishData img, List blockHashes ) throws TInvocationException, FileNotFoundException { super( UUID.randomUUID().toString(), new File( new File( Globals.getImageDir(), img.imageBaseId ), img.imageVersionId ), img.fileSize, ThriftUtil.unwrapByteBufferList( blockHashes ) ); this.imageVersionId = img.imageVersionId; } @Override public String getRelativePath() { return Util.getRelativePath( getTmpFileName(), new File( Globals.getImageDir() ) ); } @Override public synchronized void cancel() { super.cancel(); getTmpFileName().delete(); } @Override protected boolean hasEnoughFreeSpace() { long space = Globals.getImagePath().getUsableSpace(); return space > MIN_FREE_SPACE_BYTES; } @Override protected boolean finishIncomingTransfer() { potentialFinishTime.set( System.currentTimeMillis() ); return true; } @Override public TransferInformation getTransferInfo() { return new TransferInformation( getId(), Globals.getFiletransferPortPlain(), Globals.getFiletransferPortSsl() ); } @Override protected void chunkStatusChanged( FileChunk chunk ) { ChunkStatus status = chunk.getStatus(); if ( status == ChunkStatus.MISSING || status == ChunkStatus.COMPLETE ) { try { DbImageBlock.asyncUpdate( imageVersionId, chunk ); } catch ( InterruptedException e ) { e.printStackTrace(); } } } }