From 1d500e6973c56c4a4654294d9e094e2bbff4387b Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 9 Apr 2026 18:18:01 +0200 Subject: [PATCH 01/10] Add: ListUsersRequest to request collection of active users --- .../app/commands/list_users/ListUsersRequest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersRequest.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersRequest.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersRequest.java new file mode 100644 index 0000000..9eedbb9 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersRequest.java @@ -0,0 +1,10 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.list_users; + +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.Request; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext; + +public class ListUsersRequest extends Request { + public ListUsersRequest(RequestContext context) { + super(context); + } +} From 40d623fbb76f7105660721eb0182126d03f777d8 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 9 Apr 2026 18:19:10 +0200 Subject: [PATCH 02/10] Add: ListUsersParser to parse request --- .../app/commands/list_users/ListUsersParser.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersParser.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersParser.java new file mode 100644 index 0000000..9cb9bb8 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersParser.java @@ -0,0 +1,11 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.list_users; + +import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.CommandParser; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.PrimitiveRequest; + +public class ListUsersParser implements CommandParser { + @Override + public ListUsersRequest parse(PrimitiveRequest primitiveRequest) { + return new ListUsersRequest(primitiveRequest.context()); + } +} From 239dfa714e06c4e8e102da3e72ec1cfbeefcb3d3 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 9 Apr 2026 18:30:14 +0200 Subject: [PATCH 03/10] Add: ListUsersResponse to convert collection of users to response body --- .../list_users/ListUsersResponse.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersResponse.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersResponse.java new file mode 100644 index 0000000..2458fff --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersResponse.java @@ -0,0 +1,24 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.list_users; + +import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.User; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.SuccessResponse; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBody; +import java.util.Collection; + +public class ListUsersResponse extends SuccessResponse { + public ListUsersResponse(RequestContext context, Collection users) { + super( + context, + ResponseBody.builder() + .block( + "USERS", + users_block -> { + for (User user : users) { + users_block.param("USERNAME", user.getName()); + users_block.param("ID", user.getId()); + } + }) + .build()); + } +} From 627c38da6f1aa609fb091c80180f8bcf811fd8f9 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 9 Apr 2026 18:46:20 +0200 Subject: [PATCH 04/10] Add: ListUsersHandler to handle user listing command --- .../commands/list_users/ListUsersHandler.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersHandler.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersHandler.java new file mode 100644 index 0000000..69a986e --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersHandler.java @@ -0,0 +1,22 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.list_users; + +import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.User; +import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.UserRegistry; +import ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution.CommandHandler; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatcher.ResponseDispatcher; +import java.util.Collection; + +public class ListUsersHandler extends CommandHandler { + private final UserRegistry userRegistry; + + public ListUsersHandler(ResponseDispatcher responseDispatcher, UserRegistry userRegistry) { + super(responseDispatcher); + this.userRegistry = userRegistry; + } + + @Override + public void execute(ListUsersRequest request) { + Collection users = userRegistry.getAllUsers(); + responseDispatcher.dispatch(new ListUsersResponse(request.getContext(), users)); + } +} From f59f5c5930deb3fdf92ce0ec550d9bc49ba22965 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 9 Apr 2026 18:46:45 +0200 Subject: [PATCH 05/10] Add: Registration of parser and handler to composition root --- .../ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java index febc9a9..57729a8 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java @@ -3,6 +3,9 @@ package ch.unibas.dmi.dbis.cs108.casono.server; import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick.CheckUsernameHandler; import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick.CheckUsernameParser; import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick.CheckUsernameRequest; +import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.list_users.ListUsersHandler; +import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.list_users.ListUsersParser; +import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.list_users.ListUsersRequest; import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.login.LoginHandler; import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.login.LoginParser; import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.login.LoginRequest; @@ -106,5 +109,9 @@ public class ServerApp { parserDispatcher.register("LOGOUT", new LogoutParser()); commandRouter.register( LogoutRequest.class, new LogoutHandler(responseDispatcher, userRegistry)); + + parserDispatcher.register("LIST_USERS", new ListUsersParser()); + commandRouter.register( + ListUsersRequest.class, new ListUsersHandler(responseDispatcher, userRegistry)); } } From a164f87379b47fa200af6124e42fc9e49f96bbc8 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 9 Apr 2026 18:48:24 +0200 Subject: [PATCH 06/10] Fix: Correctly retrieve user ID value in ListUsersResponse --- .../server/app/commands/list_users/ListUsersResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersResponse.java index 2458fff..d95aeed 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersResponse.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersResponse.java @@ -16,7 +16,7 @@ public class ListUsersResponse extends SuccessResponse { users_block -> { for (User user : users) { users_block.param("USERNAME", user.getName()); - users_block.param("ID", user.getId()); + users_block.param("ID", user.getId().value()); } }) .build()); From a96c050c55cbd3069d664e88e09e22c1a11e8df3 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 9 Apr 2026 18:53:26 +0200 Subject: [PATCH 07/10] Fix: ListUsersResponse to properly encapsulate user parameters in a block --- .../server/app/commands/list_users/ListUsersResponse.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersResponse.java index d95aeed..bedeb5a 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersResponse.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersResponse.java @@ -15,8 +15,12 @@ public class ListUsersResponse extends SuccessResponse { "USERS", users_block -> { for (User user : users) { - users_block.param("USERNAME", user.getName()); - users_block.param("ID", user.getId().value()); + users_block.block( + "USER", + user_block -> { + user_block.param("USERNAME", user.getName()); + user_block.param("ID", user.getId().value()); + }); } }) .build()); From bb1e026a1eb6f5a71f4b51b515f58f7fa2a632c7 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 9 Apr 2026 18:59:18 +0200 Subject: [PATCH 08/10] Docs: Update protocol document for LIST_USERS command --- .../networking/commands/protocol-document.md | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/documents/docs/networking/commands/protocol-document.md b/documents/docs/networking/commands/protocol-document.md index a546a97..b08cf7f 100644 --- a/documents/docs/networking/commands/protocol-document.md +++ b/documents/docs/networking/commands/protocol-document.md @@ -43,6 +43,13 @@ This document describes the protocol for client-server communication in our appl - [Error Response](#error-response-5) - [Example Request](#example-request-3) - [Example Response](#example-response-3) + - [LIST\_USERS command](#list_users-command) + - [Required pre-execution checks](#required-pre-execution-checks-4) + - [Request Parameters](#request-parameters-4) + - [Success Response](#success-response-4) + - [Error Response](#error-response-6) + - [Example Request](#example-request-4) + - [Example Response](#example-response-4) @@ -287,3 +294,51 @@ LOGOUT +OK END ``` + +## LIST_USERS command +The `LIST_USERS` command is used to retrieve a list of all currently logged-in users. + +### Required pre-execution checks +None. + +### Request Parameters +No parameters. + +### Success Response +| Field | Type | Description | +| :------ | :----------------- | :--------------------------------------- | +| `USERS` | `Collection` | Collection of all users currently online | + +| Fields of `User` | Type | Description | +| :--------------- | :---------------------------------------------------------------------- | :-------------------------------------------------------------------- | +| `USERNAME` | `String` | Username of the newly created user, can differ from the requested one | +| `ID` | [`UUID`](https://docs.oracle.com/javase/8/docs/api/java/util/UUID.html) | The ID of the created user | + + +### Error Response +None. + +### Example Request +``` +LIST_USERS +``` + +### Example Response +``` ++OK + USERS + USER + USERNAME=Lars_001 + ID=56765d0f-8cd3-4eec-91b2-7e36265c1a5d + END + USER + USERNAME=Lars_002 + ID=b7bbd9b3-0d49-4c92-8306-b1c8506d2ff0 + END + USER + USERNAME=Lars + ID=982bc78e-547f-495a-a821-433a3603f92c + END + END +END +``` \ No newline at end of file From afef96ce2198c315e2d15951d5b712244e8eee4f Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 9 Apr 2026 19:07:08 +0200 Subject: [PATCH 09/10] Docs: Write JavaDoc for newly added components --- .../commands/list_users/ListUsersHandler.java | 18 ++++++++++++++++++ .../commands/list_users/ListUsersParser.java | 7 +++++++ .../commands/list_users/ListUsersRequest.java | 7 +++++++ .../commands/list_users/ListUsersResponse.java | 7 +++++++ 4 files changed, 39 insertions(+) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersHandler.java index 69a986e..2ad7fe2 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersHandler.java @@ -6,14 +6,32 @@ import ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution.CommandH import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatcher.ResponseDispatcher; import java.util.Collection; +/** + * Handles {@link ListUsersRequest}s by retrieving all users from the {@link UserRegistry} and + * dispatching a {@link ListUsersResponse} containing the list of users. + */ public class ListUsersHandler extends CommandHandler { private final UserRegistry userRegistry; + /** + * Creates a new handler for listing all users + * + * @param responseDispatcher the dispatcher used to send the response + * @param userRegistry the registry used to look up existing users + */ public ListUsersHandler(ResponseDispatcher responseDispatcher, UserRegistry userRegistry) { super(responseDispatcher); this.userRegistry = userRegistry; } + /** + * Executes the list users request + * + *

All users are retrieved from the {@link UserRegistry} and returned in a {@link + * ListUsersResponse}. + * + * @param request the request to execute + */ @Override public void execute(ListUsersRequest request) { Collection users = userRegistry.getAllUsers(); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersParser.java index 9cb9bb8..f55149e 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersParser.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersParser.java @@ -3,7 +3,14 @@ package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.list_users; import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.CommandParser; import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.PrimitiveRequest; +/** Parses a primitive request into a {@link ListUsersRequest}. */ public class ListUsersParser implements CommandParser { + /** + * Parses a primitive request into a ListUsersRequest. + * + * @param primitiveRequest the request to parse + * @return the created {@link ListUsersRequest} + */ @Override public ListUsersRequest parse(PrimitiveRequest primitiveRequest) { return new ListUsersRequest(primitiveRequest.context()); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersRequest.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersRequest.java index 9eedbb9..9ed8fdd 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersRequest.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersRequest.java @@ -3,7 +3,14 @@ package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.list_users; import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.Request; import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext; +/** Request implementation used to retrieve all existing users from the server. */ public class ListUsersRequest extends Request { + /** + * Constructs a new ListUsersRequest with the given context + * + * @param context the {@link RequestContext} containing information for responding to the + * request + */ public ListUsersRequest(RequestContext context) { super(context); } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersResponse.java index bedeb5a..4e48aaf 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersResponse.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/list_users/ListUsersResponse.java @@ -6,7 +6,14 @@ import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.SuccessR import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBody; import java.util.Collection; +/** Response containing a list of all active users on the server */ public class ListUsersResponse extends SuccessResponse { + /** + * Creates a new ListUsersResponse containing the given list of users + * + * @param context the {@link RequestContext} associated with the request + * @param users the collection of users currently active on the server + */ public ListUsersResponse(RequestContext context, Collection users) { super( context, From 4071be33410744880f27e6cf3ebb9bd7a5fbe137 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Thu, 9 Apr 2026 19:14:15 +0200 Subject: [PATCH 10/10] Fix: Change execute method in CommandHandler to be abstract --- .../casono/server/network/command/execution/CommandHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandHandler.java index f0f8b97..4e82e3a 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/network/command/execution/CommandHandler.java @@ -52,5 +52,5 @@ public abstract class CommandHandler { * * @param request the request to execute, of type T */ - public void execute(T request) {} + public abstract void execute(T request); }