package org.peerbox.notifications;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import net.engio.mbassy.listener.Handler;
import org.peerbox.app.manager.file.messages.RemoteFileAddedMessage;
import org.peerbox.app.manager.file.messages.RemoteFileDeletedMessage;
import org.peerbox.app.manager.file.messages.RemoteFileMovedMessage;
import org.peerbox.app.manager.file.messages.RemoteFileUpdatedMessage;
import org.peerbox.events.IMessageListener;
import org.peerbox.events.MessageBus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
public class FileEventAggregator implements IMessageListener {
private static final Logger logger = LoggerFactory.getLogger(FileEventAggregator.class);
protected static final int AGGREGATION_TIMESPAN = 10000;
private final MessageBus messageBus;
private List<Path> addedFiles;
private List<Path> movedFiles;
private List<Path> updatedFiles;
private List<Path> deletedFiles;
private volatile Timer timer;
@Inject
public FileEventAggregator(MessageBus messageBus) {
this.messageBus = messageBus;
addedFiles = new ArrayList<Path>();
movedFiles = new ArrayList<Path>();
updatedFiles = new ArrayList<Path>();
deletedFiles = new ArrayList<Path>();
}
@Handler
public void onFileAdded(RemoteFileAddedMessage message) {
logger.trace("onFileAdded.");
Path path = message.getFile().getPath();
addedFiles.add(path);
scheduleNotification();
}
@Handler
public void onFileMoved(RemoteFileMovedMessage message) {
logger.trace("onFileMoved.");
Path path = message.getFile().getPath();;
movedFiles.add(path);
scheduleNotification();
}
@Handler
public void onFileUpdated(RemoteFileUpdatedMessage message) {
logger.trace("onFileUpdated.");
Path path = message.getFile().getPath();
updatedFiles.add(path);
scheduleNotification();
}
@Handler
public void onFileDeleted(RemoteFileDeletedMessage message) {
logger.trace("onFileDeleted.");
Path path = message.getFile().getPath();
deletedFiles.add(path);
scheduleNotification();
}
private void scheduleNotification() {
if(timer == null) {
timer = new Timer(getClass().getName());
timer.schedule(new TimerTask() {
List<Path> added = null;
List<Path> updated = null;
List<Path> deleted = null;
List<Path> moved = null;
@Override
public void run() {
timer = null;
synchronized (addedFiles) {
added = addedFiles;
addedFiles = new ArrayList<Path>();
}
synchronized (updatedFiles) {
updated = updatedFiles;
updatedFiles = new ArrayList<Path>();
}
synchronized (deletedFiles) {
deleted = deletedFiles;
deletedFiles = new ArrayList<Path>();
}
synchronized (movedFiles){
moved = movedFiles;
movedFiles = new ArrayList<Path>();
}
AggregatedFileEventStatus event = new AggregatedFileEventStatus(added.size(),
updated.size(), deleted.size(), moved.size());
messageBus.publish(event);
}
}, AGGREGATION_TIMESPAN);
}
// else: already scheduled...
}
}