package com.aol.micro.server.s3.data;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectResult;
import cyclops.async.Future;
import cyclops.control.Try;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public class S3StringWriter {
private final AmazonS3Client client;
private final String bucket;
private final ExecutorService uploadService;
private final boolean aes256Encryption;
S3StringWriter(AmazonS3Client client, String bucket, ExecutorService uploadService){
this(client, bucket, uploadService, false);
}
/**
*
* Writes String data to defined S3 bucket with provided key. Calling
* map / flatMap on the returned try instance will catch any exceptions, any
* exceptions thrown will convert a Success to a Failure
*
* This call is blocking.
*
* @param key
* To read
* @return Data as String
*/
public Try<PutObjectResult, Throwable> put(String key, String value) {
return Try.withCatch(() -> {
byte[] bytes = value.getBytes("UTF-8");
ByteArrayInputStream stream = new ByteArrayInputStream(
bytes);
ObjectMetadata md = createMetadata(bytes.length);
return client.putObject(bucket, key, stream, md);
});
}
/**
* Non-blocking call
*
* @param key
* @param value
* @return
*/
public Future<PutObjectResult> putAsync(String key, String value) {
return Future.ofSupplier(() -> put(key, value), this.uploadService)
.map(Try::get);
}
/**
* Metadata object creation
* @param length
*
* @return Metadata with AES_256 encryption if enabled
*/
private ObjectMetadata createMetadata(int length) {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(length);
if (aes256Encryption)
metadata.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
return metadata;
}
}