DS-Lab / src / main / java / dslab / rmi / stub / dmap / DmapClientStubImpl.java
DmapClientStubImpl.java
Raw
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();
    }
}