package org.caudexorigo.http.netty;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import org.jboss.netty.handler.codec.http.websocketx.WebSocketFrame;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DefaultWebSocketHandler implements WebSocketHandler
{
private static final Logger log = LoggerFactory.getLogger(DefaultWebSocketHandler.class);
private static final Set<Channel> _members = Collections.newSetFromMap(new ConcurrentHashMap<Channel, Boolean>());
public DefaultWebSocketHandler()
{
super();
}
@Override
public void handleMessage(Channel channel, WebSocketFrame ws_frame)
{
if (ws_frame.i)
{
handleTextMessage(channel, ws_frame.getTextData());
}
else if (ws_frame.isBinary())
{
handleBinaryMessage(channel, ws_frame.getBinaryData());
}
else
{
throw new IllegalArgumentException("Unknown message type for 'org.caudexorigo.http.netty.DefaultWebSocketHandler'");
}
}
public void handleTextMessage(Channel channel, String message)
{
if (log.isDebugEnabled())
{
log.debug("Channel '{}'. Message: '{}'", channel.getRemoteAddress(), message);
}
if (log.isDebugEnabled())
{
int s = _members.size();
if (s == 0)
{
log.debug("No connected clients");
}
if (s == 1)
{
log.debug("Send message to 1 connected client");
}
else
{
log.debug("Send message to {} connected clients", s);
}
}
DefaultWebSocketFrame ws_frame = new DefaultWebSocketFrame(message);
int mark = ws_frame.getBinaryData().readerIndex();
for (Channel ch : _members)
{
// DefaultWebSocketFrame ws_frame = new DefaultWebSocketFrame(message.toUpperCase());
ch.write(ws_frame);
ws_frame.getBinaryData().readerIndex(mark);
}
}
public void handleBinaryMessage(Channel channel, ChannelBuffer buffer)
{
throw new IllegalArgumentException("Processing of binary messages is not implemented in the Default 'web sockets' handler");
}
@Override
public void handleWebSocketClosed(Channel channel)
{
boolean closed = _members.remove(channel);
if (closed)
{
if (log.isDebugEnabled())
{
log.debug("Web Socket Closed: '{}'", channel.getRemoteAddress());
}
}
}
@Override
public void handleWebSocketOpened(Channel channel)
{
_members.add(channel);
if (log.isDebugEnabled())
{
log.debug("Web Socket Open: '{}'", channel.getRemoteAddress());
}
}
}