package games.strategy.engine.message; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import games.strategy.engine.message.unifiedmessenger.UnifiedMessenger; /** * An implementation of IRemoteMessenger based on MessageManager and Messenger. */ public class RemoteMessenger implements IRemoteMessenger { private final UnifiedMessenger m_unifiedMessenger; public RemoteMessenger(final UnifiedMessenger messenger) { m_unifiedMessenger = messenger; } @Override public IRemote getRemote(final RemoteName remoteName) { return getRemote(remoteName, false); } @Override public IRemote getRemote(final RemoteName remoteName, final boolean ignoreResults) { final InvocationHandler ih = new UnifiedInvocationHandler(m_unifiedMessenger, remoteName.getName(), ignoreResults, remoteName.getClazz()); final IRemote rVal = (IRemote) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class<?>[] {remoteName.getClazz()}, ih); return rVal; } @Override public void registerRemote(final Object implementor, final RemoteName name) { m_unifiedMessenger.addImplementor(name, implementor, false); } @Override public void unregisterRemote(final RemoteName name) { unregisterRemote(name.getName()); } @Override public boolean isServer() { return m_unifiedMessenger.isServer(); } @Override public void unregisterRemote(final String name) { m_unifiedMessenger.removeImplementor(name, m_unifiedMessenger.getImplementor(name)); } @Override public boolean hasLocalImplementor(final RemoteName descriptor) { return m_unifiedMessenger.getLocalEndPointCount(descriptor) == 1; } @Override public String toString() { return "RemoteMessenger: " + m_unifiedMessenger.toString(); } }