package io.vivarium.net;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.java_websocket.handshake.Handshakedata;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.vivarium.net.messages.Message;
public abstract class NetworkModule
{
private ObjectMapper _messageMapper = new ObjectMapper();
private InboundNetworkListener _inboundListener;
private Map<Class<? extends Message>, List<MessageListener<? extends Message>>> _messageListeners = new HashMap<>();
public NetworkModule(InboundNetworkListener inboundListener, ObjectMapper _messageMapper)
{
_inboundListener = inboundListener;
_inboundListener.setNetworkModule(this);
}
public <T extends Message> void addMessageListener(MessageListener<T> listener, Class<T> messageClazz)
{
if (!_messageListeners.containsKey(messageClazz))
{
_messageListeners.put(messageClazz, new LinkedList<>());
}
List<MessageListener<? extends Message>> listeners = _messageListeners.get(messageClazz);
listeners.add(listener);
}
public <T extends Message> void removeMessageListener(MessageListener<T> listener, Class<T> messageClazz)
{
if (_messageListeners.containsKey(messageClazz))
{
List<MessageListener<? extends Message>> listeners = _messageListeners.get(messageClazz);
listeners.remove(listener);
}
}
protected void sendMessage(OutboundNetworkConnection outboundConnection, Message message)
{
try
{
String dataString = _messageMapper.writeValueAsString(message);
outboundConnection.send(dataString);
}
catch (JsonProcessingException e)
{
e.printStackTrace();
}
}
abstract void onOpen(OutboundNetworkConnection outboundNetworkConnection, Handshakedata handshake);
public void onClose(OutboundNetworkConnection outboundNetworkConnection, int code, String reason, boolean remote)
{
// TODO Auto-generated method stub
}
public void onMessage(OutboundNetworkConnection outboundNetworkConnection, String data)
{
try
{
Message message = _messageMapper.readValue(data, Message.class);
Class<? extends Message> messageClazz = message.getClass();
for (Class<? extends Message> listenerClazz : _messageListeners.keySet())
{
if (listenerClazz.isAssignableFrom(messageClazz))
{
List<MessageListener<? extends Message>> listeners = _messageListeners.get(listenerClazz);
for (MessageListener<? extends Message> listener : listeners)
{
listener.onMessage(null, message);
}
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
public void onError(OutboundNetworkConnection outboundNetworkConnection, Exception ex)
{
ex.printStackTrace();
}
}