package er.woadaptor.websockets;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.jboss.netty.channel.Channel;
import com.webobjects.foundation.NSNotification;
import com.webobjects.foundation.NSNotificationCenter;
import com.webobjects.foundation.NSSelector;
import er.extensions.eof.ERXConstant;
public class WebSocketStore {
private static final NSSelector<Void> CHANNEL_CLOSED = new NSSelector<Void>("channelClosed", ERXConstant.NotificationClassArray);
private static final WebSocketStore _store = new WebSocketStore();
private final Map<Channel, WebSocket> _map = Collections.synchronizedMap(new HashMap<Channel, WebSocket>());
private WebSocketFactory _factory;
public static final String CHANNEL_CLOSED_NOTIFICATION = "WebSocketStoreChannelClosed";
public static WebSocketStore defaultWebSocketStore() {
return _store;
}
public WebSocket socketForChannel(Channel channel) {
return _map.get(channel);
}
public void takeSocketForChannel(WebSocket socket, Channel channel) {
NSNotificationCenter.defaultCenter().addObserver(this, CHANNEL_CLOSED, CHANNEL_CLOSED_NOTIFICATION, channel);
_map.put(channel, socket);
}
public WebSocketFactory factory() {
return _factory;
}
public void setFactory(WebSocketFactory factory) {
_factory = factory;
}
public void channelClosed(NSNotification n) {
Channel channel = (Channel)n.object();
WebSocket socket = _map.remove(channel);
if(socket != null) {
socket.didClose();
}
}
}