GroupDocsGists
10/24/2017 - 1:12 PM

S3CacheHandler.java

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());
    }
}