diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/CommandParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/CommandParser.java new file mode 100644 index 0000000..ae00bca --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/CommandParser.java @@ -0,0 +1,15 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.network.parser; + +/** + * Parser to convert the PrimitiveRequest to a Request and performing checks for required fields and + * data types + */ +public interface CommandParser { + /** + * Parses the provided PrimitiveRequest into a command-specific request + * + * @param primitiveRequest + * @return + */ + Request parse(PrimitiveRequest primitiveRequest); +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/CommandParserDispatcher.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/CommandParserDispatcher.java new file mode 100644 index 0000000..722815c --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/CommandParserDispatcher.java @@ -0,0 +1,36 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.network.parser; + +import java.util.HashMap; +import java.util.Map; + +/** Dispatcher all CommandParser are registered in */ +public class CommandParserDispatcher { + private final Map parsers = new HashMap<>(); + + /** + * Register a new CommandParser + * + * @param command + * @param parser the parser class + */ + public void register(String command, CommandParser parser) { + parsers.put(command, parser); + } + + /** + * Parses the PrimitiveRequest into a Request using the appropriate CommandParser + * + * @param primitiveRequest the PrimitiveRequest to parse + * @return the parsed Request object + */ + public Request parse(PrimitiveRequest primitiveRequest) { + String command = primitiveRequest.command(); + CommandParser parser = parsers.get(command); + + if (parser == null) { + throw new UnknownCommandException(command); + } + + return parser.parse(primitiveRequest); + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/Request.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/Request.java new file mode 100644 index 0000000..4018a31 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/Request.java @@ -0,0 +1,4 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.network.parser; + +/** Request, produced by the CommandParser */ +public interface Request {} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/UnknownCommandException.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/UnknownCommandException.java new file mode 100644 index 0000000..5048d70 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/parser/UnknownCommandException.java @@ -0,0 +1,11 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.network.parser; + +/** + * Exception thrown when the CommandParserDispatcher has no registered handler for the provided + * request + */ +public class UnknownCommandException extends RuntimeException { + public UnknownCommandException(String message) { + super(message); + } +}