/** * Copyright 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). You may not * use this file except in compliance with the License. A copy of the License * is located at * * http://aws.amazon.com/apache2.0/ * * or in the "LICENSE" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package awslabs.lab21; import java.io.File; import java.net.URL; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.amazonaws.regions.Region; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.AmazonS3Exception; import com.amazonaws.services.s3.model.CannedAccessControlList; import com.amazonaws.services.s3.model.CreateBucketRequest; import com.amazonaws.services.s3.model.DeleteBucketRequest; import com.amazonaws.services.s3.model.DeleteObjectsRequest; import com.amazonaws.services.s3.model.DeleteObjectsRequest.KeyVersion; import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest; import com.amazonaws.services.s3.model.ListObjectsRequest; import com.amazonaws.services.s3.model.ObjectListing; import com.amazonaws.services.s3.model.PutObjectRequest; import com.amazonaws.services.s3.model.S3ObjectSummary; /** * Project: Lab2.1 */ public abstract class SolutionCode implements ILabCode, IOptionalLabCode { @Override public void createBucket(AmazonS3 s3Client, String bucketName, Region region) { // Construct a CreateBucketRequest object that contains the provided bucket name. // If the region is other than us-east-1, we need to specify a regional constraint. CreateBucketRequest createBucketRequest; if (region.getName().equals("us-east-1")) { createBucketRequest = new CreateBucketRequest(bucketName); } else { createBucketRequest = new CreateBucketRequest(bucketName, com.amazonaws.services.s3.model.Region.fromValue(region.getName())); } // Submit the request using the createBucket method of the s3Client object. s3Client.createBucket(createBucketRequest); } @Override public void putObject(AmazonS3 s3Client, String bucketName, String sourceFileName, String objectKey) { File sourceFile = new File(sourceFileName); // Construct a PutObjectRequest object using the values provided in the method parameters PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, sourceFile); // Upload the object by submitting the request using the putObject method of the s3Client object. s3Client.putObject(putObjectRequest); } @Override public void listObjects(AmazonS3 s3Client, String bucketName) { // Construct a ListObjectsRequest object using the provided bucket name. ListObjectsRequest listObjectsRequest = new ListObjectsRequest().withBucketName(bucketName); // Submit the request using the listObjects method of the s3Client object. ObjectListing objectListing = s3Client.listObjects(listObjectsRequest); // Take the results and write the object keys and sizes to the console. for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) { System.out.println(objectSummary.getKey() + " (size: " + objectSummary.getSize() + ")"); } } @Override public void makeObjectPublic(AmazonS3 s3Client, String bucketName, String key) { // Use the setObjectAcl method of the s3Client object to set the ACL for the specified // object to CannedAccessControlList.PublicRead. s3Client.setObjectAcl(bucketName, key, CannedAccessControlList.PublicRead); } @Override public String generatePreSignedUrl(AmazonS3 s3Client, String bucketName, String key) { Date nowPlusOneHour = new Date(System.currentTimeMillis() + 3600000L); // Construct a GeneratePresignedUrlRequest object for the provided object. GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, key); // Set the expiration value in the request to the nowPlusOneHour object // (this specifies a time one hour from now). generatePresignedUrlRequest.setExpiration(nowPlusOneHour); // Submit the request using the generatePresignedUrl method of the s3Client object. URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest); // Return the URL as a string. return url.toString(); } @Override public void deleteBucket(AmazonS3 s3Client, String bucketName) { // First, try to delete the bucket. DeleteBucketRequest deleteBucketRequest = new DeleteBucketRequest(bucketName); try { s3Client.deleteBucket(deleteBucketRequest); // If we got here, no error was generated so we'll assume the bucket was deleted and return. return; } catch (AmazonS3Exception ex) { if (!ex.getErrorCode().equals("BucketNotEmpty")) { // The only other exception we're going to handle is BucketNotEmpty, so rethrow anything else. throw ex; } } // If we got here, the bucket isn't empty, so delete the contents and try again. List<KeyVersion> keys = new ArrayList<KeyVersion>(); for (S3ObjectSummary obj : s3Client.listObjects(bucketName).getObjectSummaries()) { // Add the keys to our list of object. keys.add(new KeyVersion(obj.getKey())); } // Create the request to delete the objects. DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucketName); deleteObjectsRequest.withKeys(keys); // Submit the delete objects request. s3Client.deleteObjects(deleteObjectsRequest); // The bucket is empty now, so attempt the delete again. s3Client.deleteBucket(deleteBucketRequest); } }