summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/net/jesterpm/podcastuploader/control/S3UploadTask.java76
-rw-r--r--src/net/jesterpm/podcastuploader/control/UploadTask.java27
2 files changed, 97 insertions, 6 deletions
diff --git a/src/net/jesterpm/podcastuploader/control/S3UploadTask.java b/src/net/jesterpm/podcastuploader/control/S3UploadTask.java
new file mode 100644
index 0000000..b282c52
--- /dev/null
+++ b/src/net/jesterpm/podcastuploader/control/S3UploadTask.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2012 Jesse Morgan
+ */
+
+package net.jesterpm.podcastuploader.control;
+
+import java.util.concurrent.ThreadPoolExecutor;
+
+import net.jesterpm.podcastuploader.config.Config;
+
+/**
+ * Task for uploading a single file to S3.
+ *
+ * @author Jesse Morgan <jesse@jesterpm.net>
+ */
+public class S3UploadTask extends ObserableTask implements Runable {
+ private final ThreadPoolExecutor mExecutor;
+
+ private final AmazonS3Client mClient;
+
+ private final String mBucket;
+ private final String mLocalFile;
+ private final String mS3Key;
+
+ private int mCurrentChunk;
+ private int mTotalChunks;
+
+ /**
+ * Prepare a new S3UploadTask.
+ *
+ * @param appConfig The current running appConfig.
+ * @param localFile The name of the local file to upload.
+ * @param remoteFile The key to use for the file in S3.
+ */
+ public S3UploadTask(final Config appConfig, final String localFile,
+ final String remoteFile, final ThreadPoolExecutor executor) {
+
+ mExecutor = executor;
+
+ mClient = new AmazonS3Client(new BasicAWSCredentials(
+ appConfig.get("AWSAccessKeyId"), appConfig.get("AWSSecretKey")));
+
+ mBucket = appConfig.get("S3Bucket");
+ mLocalFile = localFile;
+ mS3Key = remoteFile;
+
+ mCurrentChunk = 0;
+ mTotalChunks = 1; // Avoid div-by-0 in getProgress()
+ }
+
+ /**
+ * Start the upload.
+ */
+ @Override
+ public void run() {
+ // Create bucket if needed
+ createBucket();
+
+ // Start Upload
+ }
+
+ /**
+ * Create the S3 bucket if it doesn't already exist.
+ */
+ private void createBucket() {
+
+ }
+
+ /**
+ * @return The number of file parts uploaded over the total number of file parts.
+ */
+ @Override
+ public float getProgress() {
+ return (float) mCurrentChunk / mTotalChunks.
+ }
+}
diff --git a/src/net/jesterpm/podcastuploader/control/UploadTask.java b/src/net/jesterpm/podcastuploader/control/UploadTask.java
index 6268566..5c0b5ce 100644
--- a/src/net/jesterpm/podcastuploader/control/UploadTask.java
+++ b/src/net/jesterpm/podcastuploader/control/UploadTask.java
@@ -39,6 +39,11 @@ public class UploadTask {
private final Config mMetadata;
/**
+ * Thread Pool used for and by the UploadTasks.
+ */
+ private final ThreadPoolExecutor mExecutor;
+
+ /**
* UploadTask Constructor.
* @param appconfig The application config
* @param win The progress window user interface.
@@ -83,7 +88,12 @@ public class UploadTask {
// Build a list of files to upload.
Map<String, S3UploadTask> files = getFilesToUpload(baseFilename);
- // TODO: Execute all the upload tasks (in parallel?)
+ for (S3UploadTask task : files.getEntries()) {
+ mExecutor.submit(task);
+ mProgressInterface.monitorTask(task);
+ }
+
+ // Wait until all uploads complete.
// Publish the podcast metadata.
Map<String, String> metadata = mMetadata.getMap().clone();
@@ -108,31 +118,36 @@ public class UploadTask {
localFile = mMetadata.get("video");
if (localFile != null) {
remoteFile = basename + "-video" + fileExtension(localFile);
- files.put("video", new S3UploadTask(mAppConfig, localFile, remoteFile);
+ files.put("video", new S3UploadTask(mAppConfig, localFile,
+ remoteFile, mExecutor);
}
localFile = mMetadata.get("video_lowres");
if (localFile != null) {
remoteFile = basename + "-videolow" + fileExtension(localFile);
- files.put("video_lowres", new S3UploadTask(mAppConfig, localFile, remoteFile);
+ files.put("video_lowres", new S3UploadTask(mAppConfig, localFile,
+ remoteFile, mExecutor);
}
localFile = mMetadata.get("audio");
if (localFile != null) {
remoteFile = basename + "-audio" + fileExtension(localFile);
- files.put("audio", new S3UploadTask(mAppConfig, localFile, remoteFile);
+ files.put("audio", new S3UploadTask(mAppConfig, localFile,
+ remoteFile, mExecutor);
}
localFile = mMetadata.get("image");
if (localFile != null) {
remoteFile = basename + "-image" + fileExtension(localFile);
- files.add("image", new S3UploadTask(mAppConfig, localFile, remoteFile);
+ files.add("image", new S3UploadTask(mAppConfig, localFile,
+ remoteFile, mExecutor);
}
localFile = mMetadata.get("mobileimage");
if (localFile != null) {
remoteFile = basename + "-mobileimage" + fileExtension(localFile);
- files.add("mobileimage", new S3UploadTask(mAppConfig, localFile, remoteFile);
+ files.add("mobileimage", new S3UploadTask(mAppConfig, localFile,
+ remoteFile, mExecutor);
}
return files;