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 } }