package org.deephacks.westty.internal.sockjs;
import org.deephacks.westty.cluster.Cluster;
import org.deephacks.westty.cluster.DistributedMultiMap;
import org.deephacks.westty.config.ServerConfig;
import org.deephacks.westty.config.ServerSpecificConfigProxy;
import org.deephacks.westty.config.SockJsConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.vertx.java.core.eventbus.EventBus;
import org.vertx.java.core.eventbus.impl.ClusterManager;
import org.vertx.java.core.eventbus.impl.DefaultEventBus;
import org.vertx.java.core.eventbus.impl.SubsMap;
import org.vertx.java.core.eventbus.impl.hazelcast.HazelcastServerID;
import org.vertx.java.core.impl.DefaultVertx;
import org.vertx.java.core.impl.VertxInternal;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Iterator;
@Singleton
public class WesttyVertx extends DefaultVertx {
private Logger log = LoggerFactory.getLogger(WesttyVertx.class);
private WesttyEventBus bus;
private Cluster cluster;
private SockJsConfig sockjs;
private ServerConfig server;
@Inject
private Instance<Cluster> clusterInstance;
@Inject
public WesttyVertx(ServerSpecificConfigProxy<ServerConfig> server, ServerSpecificConfigProxy<SockJsConfig> sockjs){
this.server = server.get();
this.sockjs = sockjs.get();
}
public WesttyVertx() {
super();
}
@Override
public EventBus eventBus() {
if (bus != null) {
return bus;
}
Iterator<Cluster> it = clusterInstance.iterator();
if (it.hasNext()) {
cluster = it.next();
}
if (cluster == null) {
log.info("Creating standalone vertx.");
bus = new WesttyEventBus(this);
} else {
log.info("Creating cluster vertx on {}:{} with members " + cluster.getMembers(),
server.getPrivateIp(), sockjs.getEventBusPort());
bus = new WesttyEventBus(this, sockjs.getEventBusPort(), server.getPrivateIp());
}
return bus;
}
public class WesttyEventBus extends DefaultEventBus {
public WesttyEventBus(WesttyVertx vertx) {
super(vertx);
}
public WesttyEventBus(WesttyVertx vertx, int port, String host) {
super(vertx, port, host);
}
@Override
protected ClusterManager createClusterManager(VertxInternal vertx) {
return new WesttyVertxClusterManager(vertx);
}
}
public class WesttyVertxClusterManager implements ClusterManager {
private final VertxInternal vertx;
public WesttyVertxClusterManager(VertxInternal vertx) {
this.vertx = vertx;
}
@Override
public SubsMap getSubsMap(String name) {
DistributedMultiMap<String, HazelcastServerID> map = cluster.getMultiMap(name);
return new WesttySubsMap(name, vertx, map);
}
@Override
public void close() {
}
}
}