package com.neverwinterdp.scribengin.storage.s3; import java.io.ByteArrayInputStream; import java.io.InputStream; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.regions.Region; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.Bucket; import com.amazonaws.services.s3.model.CopyObjectRequest; import com.amazonaws.services.s3.model.DeleteBucketRequest; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.PutObjectRequest; import com.amazonaws.services.s3.model.S3Object; import com.amazonaws.services.s3.model.S3ObjectSummary; import com.google.inject.Singleton; @Singleton public class S3Client { private AmazonS3Client s3Client ; private Region region; public S3Client(String regionName){ region = Region.getRegion(Regions.fromName(regionName)); } public S3Client(){ region = Region.getRegion(Regions.US_WEST_1); } @PostConstruct public void onInit() { s3Client = new AmazonS3Client(); s3Client.setRegion(region); } @PreDestroy public void onDestroy() { s3Client.shutdown(); } public AmazonS3Client getAmazonS3Client() { return this.s3Client ; } public Bucket createBucket(String bucketName) throws AmazonClientException, AmazonServiceException { return s3Client.createBucket(bucketName) ; } public boolean hasBucket(String bucketName) throws AmazonClientException, AmazonServiceException { return s3Client.doesBucketExist(bucketName) ; } public void deleteBucket(String bucketName, boolean recursive) throws AmazonClientException, AmazonServiceException { if(recursive) { deleteKeyWithPrefix(bucketName, ""); } DeleteBucketRequest request = new DeleteBucketRequest(bucketName) ; s3Client.deleteBucket(request); } public void create(String bucketName, String key, byte[] data, String mimeType) throws AmazonServiceException { InputStream is = new ByteArrayInputStream(data); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType(mimeType); s3Client.putObject(new PutObjectRequest(bucketName, key, is, metadata)); } public boolean hasKey(String bucketName, String key) throws AmazonClientException, AmazonServiceException { try { s3Client.getObjectMetadata(bucketName, key); } catch(AmazonServiceException e) { if(e.getStatusCode() == 404) return false; throw e ; } return true; } public ObjectMetadata getObjectMetadata(String bucketName, String key) throws AmazonClientException, AmazonServiceException { return s3Client.getObjectMetadata(bucketName, key) ; } public void createObject(String bucketName, String key, byte[] data, ObjectMetadata metadata) { InputStream is = new ByteArrayInputStream(data) ; createObject(bucketName, key, is, metadata); } public void createObject(String bucketName, String key, InputStream is, ObjectMetadata metadata) { s3Client.putObject(new PutObjectRequest(bucketName, key, is, metadata)); metadata.addUserMetadata("transaction", "test"); } public void updateObjectMetadata(String bucketName, String key, ObjectMetadata metadata) { CopyObjectRequest request = new CopyObjectRequest(bucketName, key, bucketName, key).withNewObjectMetadata(metadata); s3Client.copyObject(request); } public S3Object getObject(String bucketName, String key) throws AmazonClientException, AmazonServiceException { return s3Client.getObject(bucketName, key) ; } public S3Folder createS3Folder(String bucketName, String folderPath) throws AmazonClientException, AmazonServiceException { if(!hasBucket(bucketName)) { throw new AmazonServiceException("Bucket " + bucketName + " does not exist") ; } create(bucketName, folderPath, new byte[0], "s3system/folder"); return new S3Folder(this, bucketName, folderPath) ; } public void deleteS3Folder(String bucketName, String folderPath) { deleteKeyWithPrefix(bucketName, folderPath); } public S3Folder getS3Folder(String bucketName, String folderPath) throws AmazonClientException, AmazonServiceException { if(!hasBucket(bucketName)) { throw new AmazonServiceException("Bucket " + bucketName + " does not exist") ; } if(getObjectMetadata(bucketName,folderPath) == null) { throw new AmazonServiceException("Folder " + folderPath + " does not exist") ; } return new S3Folder(this, bucketName, folderPath) ; } void deleteKeyWithPrefix(String bucketName, String prefix) { for (S3ObjectSummary file : s3Client.listObjects(bucketName, prefix).getObjectSummaries()){ s3Client.deleteObject(bucketName, file.getKey()); } } }