package services;
import akka.actor.*;
import akka.japi.pf.ReceiveBuilder;
import models.LogMessage;
import play.libs.Akka;
import utils.LogGenerator;
import java.util.Deque;
import java.util.HashSet;
public class LogService extends AbstractActor {
private static final ActorRef ref = Akka.system().actorOf(Props.create(LogService.class), "logService");
public static ActorRef instance() {
return ref;
}
final HashSet<ActorRef> watchers = new HashSet<ActorRef>();
final Deque<LogMessage> logHistory = LogGenerator.history(10);
public LogService() {
this(new LogGenerator());
}
public LogService(LogGenerator logGenerator) {
receive(ReceiveBuilder
.match(LogProtocol.Latest.class, update -> {
LogMessage newMessage = logGenerator.newMessage();
logHistory.add(newMessage);
logHistory.remove();
watchers.forEach(watcher -> watcher.tell(new LogProtocol.Update(newMessage), self()));
})
.match(LogProtocol.Watch.class, watch -> {
sender().tell(new LogProtocol.History(logHistory), self());
watchers.add(sender());
})
.match(LogProtocol.Unwatch.class, unwatch -> {
watchers.remove(sender());
})
.build());
}
}