diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index c903857..4f80df6 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,12 @@ 4.13.1 test + + + com.google.guava + guava + 33.4.8-jre + \ No newline at end of file diff --git a/src/main/java/org/toop/GlobalEventBus.java b/src/main/java/org/toop/GlobalEventBus.java new file mode 100644 index 0000000..0d2d355 --- /dev/null +++ b/src/main/java/org/toop/GlobalEventBus.java @@ -0,0 +1,13 @@ +package org.toop; + +import com.google.common.eventbus.EventBus; + +public enum GlobalEventBus { + INSTANCE; + + private final EventBus eventBus = new EventBus("global-bus"); + + public EventBus get() { + return eventBus; + } +} \ No newline at end of file diff --git a/src/main/java/org/toop/LoggerListener.java b/src/main/java/org/toop/LoggerListener.java new file mode 100644 index 0000000..b7feb61 --- /dev/null +++ b/src/main/java/org/toop/LoggerListener.java @@ -0,0 +1,14 @@ +package org.toop; + +import com.google.common.eventbus.Subscribe; +import org.toop.server.*; + +public class LoggerListener { + @Subscribe + public void onCommand(CommandEvent event) { + System.out.printf("LOG: %s args=%s -> %s%n", + event.command(), + String.join(",", event.args()), + event.result()); + } +} \ No newline at end of file diff --git a/src/main/java/org/toop/Main.java b/src/main/java/org/toop/Main.java index b0126c8..94d32b9 100644 --- a/src/main/java/org/toop/Main.java +++ b/src/main/java/org/toop/Main.java @@ -1,7 +1,20 @@ package org.toop; +import org.toop.server.Server; + public class Main { public static void main(String[] args) { - Server server = new Server("0.0.0.0", "5000"); + + Server server = new Server(Server.ServerBackend.LOCAL, "127.0.0.1", "5000"); + server.setBackend(Server.ServerBackend.REMOTE); + + GlobalEventBus.INSTANCE.get().register(new LoggerListener()); + + Server.Message msg = server.sendCommand(Server.Command.LOGIN, "move"); + server.sendCommand(Server.Command.LOGIN, "test"); + + System.out.println(msg); + System.out.println(server); + } } \ No newline at end of file diff --git a/src/main/java/org/toop/Server.java b/src/main/java/org/toop/Server.java deleted file mode 100644 index d05ac1b..0000000 --- a/src/main/java/org/toop/Server.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.toop; - -public class Server { - - String ip; - String port; - - public Server(String set_ip, String set_port) { - ip = set_ip; - port = set_port; - } - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - public String getPort() { - return port; - } - - public void setPort(String port) { - this.port = port; - } - -} \ No newline at end of file diff --git a/src/main/java/org/toop/server/CommandEvent.java b/src/main/java/org/toop/server/CommandEvent.java new file mode 100644 index 0000000..1e65c76 --- /dev/null +++ b/src/main/java/org/toop/server/CommandEvent.java @@ -0,0 +1,3 @@ +package org.toop.server; + +public record CommandEvent(Server.Command command, String[] args, Server.Message result) {} diff --git a/src/main/java/org/toop/server/Server.java b/src/main/java/org/toop/server/Server.java new file mode 100644 index 0000000..c0b54e8 --- /dev/null +++ b/src/main/java/org/toop/server/Server.java @@ -0,0 +1,148 @@ +package org.toop.server; + +import org.toop.GlobalEventBus; +import org.toop.server.backend.*; +import java.util.EnumSet; + +public class Server { + + public enum ServerBackend { + LOCAL, + REMOTE, + } + + public enum Command { + /** + * Login, "username" + */ + LOGIN, + /** + * Logout, "username" + */ + LOGOUT, + EXIT, + QUIT, + DISCONNECT, + BYE, + GET, + SUBSCRIBE, + MOVE, + CHALLENGE, + FORFEIT, + MESSAGE, + HELP, + } + + private static final EnumSet VALID_COMMANDS = EnumSet.of( + Command.LOGIN, Command.LOGOUT, Command.EXIT, Command.QUIT, + Command.DISCONNECT, Command.BYE, Command.GET, Command.SUBSCRIBE, + Command.MOVE, Command.CHALLENGE, Command.FORFEIT, + Command.MESSAGE, Command.HELP + ); + + public enum Message { + OK, + ERR, + SVR, + } + + String ip; + String port; + Backend backend; + + public Server(ServerBackend set_backend, String set_ip, String set_port) { + ip = set_ip; + port = set_port; + setBackend(set_backend); + + } + + public Backend getBackend() { + return backend; + } + + public void setBackend(ServerBackend backend) { + if (backend == ServerBackend.LOCAL) { this.backend = new Local(); } + else { this.backend = new Remote(); } + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public String getPort() { + return port; + } + + public void setPort(String port) { + this.port = port; + } + + private Message sendCommandString(String sentence) { + return Message.OK; + } + + private boolean isCommandValid(Command command) { + return VALID_COMMANDS.contains(command); + } + + /** + * Sends a command to the server. + * + * @param command the command to execute + * @return a Message indicating success or error + */ + public Message sendCommand(Command command) { + if (!isCommandValid(command)) { + throw new IllegalArgumentException("Invalid command: " + command); + } + Message result = sendCommandString(command.toString()); + + GlobalEventBus.INSTANCE.get().post(new CommandEvent(command, new String[0], result)); + + return sendCommandString(command.toString()); + } + + /** + * Sends a command to the server. + * + * @param command the command to execute + * @param args command arguments. + * @return a Message indicating success or error + */ + public Message sendCommand(Command command, String... args) { + if (!isCommandValid(command)) { + throw new IllegalArgumentException("Invalid command: " + command); + } + + for (int i = 0; i < args.length; i++) { + args[i] = args[i].trim(); + if (args[i].isEmpty()) { + throw new IllegalArgumentException("Empty argument"); + } + } + + String[] fullCommand = new String[args.length + 1]; + fullCommand[0] = command.toString(); + System.arraycopy(args, 0, fullCommand, 1, args.length); + + Message result = sendCommandString(String.join(" ", fullCommand)); + + GlobalEventBus.INSTANCE.get().post(new CommandEvent(command, args, result)); + + return result; + } + + @Override + public String toString() { + return String.format( + "Server {ip: \"%s\", port: \"%s\", backend: \"%s\"}", + ip, port, backend + ); + } + +} \ No newline at end of file diff --git a/src/main/java/org/toop/server/backend/Backend.java b/src/main/java/org/toop/server/backend/Backend.java new file mode 100644 index 0000000..6ba54c7 --- /dev/null +++ b/src/main/java/org/toop/server/backend/Backend.java @@ -0,0 +1,8 @@ +package org.toop.server.backend; + +import org.toop.server.Server; + +public interface Backend { + Server.Message login(String username); +} + diff --git a/src/main/java/org/toop/server/backend/Local.java b/src/main/java/org/toop/server/backend/Local.java new file mode 100644 index 0000000..e12fb67 --- /dev/null +++ b/src/main/java/org/toop/server/backend/Local.java @@ -0,0 +1,21 @@ +package org.toop.server.backend; + +import org.toop.server.Server; + +public class Local implements Backend { + @Override + public Server.Message login(String username) { + return null; + } + + @Override + public boolean equals(Object o) { + return o instanceof Local; // TODO + } + + @Override + public String toString() { + return "Local"; + } + +} diff --git a/src/main/java/org/toop/server/backend/Remote.java b/src/main/java/org/toop/server/backend/Remote.java new file mode 100644 index 0000000..4322e37 --- /dev/null +++ b/src/main/java/org/toop/server/backend/Remote.java @@ -0,0 +1,21 @@ +package org.toop.server.backend; + +import org.toop.server.Server; + +public class Remote implements Backend { + @Override + public Server.Message login(String username) { + return null; + } + + @Override + public boolean equals(Object o) { + return o instanceof Remote; // TODO + } + + @Override + public String toString() { + return "Remote"; + } + +} diff --git a/src/test/java/ServerTest.java b/src/test/java/ServerTest.java index 304b71f..d91ed67 100644 --- a/src/test/java/ServerTest.java +++ b/src/test/java/ServerTest.java @@ -1,7 +1,8 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.toop.Server; +import org.toop.server.Server; +import org.toop.server.backend.*; public class ServerTest { @@ -9,7 +10,7 @@ public class ServerTest { @Before public void setUp() { - server = new Server("127.0.0.1", "8080"); + server = new Server(Server.ServerBackend.LOCAL, "127.0.0.1", "8080"); } @Test @@ -30,6 +31,17 @@ public class ServerTest { Assert.assertEquals("9090", server.getPort()); } + @Test + public void testSetLocalBackend() { + Assert.assertEquals(new Local(), server.getBackend()); + } + + @Test + public void testSetRemoteBackend() { + server.setBackend(Server.ServerBackend.REMOTE); + Assert.assertEquals(new Remote(), server.getBackend()); + } + @Test public void testNotNullAfterConstruction() { Assert.assertNotNull(server);