package com.neverwinterdp.scribengin.storage.s3;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
public class S3ObjectWriter {
private S3Client s3Client;
private String bucketName ;
private String key;
ObjectMetadata metadata = new ObjectMetadata();
private PipedOutputStream pipedOutput ;
private PipedInputStream pipedInput;
private WriteThread writeThread ;
public S3ObjectWriter(S3Client s3Client, String bucketName, String key, ObjectMetadata metadata) throws IOException {
this.s3Client = s3Client;
this.bucketName = bucketName;
this.key = key;
this.metadata = metadata;
pipedOutput = new PipedOutputStream() ;
pipedInput = new PipedInputStream(pipedOutput);
writeThread = new WriteThread() ;
writeThread.start();
}
public ObjectMetadata getObjectMetadata() { return this.metadata ; }
public void write(byte[] data) throws IOException {
pipedOutput.write(data);
}
public void waitAndClose(long timeout) throws IOException, InterruptedException {
pipedOutput.close();
if(!writeThread.waitForTermination(timeout)) {
throw new IOException("The writer thread cannot upload all the data to S3 in " + timeout + "ms") ;
}
pipedInput.close();
}
public class WriteThread extends Thread {
boolean running = false;
public void run() {
running = true ;
s3Client.getAmazonS3Client().putObject(new PutObjectRequest(bucketName, key, pipedInput, metadata));
running = false ;
notifyTermination() ;
}
synchronized void notifyTermination() {
notify() ;
}
synchronized boolean waitForTermination(long timeout) throws InterruptedException {
wait(timeout);
return !running;
}
}
}