package hackathon.boxme;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
import javax.naming.OperationNotSupportedException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.Bucket;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectSummary;
public class S3StorageProvider implements StorageProvider {
public AmazonS3Client getClient(String credentials) {
final String secret = credentials.split("/")[1];
final String access = credentials.split("/")[0];
return new AmazonS3Client(new AWSCredentials() {
@Override
public String getAWSSecretKey() {
return secret;
}
@Override
public String getAWSAccessKeyId() {
return access;
}
});
}
@Override
public void putFile(String fileKey, FileCopyStream stream,
String receiverCredentials) {
AmazonS3Client client = getClient(receiverCredentials);
String bucket = fileKey.split("/")[0];
String filename = fileKey.split("/")[1];
new Thread(new S3PutFileRequest(bucket, filename, stream, client)).start();
}
@Override
public FileCopyStream getFile(String fileKey, String senderCredentials) {
FileCopyStream stream = new FileCopyStream();
AmazonS3Client client = getClient(senderCredentials);
S3Object obj = client.getObject(fileKey.split("/")[0], fileKey.split("/")[1]);
stream.setInputStream(obj.getObjectContent());
stream.setSize(obj.getObjectMetadata().getContentLength());
return stream;
}
@Override
public DirectoryListing getFilesUnderPath(String path, String credentials) {
DirectoryListing dl = new DirectoryListing();
List<String> dirs = new LinkedList<String>();
List<String> files = new LinkedList<String>();
AmazonS3Client client = getClient(credentials);
String bucket = null;
String fileName = null;
if (path.split("/").length > 1) {
bucket = path.split("/")[0];
fileName = "";
for (int i = 1; i < path.split("/").length; i++) {
fileName += path.split("/")[i];
}
} else if (path.length() > 0) {
bucket = path;
}
List<Bucket> buckets = client.listBuckets();
for (Bucket b : buckets){
if (bucket == null || b.getName().startsWith(bucket)) {
ObjectListing ol = client.listObjects(bucket, fileName);
do {
for (S3ObjectSummary sum : ol.getObjectSummaries()) {
if (sum.getSize() == 0) {
dirs.add(sum.getBucketName() + "/" + sum.getKey());
} else {
files.add(sum.getBucketName() + "/" + sum.getKey());
}
}
ol = client.listNextBatchOfObjects(ol);
} while (ol.isTruncated());
}
}
dl.setDirectories(dirs);
dl.setFiles(files);
return dl;
}
@Override
public boolean copyFile(String fileKey, String senderCredentials,
String receiverCredentials) {
throw new RuntimeException(new OperationNotSupportedException());
}
@Override
public List<String> listAllFiles(String credentials) {
throw new RuntimeException(new OperationNotSupportedException());
}
public static void main (String[] args) {
S3StorageProvider prov = new S3StorageProvider();
System.out.println(prov.getFilesUnderPath("mckinn-123/", "AKIAJRAW7KQ7ZLUM54YQ Y/IuAhHJ3yfH3xd9dQ2UlAO4C8ERxOLKnUev+y7h").getFiles());
}
}