Showing posts with label Amazon Web Services. Show all posts
Showing posts with label Amazon Web Services. Show all posts

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

Oracle SQL Scheduled Jobs - An Interesting Approach

  Oracle SQL Scheduled Jobs A DB Scheduler is the best way to automate any backend database job. For instance, if you want to process the p...