package dslab.rmi.stub.dmap; import dslab.protocol.dmap.Dmap; import dslab.rmi.channel.EncryptableSocketChannel; import dslab.rmi.serialize.dmap.DmapClientSerializer; import dslab.rmi.serialize.dmap.DmapServerSerializer.DmapCommand; import dslab.rmi.stub.ClientStub; import java.lang.reflect.Method; import java.nio.channels.ClosedChannelException; import static java.util.Arrays.asList; public class DmapClientStubImpl extends ClientStub<Dmap> implements DmapClientStubFragment { /** * Do not instantiate this class directly. Use {@link dslab.ComponentFactory#newDmtpInstance} instead. */ public DmapClientStubImpl(EncryptableSocketChannel channel) { super(channel, new DmapClientSerializer()); } @Override protected String getProtocolName() { return "DMAP2.0"; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (asList(Dmap.class.getMethods()).contains(method)) { var command = DmapCommand.valueOf(method.getName()); Object arg = null; if (args == null) arg = null; else if (args.length == 1) arg = args[0]; else if (args.length > 1) arg = asList(args); return call(command, arg).get(); } else if (asList(DmapClientStub.class.getMethods()).contains(method)) return method.invoke(this, args); throw new NoSuchMethodError(method.toString()); } @Override public void startsecure() throws ClosedChannelException { ((EncryptableSocketChannel) channel).initiateStartSecure(); } }