From 4c20c7fd0212d72b3226a25c36907779487e6197 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 6 May 2021 14:34:47 +0300 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20DI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/protocol/NettyServer.java | 18 +++--- .../main/java/mc/protocol/di/PoolModule.java | 42 ++++++++++++++ .../mc/protocol/di/ProtocolComponent.java | 5 +- .../java/mc/protocol/di/ProtocolModule.java | 55 ++++++++++--------- .../mc/protocol/io/codec/ProtocolDecoder.java | 8 ++- server/src/main/java/mc/server/Main.java | 7 ++- 6 files changed, 96 insertions(+), 39 deletions(-) create mode 100644 protocol/src/main/java/mc/protocol/di/PoolModule.java diff --git a/protocol/src/main/java/mc/protocol/NettyServer.java b/protocol/src/main/java/mc/protocol/NettyServer.java index 7555e24..70ff2cb 100644 --- a/protocol/src/main/java/mc/protocol/NettyServer.java +++ b/protocol/src/main/java/mc/protocol/NettyServer.java @@ -13,15 +13,14 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import mc.protocol.api.ConnectionContext; import mc.protocol.api.Server; +import mc.protocol.event.EventBus; import mc.protocol.io.codec.ProtocolDecoder; import mc.protocol.io.codec.ProtocolEncoder; import mc.protocol.io.codec.ProtocolSplitter; import mc.protocol.packets.ClientSidePacket; -import mc.protocol.event.EventBus; -import mc.protocol.pool.PacketPool; -import org.apache.commons.pool2.ObjectPool; import javax.annotation.Nonnull; +import javax.inject.Provider; import java.util.LinkedHashMap; import java.util.Map; import java.util.function.Consumer; @@ -30,8 +29,8 @@ import java.util.function.Consumer; @RequiredArgsConstructor public class NettyServer implements Server { - private final ObjectPool poolNettyConnectionContext; - private final PacketPool packetPool; + private final Provider protocolDecoderProvider; + private final Provider packetInboundHandlerProvider; private final EventBus eventBus; private Consumer consumerNewConnection; private Consumer consumerDisconnect; @@ -90,9 +89,14 @@ public class NettyServer implements Server { map.put("packet_splitter", new ProtocolSplitter()); map.put("logger", new LoggingHandler(LogLevel.DEBUG)); - map.put("packet_decoder", new ProtocolDecoder(true, poolNettyConnectionContext, packetPool, consumerNewConnection, consumerDisconnect)); + + ProtocolDecoder protocolDecoder = protocolDecoderProvider.get(); + protocolDecoder.setConsumerNewConnection(consumerNewConnection); + protocolDecoder.setConsumerDisconnect(consumerDisconnect); + map.put("packet_decoder", protocolDecoder); + map.put("packet_encoder", new ProtocolEncoder()); - map.put("packet_handler", new PacketInboundHandler(poolNettyConnectionContext, packetPool, eventBus)); + map.put("packet_handler", packetInboundHandlerProvider.get()); return map; } diff --git a/protocol/src/main/java/mc/protocol/di/PoolModule.java b/protocol/src/main/java/mc/protocol/di/PoolModule.java new file mode 100644 index 0000000..756c6c2 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/di/PoolModule.java @@ -0,0 +1,42 @@ +package mc.protocol.di; + +import dagger.Module; +import dagger.Provides; +import mc.protocol.NettyConnectionContext; +import mc.protocol.State; +import mc.protocol.packets.ClientSidePacket; +import mc.protocol.packets.UnknownPacket; +import mc.protocol.pool.NettyConnectionContextFactory; +import mc.protocol.pool.PacketFactory; +import mc.protocol.pool.PacketPool; +import org.apache.commons.pool2.ObjectPool; +import org.apache.commons.pool2.impl.GenericObjectPool; + +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Module +public class PoolModule { + + @Provides + @ServerScope + @SuppressWarnings({ "rawtypes", "unchecked" }) + PacketPool providePacketPool() { + Map, ObjectPool> map = Stream.of(State.values()) + .flatMap(state -> state.getClientSidePackets().values().stream()) + .distinct() + .collect(Collectors.toMap( + packetClass -> packetClass, + packetClass -> new GenericObjectPool(new PacketFactory<>(packetClass)))); + map.put(UnknownPacket.class, new GenericObjectPool(new PacketFactory<>(UnknownPacket.class))); + + return new PacketPool(map); + } + + @Provides + @ServerScope + ObjectPool providePoolNettyConnectionContext() { + return new GenericObjectPool<>(new NettyConnectionContextFactory()); + } +} diff --git a/protocol/src/main/java/mc/protocol/di/ProtocolComponent.java b/protocol/src/main/java/mc/protocol/di/ProtocolComponent.java index 84caa5b..da7725e 100644 --- a/protocol/src/main/java/mc/protocol/di/ProtocolComponent.java +++ b/protocol/src/main/java/mc/protocol/di/ProtocolComponent.java @@ -3,7 +3,10 @@ package mc.protocol.di; import dagger.Component; import mc.protocol.api.Server; -@Component(modules = ProtocolModule.class) +@Component(modules = { + ProtocolModule.class, + PoolModule.class +}) @ServerScope public interface ProtocolComponent { diff --git a/protocol/src/main/java/mc/protocol/di/ProtocolModule.java b/protocol/src/main/java/mc/protocol/di/ProtocolModule.java index 3de0cb2..26de985 100644 --- a/protocol/src/main/java/mc/protocol/di/ProtocolModule.java +++ b/protocol/src/main/java/mc/protocol/di/ProtocolModule.java @@ -2,46 +2,52 @@ package mc.protocol.di; import dagger.Module; import dagger.Provides; +import lombok.RequiredArgsConstructor; import mc.protocol.NettyConnectionContext; import mc.protocol.NettyServer; -import mc.protocol.State; +import mc.protocol.PacketInboundHandler; import mc.protocol.api.Server; -import mc.protocol.packets.ClientSidePacket; -import mc.protocol.packets.UnknownPacket; import mc.protocol.event.EventBus; -import mc.protocol.pool.NettyConnectionContextFactory; -import mc.protocol.pool.PacketFactory; -import mc.protocol.pool.PacketPool; import mc.protocol.event.SimpleEventBus; +import mc.protocol.io.codec.ProtocolDecoder; +import mc.protocol.pool.PacketPool; import org.apache.commons.pool2.ObjectPool; -import org.apache.commons.pool2.impl.GenericObjectPool; -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.Stream; +import javax.inject.Provider; @Module +@RequiredArgsConstructor public class ProtocolModule { + private final boolean readUnknownPackets; + @Provides @ServerScope - Server provideServer(ObjectPool poolNettyConnectionContext, PacketPool packetPool, EventBus eventBus) { - return new NettyServer(poolNettyConnectionContext, packetPool, eventBus); + Server provideServer( + Provider protocolDecoderProvider, + Provider packetInboundHandlerProvider, + EventBus eventBus + ) { + return new NettyServer(protocolDecoderProvider, packetInboundHandlerProvider, eventBus); } @Provides @ServerScope - @SuppressWarnings({ "rawtypes", "unchecked" }) - PacketPool providePacketPool() { - Map, ObjectPool> map = Stream.of(State.values()) - .flatMap(state -> state.getClientSidePackets().values().stream()) - .distinct() - .collect(Collectors.toMap( - packetClass -> packetClass, - packetClass -> new GenericObjectPool(new PacketFactory<>(packetClass)))); - map.put(UnknownPacket.class, new GenericObjectPool(new PacketFactory<>(UnknownPacket.class))); + ProtocolDecoder provideProtocolDecoder( + ObjectPool poolNettyConnectionContext, + PacketPool poolPackets + ) { + return new ProtocolDecoder(readUnknownPackets, poolNettyConnectionContext, poolPackets); + } - return new PacketPool(map); + @Provides + @ServerScope + PacketInboundHandler providePacketInboundHandler( + ObjectPool poolNettyConnectionContext, + PacketPool packetPool, + EventBus eventBus + ) { + return new PacketInboundHandler(poolNettyConnectionContext, packetPool, eventBus); } @Provides @@ -50,9 +56,4 @@ public class ProtocolModule { return new SimpleEventBus(); } - @Provides - @ServerScope - ObjectPool providePoolNettyConnectionContext() { - return new GenericObjectPool<>(new NettyConnectionContextFactory()); - } } diff --git a/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java b/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java index 89f541f..1e2e6ab 100644 --- a/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java +++ b/protocol/src/main/java/mc/protocol/io/codec/ProtocolDecoder.java @@ -4,6 +4,7 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; import lombok.RequiredArgsConstructor; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import mc.protocol.NettyConnectionContext; import mc.protocol.NetworkAttributes; @@ -27,8 +28,11 @@ public class ProtocolDecoder extends ByteToMessageDecoder { private final boolean readUnknownPackets; private final ObjectPool poolNettyConnectionContext; private final PacketPool poolPackets; - private final Consumer consumerNewConnection; - private final Consumer consumerDisconnect; + + @Setter + private Consumer consumerNewConnection; + @Setter + private Consumer consumerDisconnect; @Override public void channelActive(@Nonnull ChannelHandlerContext ctx) throws Exception { diff --git a/server/src/main/java/mc/server/Main.java b/server/src/main/java/mc/server/Main.java index 3f2b7ff..e330fec 100644 --- a/server/src/main/java/mc/server/Main.java +++ b/server/src/main/java/mc/server/Main.java @@ -11,6 +11,7 @@ import mc.protocol.State; import mc.protocol.api.Server; import mc.protocol.di.DaggerProtocolComponent; import mc.protocol.di.ProtocolComponent; +import mc.protocol.di.ProtocolModule; import mc.protocol.packets.PingPacket; import mc.protocol.packets.client.HandshakePacket; import mc.protocol.packets.client.LoginStartPacket; @@ -40,8 +41,6 @@ public class Main { private void run(OptionSet optionSet) { log.info("mc-project launch"); - ProtocolComponent protocolComponent = DaggerProtocolComponent.create(); - ConfigModule configModule = new ConfigModule((Path) optionSet.valueOf(CLI_CONFIG)); ServerComponent serverComponent = DaggerServerComponent.builder() @@ -50,6 +49,10 @@ public class Main { Config config = serverComponent.getConfig(); + ProtocolComponent protocolComponent = DaggerProtocolComponent.builder() + .protocolModule(new ProtocolModule(true)) + .build(); + Server server = protocolComponent.getServer(); PacketHandler packetHandler = serverComponent.getPacketHandler();