From dd898c174229616be678ac7db065eeb7fc9321d0 Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger Date: Thu, 24 Mar 2022 15:36:50 +0100 Subject: [PATCH] Implemented NTtBProtocolParser.java. Still needs to be tested. --- .../dbis/cs108/Multiplayer/Client/Client.java | 19 ++++- .../Client/EmptyClientInputException.java | 15 ++++ .../Client/InputToProtocolMap.java | 16 ++++ .../Client/NTtBProtocolParser.java | 77 +++++++++++++++---- .../Multiplayer/Client/ProtocolParser.java | 14 ++++ .../Multiplayer/Protocol/NTtBCommands.java | 2 +- .../Multiplayer/Protocol/ProtocolParser.java | 8 -- 7 files changed, 124 insertions(+), 27 deletions(-) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/EmptyClientInputException.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/InputToProtocolMap.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/ProtocolParser.java delete mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Protocol/ProtocolParser.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/Client.java b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/Client.java index f4199bf..3fe5c45 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/Client.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/Client.java @@ -28,7 +28,8 @@ public class Client { Scanner sc = new Scanner(System.in); while (socket.isConnected()) { String msg = sc.nextLine(); - out.write(userName + "says: " + msg); + String encodedMsg = encodeMessage(msg); + out.write(encodedMsg); out.newLine(); out.flush(); } @@ -38,6 +39,18 @@ public class Client { } } + /** + * Uses NTtBProtocolParser to turn Client + * input into the NTtB Protocol format. + * Must be called before a client input is sent to the server. + * @param msg the msg to be encoded. + * @return Message encoded adhering to the NTtB Protocoll. + */ + private String encodeMessage(String msg) { + NTtBProtocolParser pp = new NTtBProtocolParser(this); + return pp.parseMsg(msg); + } + public void chatListener() { new Thread(new Runnable() { @Override @@ -89,4 +102,8 @@ public class Client { } } + + public String getUsername() { + return userName; + } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/EmptyClientInputException.java b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/EmptyClientInputException.java new file mode 100644 index 0000000..5355675 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/EmptyClientInputException.java @@ -0,0 +1,15 @@ +package ch.unibas.dmi.dbis.cs108.Multiplayer.Client; + +public class EmptyClientInputException extends Exception { + String exceptionMsg; + Client whoDunIt; + public EmptyClientInputException(Client whoDunIt) { + this.whoDunIt = whoDunIt; + this.exceptionMsg = whoDunIt.getUsername() + " tried to send an empty message"; + } + + public String getExceptionMsg(){ + return exceptionMsg; + } + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/InputToProtocolMap.java b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/InputToProtocolMap.java new file mode 100644 index 0000000..d2e1aa2 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/InputToProtocolMap.java @@ -0,0 +1,16 @@ +package ch.unibas.dmi.dbis.cs108.Multiplayer.Client; + +import ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol.NTtBCommands; + +import java.util.HashMap; + +public class InputToProtocolMap extends HashMap { + public InputToProtocolMap(){ + super(); + this.put("chat", NTtBCommands.CHATA); + this.put("cn", NTtBCommands.CUSRN); + this.put("list", NTtBCommands.LISTP); + this.put("exit", NTtBCommands.LEAVG); + //TODO extend according to extended function + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/NTtBProtocolParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/NTtBProtocolParser.java index e95f9f0..55412c7 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/NTtBProtocolParser.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/NTtBProtocolParser.java @@ -2,43 +2,86 @@ package ch.unibas.dmi.dbis.cs108.Multiplayer.Client; import ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol.NTtBCommands; import ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol.NTtBFormatMsg; -import ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol.NTtBParameter; -import ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol.ProtocolParser; import java.util.ArrayList; import java.util.HashMap; +import java.util.Locale; import java.util.Scanner; +/** + * Implements a protocol parser for the NTtB protocoll, + * that transforms client input + * into a server readable format. + */ public class NTtBProtocolParser implements ProtocolParser { //TODO Possibly bad name, rename to clientMsgParser? - public static HashMap inputMapper; + public final Client caller; + public static InputToProtocolMap legalCommands = new InputToProtocolMap(); - public NTtBProtocolParser(){ - this.inputMapper = new HashMap<>(); - this.inputMapper.put("chat",NTtBCommands.CHATG); + + public NTtBProtocolParser(Client caller) { + this.caller = caller; //TODO by far not done! } @Override - public NTtBFormatMsg parseMsg(String msg) { + public String parseMsg(String msg) { Scanner sc = new Scanner(msg); + String parsedMsg; + ArrayList input = new ArrayList<>(); + while(sc.hasNext()){ input.add(sc.next()); } - buildProtocolMsg(input); - return null; - //TODO needs to be finnished + + try { + parsedMsg = buildProtocolMsg(input); + } catch (EmptyClientInputException e) { + return e.getExceptionMsg(); + //TODO Where to we log this? + } + + return parsedMsg; } - private String buildProtocolMsg(ArrayList input) { + + private String buildProtocolMsg(ArrayList input) throws EmptyClientInputException{ //TODO - String cmd = parseCmd(input.get(0)); - input.remove(0); - return ""; + if(emptyClientInput(input)){ + throw new EmptyClientInputException(caller); + } + StringBuilder s = new StringBuilder(); //friendly little helper + s.append(legalCommands.get(input.get(0))); + if (containsParameters(input)) { + int size = input.size(); + for(int i = 1; i < size; i++) { + s.append("$"); + s.append(input.get(i).toLowerCase()); + } + } + return s.toString(); } - private String parseCmd(String s){ - //TODO - return ""; + /** + * Checks if input has parameters + * + * if the list size is smaller than 2, i.e. + * not larger than 1, the input only contains + * a command. + * + * @param input the tokenized input string. + * @return true if input list is larger than 2. + */ + private boolean containsParameters(ArrayList input) { + return input.size() > 1; + } + + /** + * checks if client input is empty + * @param clientInput the clients input. + * @return true if client didn't send any input besides whitespace + */ + private boolean emptyClientInput(ArrayList clientInput) { + return clientInput.isEmpty(); } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/ProtocolParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/ProtocolParser.java new file mode 100644 index 0000000..c738c87 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Client/ProtocolParser.java @@ -0,0 +1,14 @@ +package ch.unibas.dmi.dbis.cs108.Multiplayer.Client; + +import ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol.NTtBFormatMsg; +import ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol.ProtocolMessage; + +public interface ProtocolParser { + /** + * Takes a String from client input and parses into + * server readable message. + * @param msg the message to be parsed + * @return a String message formatted for the specific protocol + */ + String parseMsg(String msg); +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Protocol/NTtBCommands.java b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Protocol/NTtBCommands.java index 6a2ffd2..26bc9d8 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Protocol/NTtBCommands.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Protocol/NTtBCommands.java @@ -15,5 +15,5 @@ public enum NTtBCommands { * QUITS: quit server/ leave servr * LISTP: list players/clients in session with the Server */ - CRTGM, CHATA, CHATW, CHATG, LEAVG, JOING, VOTEG, QUITS, LISTP + CRTGM, CHATA, CHATW, CHATG, LEAVG, JOING, VOTEG, QUITS, LISTP, CUSRN } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Protocol/ProtocolParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Protocol/ProtocolParser.java deleted file mode 100644 index a32e8db..0000000 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/Multiplayer/Protocol/ProtocolParser.java +++ /dev/null @@ -1,8 +0,0 @@ -package ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol; - -import ch.unibas.dmi.dbis.cs108.Multiplayer.Protocol.NTtBFormatMsg; - -public interface ProtocolParser { - - ProtocolMessage parseMsg(String msg); -}