Monday, 26 December 2016

Stepping into the world of Amazon Web Services

WANT TO UPLOAD/ READ A FILE INTO/ FROM YOUR AWS S3 BUCKET, HERE IS A CODE SNIPPET

For any query/ suggestion drop me a note at vats.namit@gmail.com

HAPPY CODING!

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.amazonaws.AmazonClientException;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.InstanceProfileCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.model.S3Object;
import com.google.common.io.Files;

public class S3Handler {

static AmazonS3 s3;

final static EnvironmentProperty environmentProperty = new EnvironmentProperty();
private final static Logger logger = LogManager.getLogger(S3Handler.class);

// member variables
private String s3BucketName;
private File uploadFile;
private String fileName;

// Constructor for handling upload
public S3Handler(String bucketName, File file) throws Exception {
init();
setS3BucketName(bucketName);
setUploadFile(file);
setFileName(file.getName());
}

// Constructor for handling retrieval
public S3Handler(String bucketName, String fileName) throws Exception {
init();
setS3BucketName(bucketName);
setFileName(fileName);
}

// Initialize
private static void init() throws Exception {
String credentialFile = "";
   if(SystemProperty.getenv().containsKey(environmentProperty.getProperty("environment.credential.file.keyword"))) {
    credentialFile = SystemProperty.getenv(environmentProperty.getProperty("environment.credential.file.keyword"));
   }
if (credentialFile.equals(null) || credentialFile.isEmpty() || credentialFile.equals("")) {
credentialFile = "FileNotExist";
}
AWSCredentials credentials = null;
AWSCredentialsProvider credentialsProvider;
File file = new File(credentialFile);
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProtocol(Protocol.HTTP);
clientConfig.setConnectionTimeout(0);
   clientConfig.setSocketTimeout(0);
if (file.exists()) {
credentialsProvider = new ProfileCredentialsProvider(credentialFile, "default");
try {
credentials = credentialsProvider.getCredentials();
} catch (Exception e) {
throw new AmazonClientException("Cannot load the credentials from the credential profiles file. "
+ "Please make sure that your credentials file is at the correct " + "location ("
+ credentialFile + "), and is in valid format.", e);
}
s3 = new AmazonS3Client(credentials, clientConfig);
} else {
credentialsProvider = new InstanceProfileCredentialsProvider();
credentials = credentialsProvider.getCredentials();
s3 = new AmazonS3Client(credentials, clientConfig);
}

String regionName = environmentProperty.getProperty("environment.region.name");
Region region = Region.getRegion(Regions.fromName(regionName));
s3.setRegion(region);
logger.info("S3 Client has been created...");
logger.info("Region is " + region.getName());

}

// setters-getters
public String getS3BucketName() {
return s3BucketName;
}

public void setS3BucketName(String s3BucketName) {
this.s3BucketName = s3BucketName;
}

public File getUploadFile() {
return uploadFile;
}

public void setUploadFile(File upFile) {
this.uploadFile = upFile;
}

public String getFileName() {
return fileName;
}

public void setFileName(String fileName) {
this.fileName = fileName;
}

// methods
/**
* method for uploading file to S3 uses the attributes set while invoking
* respective constructor
*/
public void uploadToS3() {

PutObjectRequest putObjectRequest = new PutObjectRequest(getS3BucketName(), getFileName(), getUploadFile())
.withSdkClientExecutionTimeout(Integer.valueOf(environmentProperty.getProperty("s3.clientExecution.Timeout")));
s3.putObject(putObjectRequest.withCannedAcl(CannedAccessControlList.Private));
logger.info("Upload to S3 bucket - " + getS3BucketName() + " over!");

}

/**
* method for retrieving file from S3 uses the attributes set while invoking
* respective constructor
* @return json String
*/
public String retrieveS3File() {

S3Object s3object = s3.getObject(new GetObjectRequest(getS3BucketName(), getFileName()));
logger.info("Content Type  : " + s3object.getObjectMetadata().getContentType());
logger.info("Content Length: " + s3object.getObjectMetadata().getContentLength());

BufferedReader reader = new BufferedReader(new InputStreamReader(s3object.getObjectContent()));
String line;
StringBuilder output = new StringBuilder();
try {
while ((line = reader.readLine()) != null) {
output.append(line + "\r\n");
}
} catch (IOException e) {
e.printStackTrace();
}
logger.info("Retrieval from S3 bucket - " + getS3BucketName() + " over!");
return output.toString();
}

/**
* Utility to create file, can be used without having s3 client
* @param fileName
* @param sb
* @return File
* @throws IOException
*/
public static File createUploadFile(String fileName, StringBuilder sb) throws IOException {

File file = new File(Files.createTempDir(), fileName + ".txt");
file.deleteOnExit();

Writer writer = new OutputStreamWriter(new FileOutputStream(file));

if (null != sb && !sb.toString().isEmpty()) {
writer.write(sb.toString());
}
writer.close();

return file;

}

}

Featured post

JAVA based project, that can be used to hit DB using JDBC, from WSO2 ESB

Hi Buddies, Here is a small project that will enable you to hit MySQL DB using WSO2 ESB - https://github.com/namitsharma99/customM...

Popular Posts