package actors; import java.util.HashMap; import java.util.Map; import play.Logger; import play.libs.Akka; import play.mvc.WebSocket.Out; import actors.messages.CloseConnectionEvent; import actors.messages.NewConnectionEvent; import actors.messages.UserEvent; import akka.actor.ActorRef; import akka.actor.Props; import akka.actor.UntypedActor; import com.fasterxml.jackson.databind.JsonNode; public class EventPublisher extends UntypedActor { public static ActorRef ref = Akka.system().actorOf(Props.create(EventPublisher.class)); private Map<String, Out<JsonNode>> connections = new HashMap<String, Out<JsonNode>>(); @Override public void onReceive(Object message) throws Exception { // TODO add event handling logic if(message instanceof NewConnectionEvent) { final NewConnectionEvent nce = (NewConnectionEvent) message; connections.put(nce.uuid(), nce.out()); Logger.info("New browser connected " + nce.uuid()); } else if(message instanceof CloseConnectionEvent) { final CloseConnectionEvent cce = (CloseConnectionEvent) message; final String uuid = cce.uuid(); connections.remove(uuid); Logger.info("Browser " + uuid + "is disconnected"); } else if(message instanceof UserEvent) { broadcastEvent((UserEvent)message); } else { unhandled(message); } } private void broadcastEvent(UserEvent message) { for(Out<JsonNode> out: connections.values()) { out.write(message.json()); } } }