Базовые события сервера, адаптер сервера, сборка контекста

This commit is contained in:
RoyceDa
2026-02-02 23:36:27 +02:00
parent 07379beca1
commit f4be7b4e00
11 changed files with 291 additions and 24 deletions

View File

@@ -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;
}
}

View File

@@ -9,8 +9,8 @@ public class Boot {
private PacketManager packetManager; private PacketManager packetManager;
public Boot(PacketManager packetManager) { public Boot() {
this.packetManager = packetManager; this.packetManager = new PacketManager();
} }
public PacketManager getPacketManager() { public PacketManager getPacketManager() {
@@ -20,10 +20,11 @@ public class Boot {
/** /**
* Инициализация всех пакетов и их обработчиков * Инициализация всех пакетов и их обработчиков
*/ */
public void bootstrap() { public Boot bootstrap() {
this.registerAllPackets(); this.registerAllPackets();
this.registerAllExecutors(); this.registerAllExecutors();
this.printBootMessage(); this.printBootMessage();
return this;
} }
private void registerAllPackets() { private void registerAllPackets() {

View File

@@ -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;
}
}

View File

@@ -6,23 +6,21 @@ import io.orprotocol.packet.PacketManager;
public class Main { public class Main {
public static void main(String[] args) { public static void main(String[] args) {
PacketManager manager = new PacketManager();
/** /**
* Регистрация всех пакетов и их обработчиков * Регистрация всех пакетов и их обработчиков
*/ */
Boot boot = new Boot(manager); Boot boot = new Boot();
boot.bootstrap(); PacketManager manager = boot.bootstrap().getPacketManager();
/** /**
* Загрузка настроек сервера * Загрузка настроек сервера, сборка контекста приложения
*/ */
Settings settings = new Settings(8881, 30); Settings settings = new Settings(8881, 30);
AppContext appContext = new ContextBuilder().buildContext();
ServerAdapter serverAdapter = new ServerAdapter(appContext.getEventManager());
/** /**
* Запуск сервера на порту 8881 * Запуск сервера на порту 8881
*/ */
Server server = new Server(settings, manager); Server server = new Server(settings, manager, appContext, serverAdapter);
server.start(); server.start();
} }
} }

View File

@@ -1,36 +1,71 @@
package com.rosetta.im; 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.Server;
import io.orprotocol.ServerListener; import io.orprotocol.ServerListener;
import io.orprotocol.client.Client; import io.orprotocol.client.Client;
import io.orprotocol.packet.Packet; import io.orprotocol.packet.Packet;
/**
* Адаптер нужный для трансляции событий протокола в события приложения (EventManager)
*/
public class ServerAdapter implements ServerListener { public class ServerAdapter implements ServerListener {
@Override private EventManager eventManager;
public void onServerStart(Server server) {}
@Override public ServerAdapter(EventManager eventManager) {
public void onServerStop(Server server) {} this.eventManager = eventManager;
@Override
public boolean onClientConnect(Server server, Client client) {
return true;
} }
@Override @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 @Override
public void onError(Server server, Exception exception) { public void onError(Server server, Exception exception) {
System.out.println("Server error: " + exception.getMessage()); this.eventManager.callEvent(new ServerErrorEvent(server, exception));
} }
@Override @Override
public boolean onPacketReceived(Server server, Client client, Packet packet) { public boolean onPacketReceived(Server server, Client client, Packet packet) {
boolean cancelled = this.eventManager.callEvent(new PacketInputEvent(server, client, packet));
return true; /**
* Если событие отменено (true), то пакет не будет обработан дальше,
* иначе (false) будет продолжена его обработка.
* Инверсия нужна для того чтобы соответствовать логике отмены событий в ServerListener,
* который требует чтобы мы возвращали true если пакет должен быть обработан дальше.
*/
return !cancelled;
} }
} }

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}