diff --git a/bridge-common/src/main/java/com/luminiadev/bridge/network/AbstractBridgeNetwork.java b/bridge-common/src/main/java/com/luminiadev/bridge/network/AbstractBridgeNetwork.java index ebbdae2..572144a 100644 --- a/bridge-common/src/main/java/com/luminiadev/bridge/network/AbstractBridgeNetwork.java +++ b/bridge-common/src/main/java/com/luminiadev/bridge/network/AbstractBridgeNetwork.java @@ -4,6 +4,8 @@ import com.luminiadev.bridge.network.codec.BridgeCodec; import com.luminiadev.bridge.network.codec.packet.BridgePacket; import com.luminiadev.bridge.network.codec.packet.handler.BridgePacketHandler; +import com.luminiadev.bridge.network.codec.packet.handler.BridgeSinglePacketHandler; +import com.luminiadev.bridge.network.codec.packet.handler.TypedBridgePacketHandler; import io.netty.buffer.ByteBuf; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnmodifiableView; @@ -36,8 +38,14 @@ public void setCodec(BridgeCodec codec) { } @Override - public void addPacketHandler(BridgePacketHandler handler) { + public BridgePacketHandler addPacketHandler(BridgePacketHandler handler) { handlers.add(handler); + return handler; + } + + @Override + public BridgePacketHandler addPacketHandler(Class packetClass, BridgeSinglePacketHandler handler) { + return this.addPacketHandler(new TypedBridgePacketHandler<>(packetClass, handler)); } @Override diff --git a/bridge-common/src/main/java/com/luminiadev/bridge/network/BridgeNetwork.java b/bridge-common/src/main/java/com/luminiadev/bridge/network/BridgeNetwork.java index ed4e1de..a2b2d50 100644 --- a/bridge-common/src/main/java/com/luminiadev/bridge/network/BridgeNetwork.java +++ b/bridge-common/src/main/java/com/luminiadev/bridge/network/BridgeNetwork.java @@ -4,6 +4,7 @@ import com.luminiadev.bridge.network.codec.BridgeCodec; import com.luminiadev.bridge.network.codec.packet.BridgePacket; import com.luminiadev.bridge.network.codec.packet.handler.BridgePacketHandler; +import com.luminiadev.bridge.network.codec.packet.handler.BridgeSinglePacketHandler; import io.netty.buffer.ByteBuf; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -48,9 +49,19 @@ public interface BridgeNetwork { /** * Add a packet handler. * - * @param handler The BridgePacketHandler + * @param handler the BridgePacketHandler + * @return the added packet handler + */ + BridgePacketHandler addPacketHandler(BridgePacketHandler handler); + + /** + * Add a typed packet handler. + * + * @param packetClass the class of packet + * @param handler the BridgeSinglePacketHandler + * @return the added TypedBridgePacketHandler */ - void addPacketHandler(BridgePacketHandler handler); + BridgePacketHandler addPacketHandler(Class packetClass, BridgeSinglePacketHandler handler); /** * Remove a packet handler. diff --git a/bridge-common/src/main/java/com/luminiadev/bridge/network/codec/packet/handler/BridgeSinglePacketHandler.java b/bridge-common/src/main/java/com/luminiadev/bridge/network/codec/packet/handler/BridgeSinglePacketHandler.java new file mode 100644 index 0000000..d4c5fce --- /dev/null +++ b/bridge-common/src/main/java/com/luminiadev/bridge/network/codec/packet/handler/BridgeSinglePacketHandler.java @@ -0,0 +1,23 @@ +package com.luminiadev.bridge.network.codec.packet.handler; + +import com.luminiadev.bridge.network.codec.packet.BridgePacket; +import com.luminiadev.bridge.network.codec.packet.BridgePacketDirection; + +/** + * The handler for handling one type of packet. + * + * @param Packet type to handle + * @see TypedBridgePacketHandler + */ +@FunctionalInterface +public interface BridgeSinglePacketHandler { + + /** + * Called when a packet is sent or received by the service. + * + * @param packet Packet object + * @param direction Packet direction (from or to service) + * @param serviceId Sender's service Id + */ + void handle(T packet, BridgePacketDirection direction, String serviceId); +} diff --git a/bridge-common/src/main/java/com/luminiadev/bridge/network/codec/packet/handler/TypedBridgePacketHandler.java b/bridge-common/src/main/java/com/luminiadev/bridge/network/codec/packet/handler/TypedBridgePacketHandler.java new file mode 100644 index 0000000..fcf612b --- /dev/null +++ b/bridge-common/src/main/java/com/luminiadev/bridge/network/codec/packet/handler/TypedBridgePacketHandler.java @@ -0,0 +1,27 @@ +package com.luminiadev.bridge.network.codec.packet.handler; + +import com.luminiadev.bridge.network.codec.packet.BridgePacket; +import com.luminiadev.bridge.network.codec.packet.BridgePacketDirection; + +/** + * Internal implementation of handler to handle one type of packet. + * + * @param Packet type to handle + */ +public final class TypedBridgePacketHandler implements BridgePacketHandler { + + private final Class packetClass; + private final BridgeSinglePacketHandler handler; + + public TypedBridgePacketHandler(Class packetClass, BridgeSinglePacketHandler handler) { + this.packetClass = packetClass; + this.handler = handler; + } + + @Override + public void handle(BridgePacket packet, BridgePacketDirection direction, String serviceId) { + if (packetClass.isInstance(packet)) { + handler.handle(packetClass.cast(packet), direction, serviceId); + } + } +} diff --git a/build.gradle.kts b/build.gradle.kts index 3e51e37..3c421c3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ java { allprojects { group = "com.luminiadev.bridge" - version = "1.0.6-SNAPSHOT" + version = "1.1.0-SNAPSHOT" } subprojects {