package com.example.services.impl;
import com.example.config.Config;
import com.example.services.*;
import com.amazonaws.handlers.AsyncHandler;
import com.amazonaws.services.sns.AmazonSNSAsyncClient;
import com.amazonaws.services.sns.model.*;
import java.io.File;
import java.util.logging.Logger;
public class S3Publisher implements Publisher {
AmazonSNSAsyncClient client;
private final FileManager fileManager;
private final String topic;
private final Config config;
private String topicArn;
private final static Logger logger = Logger.getLogger(S3Publisher.class.getName());
public S3Publisher(Config config, FileManager fileManager) {
this.config = config;
this.fileManager = fileManager;
client = new AmazonSNSAsyncClient(config.getAWSCredentials());
topic = "S3Sync_" + config.getBucketName() + "_topic";
createTopic();
}
public String createTopic() {
CreateTopicRequest request = new CreateTopicRequest();
request.setName(topic);
CreateTopicResult result = client.createTopic(request);
topicArn = result.getTopicArn();
return topicArn;
}
public void subscribeQueue(String queueId) {
SubscribeRequest subscribeRequest = new SubscribeRequest();
subscribeRequest.setTopicArn(topicArn);
subscribeRequest.setProtocol("sqs");
subscribeRequest.setEndpoint(queueId);
client.subscribe(subscribeRequest);
}
@Override
public void publish(Event event) {
if (!shouldPublish(event)) {
return;
}
if (fileManager instanceof S3FileManager) {
if (!((S3FileManager) fileManager).shouldDownload(event.getFile())) {
return;
}
}
if (event.getOperation() == FileOperation.DELETE) {
fileManager.delete(event.getFile());
} else if (event.getOperation() == FileOperation.CREATE || event.getOperation() == FileOperation.MODIFY) {
fileManager.upload(event.getFile());
}
PublishRequest request = new PublishRequest();
request.setTopicArn(topicArn);
request.setSubject("Operation");
request.setMessage(((S3FileEvent)event).toJson(config.getBaseDir()));
publishToSNS(request);
}
protected void publishToSNS(PublishRequest publishRequest) {
client.publishAsync(publishRequest, new AsyncHandler<PublishRequest, PublishResult>() {
@Override
public void onError(Exception e) {
logger.severe(e.getMessage());
}
@Override
public void onSuccess(PublishRequest publishRequest, PublishResult publishResult) {
logger.info("Published " + publishRequest.getMessage());
}
});
}
private boolean shouldPublish(Event event) {
File file = event.getFile();
FileOperation operation = event.getOperation();
boolean shouldPublish = true;
// Directory modifies don't have to be sent. They are taken taken care of
// individual file updates
if (file.isDirectory() && operation.equals(FileOperation.MODIFY)) {
shouldPublish = false;
}
return shouldPublish;
}
}