diff options
Diffstat (limited to 'dozentenmodul/src/main/java')
4 files changed, 98 insertions, 6 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/AsyncHashGenerator.java b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/AsyncHashGenerator.java new file mode 100644 index 00000000..26b96cb6 --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/AsyncHashGenerator.java @@ -0,0 +1,82 @@ +package org.openslx.dozmod.filetransfer; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; +import org.apache.thrift.TException; +import org.openslx.bwlp.thrift.iface.TInvalidTokenException; +import org.openslx.filetransfer.util.FileChunk; +import org.openslx.thrifthelper.ThriftManager; +import org.openslx.util.Util; + +public class AsyncHashGenerator implements Runnable { + + private static final Logger LOGGER = Logger.getLogger(AsyncHashGenerator.class); + + private final File uploadFile; + + private final String uploadToken; + + public AsyncHashGenerator(String uploadToken, File uploadFile) { + this.uploadToken = uploadToken; + this.uploadFile = uploadFile; + } + + @Override + public void run() { + MessageDigest digester; + try { + digester = MessageDigest.getInstance("SHA-1"); + } catch (NoSuchAlgorithmException e1) { + LOGGER.warn("No SHA-1 MD available. Cannot hash file", e1); + return; + } + final RandomAccessFile file; + try { + file = new RandomAccessFile(uploadFile, "r"); + } catch (FileNotFoundException e) { + LOGGER.warn("Could not open file for hash-checking. Will not send checksums to satellite", e); + return; + } + try { + List<FileChunk> list = new ArrayList<>(); + FileChunk.createChunkList(list, uploadFile.length(), null); + byte[] buffer = new byte[(int) TransferTask.CHUNK_SIZE]; + List<ByteBuffer> blockHashes = new ArrayList<>(list.size()); + for (int i = 0; i < list.size(); i++) { + FileChunk chunk = list.get(i); + try { + file.seek(chunk.range.startOffset); + file.readFully(buffer, 0, chunk.range.getLength()); + } catch (IOException e) { + LOGGER.warn("Could not read file chunk " + chunk.getChunkIndex() + ", skipping", e); + continue; + } + digester.update(buffer, 0, chunk.range.getLength()); + byte[] hash = digester.digest(); + blockHashes.add(ByteBuffer.wrap(hash)); + if (i <= 5 || i % 20 == 0 || i + 1 == list.size()) { + try { + ThriftManager.getSatClient().updateBlockHashes(uploadToken, blockHashes); + } catch (TInvalidTokenException e) { + LOGGER.warn("Cannot send hashList to satellite: Sat claims uploadToken is invalid!"); + break; + } catch (TException e) { + LOGGER.warn("Unknown exception when submitting hashList to sat", e); + } + } + } + } finally { + Util.safeClose(file); + } + } + +} diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java index 72f4f6e0..fabf1d66 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/filetransfer/TransferTask.java @@ -54,8 +54,13 @@ public abstract class TransferTask implements Runnable { TransferEvent event = getTransferEvent(); if (event != null) { fireEvent(event); - if (event.state == TransferState.ERROR || event.state == TransferState.FINISHED) + if (event.state == TransferState.ERROR) { break; + } + if (event.state == TransferState.FINISHED) { + isComplete = true; + break; + } } ensureActivity(); Util.sleep(UPDATE_INTERVAL_MS); @@ -205,8 +210,9 @@ public abstract class TransferTask implements Runnable { endgame = true; } if (success && transfers.isEmpty()) { - LOGGER.debug("Transfer finished"); - isComplete = true; + LOGGER.debug("Transfer might have finished"); + lastConnectionAttempt = System.currentTimeMillis() + 3000; // Throttle reconnects + return; // Skip ensureActivity check } } ensureActivity(); diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/BlockProgressBar.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/BlockProgressBar.java index 976da6b8..8a25f409 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/BlockProgressBar.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/BlockProgressBar.java @@ -16,7 +16,7 @@ import org.openslx.thrifthelper.TransferStatusWrapper; @SuppressWarnings("serial") public class BlockProgressBar extends JPanel { - private final Color[] blockColors = new Color[5]; + private final Color[] blockColors = new Color[6]; private final TransferStatusWrapper blocks = new TransferStatusWrapper(null); @@ -25,12 +25,13 @@ public class BlockProgressBar extends JPanel { public BlockProgressBar(byte[] blocks) { super(); setupListeners(); - // 0 = complete, 1 = missing, 2 = uploading, 3 = queued for copying, 4 = copying + // 0 = complete, 1 = missing, 2 = uploading, 3 = queued for copying, 4 = copying, 5 = hashing blockColors[0] = Color.BLACK; blockColors[1] = Color.RED; blockColors[2] = Color.YELLOW; blockColors[3] = Color.BLUE; blockColors[4] = Color.GREEN; + blockColors[5] = Color.YELLOW.darker(); this.blocks.setBlocks(blocks); } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java index 2e4ce13e..1831a5d3 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java @@ -16,11 +16,12 @@ import javax.swing.filechooser.FileNameExtensionFilter; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.TImageDataException; import org.openslx.dozmod.Config; +import org.openslx.dozmod.filetransfer.AsyncHashGenerator; import org.openslx.dozmod.filetransfer.UploadTask; import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.MainWindow; -import org.openslx.dozmod.gui.helper.QFileChooser; import org.openslx.dozmod.gui.helper.MessageType; +import org.openslx.dozmod.gui.helper.QFileChooser; import org.openslx.dozmod.gui.wizard.Wizard; import org.openslx.dozmod.gui.wizard.layout.ImageUploadPageLayout; import org.openslx.dozmod.state.UploadWizardState; @@ -201,6 +202,8 @@ public class ImageUploadPage extends ImageUploadPageLayout { + state.diskFile.getAbsolutePath(), MessageType.ERROR, LOGGER, e); return false; } + new Thread(new AsyncHashGenerator(state.transferInformation.token, state.diskFile)).start(); + Util.sleep(50); // A little ugly... Give the hash generator a head start new Thread(state.uploadTask).start(); do { Util.sleep(5); |
