From 1387cbefc503a4c4486fa5e1a3af12d9d0cad00f Mon Sep 17 00:00:00 2001 From: Jesse Morgan Date: Thu, 13 Dec 2012 09:12:59 -0800 Subject: Began implementing S3UploadTask. --- .../podcastuploader/control/S3UploadTask.java | 76 ++++++++++++++++++++++ .../podcastuploader/control/UploadTask.java | 27 ++++++-- 2 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 src/net/jesterpm/podcastuploader/control/S3UploadTask.java 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 + */ +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 @@ -38,6 +38,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 @@ -83,7 +88,12 @@ public class UploadTask { // Build a list of files to upload. Map 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 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; -- cgit v1.2.3