From f5618c87e63deb99920710787f6dcd34d4b17425 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Wed, 13 Apr 2016 18:41:29 +0200 Subject: (WiP) Global image sync --- .../serverconnection/IncomingTransfer.java | 81 ++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java (limited to 'src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java') diff --git a/src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java b/src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java new file mode 100644 index 0000000..bfc65e1 --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/serverconnection/IncomingTransfer.java @@ -0,0 +1,81 @@ +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(); + } + } + } + +} -- cgit v1.2.3-55-g7522