public class S3CacheHandler implements ICacheDataHandler {
private final String TEXT_BUCKET = "";
private final AmazonS3Client amazonS3Client;
public S3CacheHandler(AmazonS3Client amazonS3Client) {
this.amazonS3Client = amazonS3Client;
}
public boolean exists(CacheFileDescription cacheFileDescription) {
String guid = makeCacheName(cacheFileDescription);
// amazonS3Client.deleteObject(new DeleteObjectRequest(Main.TEST_BUCKET, guid));
return doesObjectExist(guid);
}
public InputStream getInputStream(CacheFileDescription cacheFileDescription) {
String guid = makeCacheName(cacheFileDescription);
final GetObjectRequest getObjectRequest = new GetObjectRequest(TEXT_BUCKET, guid);
final S3Object object = amazonS3Client.getObject(getObjectRequest);
return object.getObjectContent();
}
public OutputStream getOutputSaveStream(CacheFileDescription cacheFileDescription) {
String guid = makeCacheName(cacheFileDescription);
return new AmazonS3OutputStream(cacheFileDescription, guid);
}
public Date getLastModificationDate(CachedPageDescription cachedPageDescription) throws Exception {
String guid = makeCacheResourceName(cachedPageDescription);
try {
final ObjectMetadata object = amazonS3Client.getObjectMetadata(new GetObjectMetadataRequest(TEXT_BUCKET, guid));
return object.getLastModified();
} catch (Exception ignored) {
return null;
}
}
public String getHtmlPageResourcesFolder(CachedPageDescription cachedPageDescription) throws Exception {
String docFolder = makeCacheResourceName(cachedPageDescription);
return docFolder;
}
public List<CachedPageResourceDescription> getHtmlPageResources(CachedPageDescription cachedPageDescription) throws Exception {
List<CachedPageResourceDescription> resourceDescriptions = new ArrayList<CachedPageResourceDescription>();
String guid = makeCacheResourceName(cachedPageDescription);
CachedPageResourceDescription description = new CachedPageResourceDescription(cachedPageDescription, guid);
resourceDescriptions.add(description);
return resourceDescriptions;
}
public String getFilePath(CacheFileDescription cacheFileDescription) throws Exception {
return null;
}
public void clearCache(long l) throws Exception {
}
/**
* Tests whether a file exists based on its key.
*/
private boolean doesObjectExist(String key) {
try {
final ObjectMetadata objectMetadata = amazonS3Client.getObjectMetadata(new GetObjectMetadataRequest(TEXT_BUCKET, key));
return objectMetadata.getContentLength() > 0;
} catch (AmazonS3Exception e) {
if (e.getStatusCode() == HttpStatus.SC_NOT_FOUND) {
return false;
} else {
e.printStackTrace();
}
}
return true;
}
private class AmazonS3OutputStream extends ByteArrayOutputStream {
private CacheFileDescription cacheFileDescription;
private String key;
public AmazonS3OutputStream(CacheFileDescription cacheFileDescription, String key) {
super();
this.cacheFileDescription = cacheFileDescription;
this.key = key;
}
public InputStream toInputStream() {
return new ByteArrayInputStream(buf, 0, count);
}
public void close() throws IOException {
super.close();
final InputStream inputStream = toInputStream();
String filename = cacheFileDescription.getName();
String mimeType = Mimetypes.getInstance().getMimetype(filename);
long length = inputStream.available();
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentDisposition("inline; filename=\"${filename}\"");
metadata.setContentType(mimeType);
metadata.setLastModified(new Date());
metadata.setContentLength(length);
PutObjectRequest request = new PutObjectRequest(TEXT_BUCKET, key, inputStream, metadata);
amazonS3Client.putObject(request.withCannedAcl(CannedAccessControlList.Private));
}
}
public static String combine(String... pathParts) {
StringBuilder builder = new StringBuilder();
for (String pathPart : pathParts) {
builder.append(pathPart).append(File.separator);
}
return builder.deleteCharAt(builder.length() - 1).toString();
}
private String makeCacheName(CacheFileDescription cacheFileDescription) {
return combine("S3Cache",
cacheFileDescription.getBaseName(),
String.valueOf(cacheFileDescription.getCacheFileType()),
cacheFileDescription.getGuid());
}
private String makeCacheResourceName(CachedPageDescription cachedPageDescription) {
return combine(makeCacheName(cachedPageDescription),
"page" + String.valueOf(cachedPageDescription.getPageNumber()),
cachedPageDescription.getGuid());
}
}