diff --git a/src/main/java/com/rosetta/im/AppContext.java b/src/main/java/com/rosetta/im/AppContext.java new file mode 100644 index 0000000..960adb9 --- /dev/null +++ b/src/main/java/com/rosetta/im/AppContext.java @@ -0,0 +1,22 @@ +package com.rosetta.im; + +import com.rosetta.im.event.EventManager; + +import io.orprotocol.Context; + +/** + * Контекст приложения, хранящий глобальные объекты + */ +public class AppContext extends Context { + + private EventManager eventManager; + + public AppContext(EventManager eventManager) { + this.eventManager = eventManager; + } + + public EventManager getEventManager() { + return eventManager; + } + +} diff --git a/src/main/java/com/rosetta/im/Boot.java b/src/main/java/com/rosetta/im/Boot.java index ea39a56..24fbc3c 100644 --- a/src/main/java/com/rosetta/im/Boot.java +++ b/src/main/java/com/rosetta/im/Boot.java @@ -9,8 +9,8 @@ public class Boot { private PacketManager packetManager; - public Boot(PacketManager packetManager) { - this.packetManager = packetManager; + public Boot() { + this.packetManager = new PacketManager(); } public PacketManager getPacketManager() { @@ -20,10 +20,11 @@ public class Boot { /** * Инициализация всех пакетов и их обработчиков */ - public void bootstrap() { + public Boot bootstrap() { this.registerAllPackets(); this.registerAllExecutors(); this.printBootMessage(); + return this; } private void registerAllPackets() { diff --git a/src/main/java/com/rosetta/im/ContextBuilder.java b/src/main/java/com/rosetta/im/ContextBuilder.java new file mode 100644 index 0000000..a687823 --- /dev/null +++ b/src/main/java/com/rosetta/im/ContextBuilder.java @@ -0,0 +1,21 @@ +package com.rosetta.im; + +import com.rosetta.im.event.EventManager; + +public class ContextBuilder { + + private AppContext appContext; + + public ContextBuilder() {} + + public AppContext buildContext() { + /** + * Создание глобальных объектов приложения + */ + EventManager eventManager = new EventManager(); + + this.appContext = new AppContext(eventManager); + return this.appContext; + } + +} diff --git a/src/main/java/com/rosetta/im/Main.java b/src/main/java/com/rosetta/im/Main.java index aa86007..b4b2517 100644 --- a/src/main/java/com/rosetta/im/Main.java +++ b/src/main/java/com/rosetta/im/Main.java @@ -6,23 +6,21 @@ import io.orprotocol.packet.PacketManager; public class Main { public static void main(String[] args) { - PacketManager manager = new PacketManager(); - /** * Регистрация всех пакетов и их обработчиков */ - Boot boot = new Boot(manager); - boot.bootstrap(); - + Boot boot = new Boot(); + PacketManager manager = boot.bootstrap().getPacketManager(); /** - * Загрузка настроек сервера + * Загрузка настроек сервера, сборка контекста приложения */ Settings settings = new Settings(8881, 30); - + AppContext appContext = new ContextBuilder().buildContext(); + ServerAdapter serverAdapter = new ServerAdapter(appContext.getEventManager()); /** * Запуск сервера на порту 8881 */ - Server server = new Server(settings, manager); + Server server = new Server(settings, manager, appContext, serverAdapter); server.start(); } } \ No newline at end of file diff --git a/src/main/java/com/rosetta/im/ServerAdapter.java b/src/main/java/com/rosetta/im/ServerAdapter.java index f0c546c..c8c08e1 100644 --- a/src/main/java/com/rosetta/im/ServerAdapter.java +++ b/src/main/java/com/rosetta/im/ServerAdapter.java @@ -1,36 +1,71 @@ package com.rosetta.im; +import com.rosetta.im.event.EventManager; +import com.rosetta.im.event.events.ConnectEvent; +import com.rosetta.im.event.events.DisconnectEvent; +import com.rosetta.im.event.events.PacketInputEvent; +import com.rosetta.im.event.events.ServerErrorEvent; +import com.rosetta.im.event.events.ServerStartEvent; +import com.rosetta.im.event.events.ServerStopEvent; + import io.orprotocol.Server; import io.orprotocol.ServerListener; import io.orprotocol.client.Client; import io.orprotocol.packet.Packet; +/** + * Адаптер нужный для трансляции событий протокола в события приложения (EventManager) + */ public class ServerAdapter implements ServerListener { - @Override - public void onServerStart(Server server) {} + private EventManager eventManager; - @Override - public void onServerStop(Server server) {} - - @Override - public boolean onClientConnect(Server server, Client client) { - - return true; + public ServerAdapter(EventManager eventManager) { + this.eventManager = eventManager; } @Override - public void onClientDisconnect(Server server, Client client) {} + public void onServerStart(Server server) { + this.eventManager.callEvent(new ServerStartEvent(server)); + } + + @Override + public void onServerStop(Server server) { + this.eventManager.callEvent(new ServerStopEvent(server)); + } + + @Override + public boolean onClientConnect(Server server, Client client) { + boolean cancelled = this.eventManager.callEvent(new ConnectEvent(server, client)); + /** + * Если событие отменено (true), то подключение клиента будет отклонено, + * иначе (false) клиент будет успешно подключен. + * Инверсия нужна для того чтобы соответствовать логике отмены событий в ServerListener, + * который требует чтобы мы возвращали true если подключение должно быть разрешено. + */ + return !cancelled; + } + + @Override + public void onClientDisconnect(Server server, Client client) { + this.eventManager.callEvent(new DisconnectEvent(server, client)); + } @Override public void onError(Server server, Exception exception) { - System.out.println("Server error: " + exception.getMessage()); + this.eventManager.callEvent(new ServerErrorEvent(server, exception)); } @Override public boolean onPacketReceived(Server server, Client client, Packet packet) { - - return true; + boolean cancelled = this.eventManager.callEvent(new PacketInputEvent(server, client, packet)); + /** + * Если событие отменено (true), то пакет не будет обработан дальше, + * иначе (false) будет продолжена его обработка. + * Инверсия нужна для того чтобы соответствовать логике отмены событий в ServerListener, + * который требует чтобы мы возвращали true если пакет должен быть обработан дальше. + */ + return !cancelled; } } diff --git a/src/main/java/com/rosetta/im/event/events/ConnectEvent.java b/src/main/java/com/rosetta/im/event/events/ConnectEvent.java new file mode 100644 index 0000000..055a661 --- /dev/null +++ b/src/main/java/com/rosetta/im/event/events/ConnectEvent.java @@ -0,0 +1,41 @@ +package com.rosetta.im.event.events; + +import com.rosetta.im.event.Cancelable; +import com.rosetta.im.event.Event; + +import io.orprotocol.Server; +import io.orprotocol.client.Client; + +/** + * Событие подключения клиента к серверу. + */ +public class ConnectEvent extends Event implements Cancelable { + + private boolean canceled = false; + private Server server; + private Client client; + + public ConnectEvent(Server server, Client client) { + this.server = server; + this.client = client; + + } + + @Override + public boolean isCanceled() { + return this.canceled; + } + + @Override + public void setCanceled(boolean canceled) { + this.canceled = canceled; + } + + public Server getServer() { + return this.server; + } + + public Client getClient() { + return this.client; + } +} diff --git a/src/main/java/com/rosetta/im/event/events/DisconnectEvent.java b/src/main/java/com/rosetta/im/event/events/DisconnectEvent.java new file mode 100644 index 0000000..a80a2e4 --- /dev/null +++ b/src/main/java/com/rosetta/im/event/events/DisconnectEvent.java @@ -0,0 +1,29 @@ +package com.rosetta.im.event.events; + +import com.rosetta.im.event.Event; + +import io.orprotocol.Server; +import io.orprotocol.client.Client; + +/** + * Событие отключения клиента от сервера. + */ +public class DisconnectEvent extends Event { + + private Server server; + private Client client; + + public DisconnectEvent(Server server, Client client) { + this.server = server; + this.client = client; + } + + public Server getServer() { + return this.server; + } + + public Client getClient() { + return this.client; + } + +} diff --git a/src/main/java/com/rosetta/im/event/events/PacketInputEvent.java b/src/main/java/com/rosetta/im/event/events/PacketInputEvent.java new file mode 100644 index 0000000..71bcb31 --- /dev/null +++ b/src/main/java/com/rosetta/im/event/events/PacketInputEvent.java @@ -0,0 +1,48 @@ +package com.rosetta.im.event.events; + +import com.rosetta.im.event.Cancelable; +import com.rosetta.im.event.Event; + +import io.orprotocol.Server; +import io.orprotocol.client.Client; +import io.orprotocol.packet.Packet; + +/** + * Событие входящего пакета от клиента. + */ +public class PacketInputEvent extends Event implements Cancelable { + + private boolean canceled = false; + private Server server; + private Client client; + private Packet packet; + + public PacketInputEvent(Server server, Client client, Packet packet) { + this.server = server; + this.client = client; + this.packet = packet; + } + + @Override + public boolean isCanceled() { + return this.canceled; + } + + @Override + public void setCanceled(boolean canceled) { + this.canceled = canceled; + } + + public Server getServer() { + return this.server; + } + + public Client getClient() { + return this.client; + } + + public Packet getPacket() { + return this.packet; + } + +} diff --git a/src/main/java/com/rosetta/im/event/events/ServerErrorEvent.java b/src/main/java/com/rosetta/im/event/events/ServerErrorEvent.java new file mode 100644 index 0000000..2774cdb --- /dev/null +++ b/src/main/java/com/rosetta/im/event/events/ServerErrorEvent.java @@ -0,0 +1,28 @@ +package com.rosetta.im.event.events; + +import com.rosetta.im.event.Event; + +import io.orprotocol.Server; + +/** + * Событие ошибки сервера. + */ +public class ServerErrorEvent extends Event { + + private Exception exception; + private Server server; + + public ServerErrorEvent(Server server, Exception exception) { + this.server = server; + this.exception = exception; + } + + public Exception getException() { + return this.exception; + } + + public Server getServer() { + return this.server; + } + +} diff --git a/src/main/java/com/rosetta/im/event/events/ServerStartEvent.java b/src/main/java/com/rosetta/im/event/events/ServerStartEvent.java new file mode 100644 index 0000000..d491f67 --- /dev/null +++ b/src/main/java/com/rosetta/im/event/events/ServerStartEvent.java @@ -0,0 +1,22 @@ +package com.rosetta.im.event.events; + +import com.rosetta.im.event.Event; + +import io.orprotocol.Server; + +/** + * Событие запуска сервера. + */ +public class ServerStartEvent extends Event { + + private Server server; + + public ServerStartEvent(Server server) { + this.server = server; + } + + public Server getServer() { + return this.server; + } + +} diff --git a/src/main/java/com/rosetta/im/event/events/ServerStopEvent.java b/src/main/java/com/rosetta/im/event/events/ServerStopEvent.java new file mode 100644 index 0000000..8b4ac85 --- /dev/null +++ b/src/main/java/com/rosetta/im/event/events/ServerStopEvent.java @@ -0,0 +1,22 @@ +package com.rosetta.im.event.events; + +import com.rosetta.im.event.Event; + +import io.orprotocol.Server; + +/** + * Событие остановки сервера. + */ +public class ServerStopEvent extends Event { + + private Server server; + + public ServerStopEvent(Server server) { + this.server = server; + } + + public Server getServer() { + return this.server; + } + +}