package rfx.server.http.websocket;
import io.netty.channel.Channel;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class WebSocketChannelManager {
static Map<String, Map<Object,Channel>> channelsPool = new HashMap<>();
static WebSocketChannelManager _instance;
public WebSocketChannelManager() {}
public static WebSocketChannelManager get(String query){
if(_instance == null){
_instance = new WebSocketChannelManager();
channelsPool.put(query, new HashMap<Object,Channel>());
}
return _instance;
}
public static WebSocketChannelManager get(){
if(_instance == null){
_instance = new WebSocketChannelManager();
}
return _instance;
}
public void addChannel(String query, Object k, Channel channel){
Map<Object,Channel> channels = channelsPool.get(query);
if(channels == null ){
channels = new HashMap<Object,Channel>();
channelsPool.put(query, channels);
}
channels.put(k,channel);
System.out.println("channels.size: "+channels.size());
}
public void removeWebSocketChannel(Object k, boolean forceClose){
Collection<Map<Object,Channel>> channelsMap = channelsPool.values();
for (Map<Object, Channel> channels : channelsMap) {
Channel c = channels.remove(k);
try {
if(c != null && forceClose) c.close();
} catch (Exception e) {}
finally {
System.out.println("channels.size: "+channels.size());
}
}
}
public void broadcastMessageToAllChannels(String query, String message){
System.out.println("channelsPool.size: "+channelsPool.size());
Map<Object,Channel> channels = channelsPool.get(query);
if(channels != null ){
Set<Object> keys = channels.keySet();
for (Object key : keys) {
Channel webSocketChannel = channels.get(key);
//System.out.println(webSocketChannel.toString());
if(webSocketChannel != null){
webSocketChannel.write(new TextWebSocketFrame(message));
webSocketChannel.flush();
}
}
}
}
}