package org.jacpfx.server;
import org.jacpfx.ws.WebSocketRepository;
import org.vertx.java.core.buffer.Buffer;
import org.vertx.java.core.eventbus.Message;
import org.vertx.java.core.http.HttpServer;
import org.vertx.java.core.http.ServerWebSocket;
import org.vertx.java.platform.Verticle;
/**
* Created by Andy Moncsek on 13.12.13.
*/
public class RemoteDrawingServer extends Verticle {
private WebSocketRepository repository = new WebSocketRepository();
public static Integer PORT_NUMER = 8080;
@Override
public void start() {
final HttpServer httpServer = startServer();
registerEventBusMessageHandler();
registerWebsocketHandler(httpServer);
httpServer.listen(PORT_NUMER);
this.container.logger().info("started : " + this);
}
private HttpServer startServer() {
return vertx.createHttpServer();
}
private void registerEventBusMessageHandler() {
vertx.eventBus().registerHandler("org.jacpfx.draw.message", this::handleWSMessagesFromBus);
}
/**
* Handle redirected messages from WebSocket.
*
* @param message
*/
private void handleWSMessagesFromBus(final Message<byte[]> message) {
repository.getWebSockets()
.stream()
.forEach(ws -> ws.writeBinaryFrame(new Buffer(message.body())));
}
/**
* Registers onMessage and onClose message handler for WebSockets
*
* @param httpServer
*/
private void registerWebsocketHandler(final HttpServer httpServer) {
httpServer.websocketHandler((serverSocket) -> {
repository.addWebSocket(serverSocket);
serverSocket.dataHandler(this::redirectWSMessageToBus);
serverSocket.closeHandler((close) -> handleConnectionClose(close, serverSocket));
});
}
/**
* handles connection close
*
* @param event
*/
private void handleConnectionClose(final Void event, ServerWebSocket socket) {
repository.removeWebSocket(socket);
}
/**
* handles websocket messages and redirect to message bus
*
* @param data
*/
private void redirectWSMessageToBus(final Buffer data) {
vertx.eventBus().publish("org.jacpfx.draw.message", data.getBytes());
}
}