package games.strategy.engine.message;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import games.strategy.engine.message.unifiedmessenger.UnifiedMessenger;
import games.strategy.net.INode;
/**
* Implementation of IChannelMessenger built on top of an IMessenger.
*/
public class ChannelMessenger implements IChannelMessenger {
private final UnifiedMessenger m_unifiedMessenger;
public ChannelMessenger(final UnifiedMessenger messenger) {
m_unifiedMessenger = messenger;
}
public UnifiedMessenger getUnifiedMessenger() {
return m_unifiedMessenger;
}
@Override
public IChannelSubscribor getChannelBroadcastor(final RemoteName channelName) {
final InvocationHandler ih =
new UnifiedInvocationHandler(m_unifiedMessenger, channelName.getName(), true, channelName.getClazz());
final IChannelSubscribor rVal = (IChannelSubscribor) Proxy
.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class<?>[] {channelName.getClazz()}, ih);
return rVal;
}
@Override
public void registerChannelSubscriber(final Object implementor, final RemoteName channelName) {
if (!IChannelSubscribor.class.isAssignableFrom(channelName.getClazz())) {
throw new IllegalStateException(channelName.getClazz() + " is not a channel subscribor");
}
m_unifiedMessenger.addImplementor(channelName, implementor, true);
}
@Override
public void unregisterChannelSubscriber(final Object implementor, final RemoteName channelName) {
m_unifiedMessenger.removeImplementor(channelName.getName(), implementor);
}
@Override
public INode getLocalNode() {
return m_unifiedMessenger.getLocalNode();
}
@Override
public boolean isServer() {
return m_unifiedMessenger.isServer();
}
@Override
public String toString() {
return "ChannelMessenger: " + m_unifiedMessenger.toString();
}
}