package ftp; import java.io.File; import java.io.IOException; import javax.swing.JOptionPane; import javax.swing.SwingWorker; import models.Image; import org.apache.log4j.Logger; import org.openslx.filetransfer.UploadStatusCallback; import org.openslx.filetransfer.Uploader; /** * Executes the file upload in a background thread and updates progress to * listeners that implement the java.beans.PropertyChangeListener interface. * * @author www.codejava.net * */ public class UploadTask extends SwingWorker { /** * Logger instance for this class. */ private final static Logger LOGGER = Logger.getLogger(UploadTask.class); private static final double UPDATE_INTERVAL_SECONDS = 0.6; private static final double UPDATE_INTERVAL_MS = UPDATE_INTERVAL_SECONDS * 1000; private static final double BYTES_PER_MIB = 1024 * 1024; private final String host; private final int port; private final String uploadToken; private final File uploadFile; private boolean success = false; public UploadTask(String host, int port, String uploadToken, File uploadFile) { // TODO: SSL this.host = host; this.port = port; this.uploadToken = uploadToken; this.uploadFile = uploadFile; } /** * Executed in background thread */ @Override protected Void doInBackground() { Uploader upload = null; try { upload = new Uploader(host, port, null, uploadToken); // TODO: SSL final Uploader ul = upload; final long fileSize = Image.Filesize = uploadFile.length(); firePropertyChange("filesize", 0, fileSize); // Updates GUI final boolean ret = upload.upload(uploadFile.getAbsolutePath(), new UploadStatusCallback() { // progress counter private long totalBytesRead = 0; // initialize the counters needed for speed calculations private long lastUpdate = 0; private long lastBytes = 0; private long currentBytes = 0; @Override public void uploadProgress(long bytesSent) { totalBytesRead += bytesSent; currentBytes += bytesSent; final long now = System.currentTimeMillis(); if (lastUpdate + UPDATE_INTERVAL_MS < now) { final int percentCompleted = (int) ((totalBytesRead * 100) / fileSize); setProgress(percentCompleted); lastBytes = (lastBytes * 2 + currentBytes) / 3; final double speed = lastBytes / UPDATE_INTERVAL_SECONDS; firePropertyChange("speed", 0, speed / BYTES_PER_MIB); firePropertyChange("bytesread", 0, totalBytesRead); lastUpdate = now; currentBytes = 0; } } @Override public void uploadError(String message) { JOptionPane.showMessageDialog(null, "Error uploading file: " + message, "Error", JOptionPane.ERROR_MESSAGE); ul.close(null); } }); // if the upload succeeded, set the progress to 100% manually again here to make // sure the GUI knows about it. if (ret) { setProgress(100); firePropertyChange("bytesread", 0, uploadFile.length()); firePropertyChange("success", false, true); success = true; } } catch (IOException e) { JOptionPane.showMessageDialog(null, "Error uploading file: " + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); LOGGER.error("Upload of " + uploadFile.getAbsolutePath() + " failed!", e); } finally { if (upload != null) upload.close(null); } return null; } /** * Executed in Swing's event dispatching thread */ @Override protected void done() { if (isCancelled()) return; if (success) { LOGGER.info("Datei erfolgreich hochgeladen."); JOptionPane.showMessageDialog(null, "Datei erfolgreich hochgeladen.", "Message", JOptionPane.INFORMATION_MESSAGE); } else { LOGGER.error("Datei wurde unvollständig hochgeladen."); JOptionPane.showMessageDialog(null, "Datei wurde unvollständig hochgeladen. Bitte wiederholen.", "Message", JOptionPane.INFORMATION_MESSAGE); } } }