DS-Lab / src / main / java / dslab / rmi / serialize / dmap / DmapServerSerializer.java
DmapServerSerializer.java
Raw
package dslab.rmi.serialize.dmap;

import dslab.protocol.dmap.Dmap;
import dslab.rmi.serialize.Executors.DmapExecutor;
import dslab.rmi.serialize.IllegalCommandException;
import dslab.rmi.serialize.ParseException;
import dslab.rmi.serialize.ServerSerializer;

import java.util.StringTokenizer;

import static java.util.Arrays.stream;
import static java.util.stream.Collectors.joining;

/**
 * This class translates textual representation of DMAP commands to semantical representation
 */
public class DmapServerSerializer extends ServerSerializer<Dmap> {


    private static final String OK = "ok";

    public DmapExecutor<?> deserialize(String request) throws ParseException, IllegalCommandException {

        super.tokenizer = new StringTokenizer(request);

        switch (dmapCommand(arg("command"))) {

        case login: return login(arg("username"), arg("password"));
        case list: return list();
        case show: return show(intArg("message-id"));
        case delete: return delete(intArg("message-id"));
        case logout: return logout();
        case quit: return quit();

        default: throw new IllegalStateException(); //never happens

        }
    }

    @Override
    public String serialize(Object object) {
        if (object == null) object = "ok";
        return object.toString();
    }


    private DmapExecutor<String> list() throws ParseException {
        assertEndOfLine();
        return dmap -> {
            var result = dmap.list()
                    .stream()
                    .map(x -> x.toString() + "\n")
                    .collect(joining())
                    + "ok";
            return result;
        };
    }

    private DmapCommand dmapCommand(String command) throws IllegalCommandException {
        return stream(DmapCommand.values())
                .filter(x -> x.name().equals(command))
                .findAny()
                .orElseThrow(() -> new IllegalCommandException(command));
    }

    private DmapExecutor<String> login(String username, String password) throws ParseException {
        assertEndOfLine();
        return dmap -> {
            dmap.login(username, password);
            return OK;
        };
    }

    private DmapExecutor<String> quit() throws ParseException {
        assertEndOfLine();
        return dmap -> {
            dmap.quit();
            return OK + " bye";
        };
    }

    private DmapExecutor<String> logout() throws ParseException {
        assertEndOfLine();
        return dmap -> {
            dmap.logout();
            return OK;
        };
    }

    private DmapExecutor<String> delete(Integer id) throws ParseException {
        assertEndOfLine();
        return dmap -> {
            dmap.delete(id);
            return OK;
        };
    }

    private DmapExecutor<String> show(Integer id) throws ParseException {
        assertEndOfLine();
        return dmap -> dmap.show(id).toGuiString() + "\n" + "ok";
    }

    public enum DmapCommand {
        login, list, show, delete, logout, startsecure, quit
    }
}