Базовые события сервера, адаптер сервера, сборка контекста
This commit is contained in:
22
src/main/java/com/rosetta/im/AppContext.java
Normal file
22
src/main/java/com/rosetta/im/AppContext.java
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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() {
|
||||||
|
|||||||
21
src/main/java/com/rosetta/im/ContextBuilder.java
Normal file
21
src/main/java/com/rosetta/im/ContextBuilder.java
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
41
src/main/java/com/rosetta/im/event/events/ConnectEvent.java
Normal file
41
src/main/java/com/rosetta/im/event/events/ConnectEvent.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user