Archived
0

рефакторинг DI

This commit is contained in:
2021-05-06 14:34:47 +03:00
parent 0aaf17b17f
commit 4c20c7fd02
6 changed files with 96 additions and 39 deletions

View File

@@ -13,15 +13,14 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.protocol.api.ConnectionContext; import mc.protocol.api.ConnectionContext;
import mc.protocol.api.Server; import mc.protocol.api.Server;
import mc.protocol.event.EventBus;
import mc.protocol.io.codec.ProtocolDecoder; import mc.protocol.io.codec.ProtocolDecoder;
import mc.protocol.io.codec.ProtocolEncoder; import mc.protocol.io.codec.ProtocolEncoder;
import mc.protocol.io.codec.ProtocolSplitter; import mc.protocol.io.codec.ProtocolSplitter;
import mc.protocol.packets.ClientSidePacket; 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.annotation.Nonnull;
import javax.inject.Provider;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.function.Consumer; import java.util.function.Consumer;
@@ -30,8 +29,8 @@ import java.util.function.Consumer;
@RequiredArgsConstructor @RequiredArgsConstructor
public class NettyServer implements Server { public class NettyServer implements Server {
private final ObjectPool<NettyConnectionContext> poolNettyConnectionContext; private final Provider<ProtocolDecoder> protocolDecoderProvider;
private final PacketPool packetPool; private final Provider<PacketInboundHandler> packetInboundHandlerProvider;
private final EventBus eventBus; private final EventBus eventBus;
private Consumer<ConnectionContext> consumerNewConnection; private Consumer<ConnectionContext> consumerNewConnection;
private Consumer<ConnectionContext> consumerDisconnect; private Consumer<ConnectionContext> consumerDisconnect;
@@ -90,9 +89,14 @@ public class NettyServer implements Server {
map.put("packet_splitter", new ProtocolSplitter()); map.put("packet_splitter", new ProtocolSplitter());
map.put("logger", new LoggingHandler(LogLevel.DEBUG)); 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_encoder", new ProtocolEncoder());
map.put("packet_handler", new PacketInboundHandler(poolNettyConnectionContext, packetPool, eventBus)); map.put("packet_handler", packetInboundHandlerProvider.get());
return map; return map;
} }

View File

@@ -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<Class<? extends ClientSidePacket>, 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<NettyConnectionContext> providePoolNettyConnectionContext() {
return new GenericObjectPool<>(new NettyConnectionContextFactory());
}
}

View File

@@ -3,7 +3,10 @@ package mc.protocol.di;
import dagger.Component; import dagger.Component;
import mc.protocol.api.Server; import mc.protocol.api.Server;
@Component(modules = ProtocolModule.class) @Component(modules = {
ProtocolModule.class,
PoolModule.class
})
@ServerScope @ServerScope
public interface ProtocolComponent { public interface ProtocolComponent {

View File

@@ -2,46 +2,52 @@ package mc.protocol.di;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import lombok.RequiredArgsConstructor;
import mc.protocol.NettyConnectionContext; import mc.protocol.NettyConnectionContext;
import mc.protocol.NettyServer; import mc.protocol.NettyServer;
import mc.protocol.State; import mc.protocol.PacketInboundHandler;
import mc.protocol.api.Server; import mc.protocol.api.Server;
import mc.protocol.packets.ClientSidePacket;
import mc.protocol.packets.UnknownPacket;
import mc.protocol.event.EventBus; 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.event.SimpleEventBus;
import mc.protocol.io.codec.ProtocolDecoder;
import mc.protocol.pool.PacketPool;
import org.apache.commons.pool2.ObjectPool; import org.apache.commons.pool2.ObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPool;
import java.util.Map; import javax.inject.Provider;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Module @Module
@RequiredArgsConstructor
public class ProtocolModule { public class ProtocolModule {
private final boolean readUnknownPackets;
@Provides @Provides
@ServerScope @ServerScope
Server provideServer(ObjectPool<NettyConnectionContext> poolNettyConnectionContext, PacketPool packetPool, EventBus eventBus) { Server provideServer(
return new NettyServer(poolNettyConnectionContext, packetPool, eventBus); Provider<ProtocolDecoder> protocolDecoderProvider,
Provider<PacketInboundHandler> packetInboundHandlerProvider,
EventBus eventBus
) {
return new NettyServer(protocolDecoderProvider, packetInboundHandlerProvider, eventBus);
} }
@Provides @Provides
@ServerScope @ServerScope
@SuppressWarnings({ "rawtypes", "unchecked" }) ProtocolDecoder provideProtocolDecoder(
PacketPool providePacketPool() { ObjectPool<NettyConnectionContext> poolNettyConnectionContext,
Map<Class<? extends ClientSidePacket>, ObjectPool> map = Stream.of(State.values()) PacketPool poolPackets
.flatMap(state -> state.getClientSidePackets().values().stream()) ) {
.distinct() return new ProtocolDecoder(readUnknownPackets, poolNettyConnectionContext, poolPackets);
.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
PacketInboundHandler providePacketInboundHandler(
ObjectPool<NettyConnectionContext> poolNettyConnectionContext,
PacketPool packetPool,
EventBus eventBus
) {
return new PacketInboundHandler(poolNettyConnectionContext, packetPool, eventBus);
} }
@Provides @Provides
@@ -50,9 +56,4 @@ public class ProtocolModule {
return new SimpleEventBus(); return new SimpleEventBus();
} }
@Provides
@ServerScope
ObjectPool<NettyConnectionContext> providePoolNettyConnectionContext() {
return new GenericObjectPool<>(new NettyConnectionContextFactory());
}
} }

View File

@@ -4,6 +4,7 @@ import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.protocol.NettyConnectionContext; import mc.protocol.NettyConnectionContext;
import mc.protocol.NetworkAttributes; import mc.protocol.NetworkAttributes;
@@ -27,8 +28,11 @@ public class ProtocolDecoder extends ByteToMessageDecoder {
private final boolean readUnknownPackets; private final boolean readUnknownPackets;
private final ObjectPool<NettyConnectionContext> poolNettyConnectionContext; private final ObjectPool<NettyConnectionContext> poolNettyConnectionContext;
private final PacketPool poolPackets; private final PacketPool poolPackets;
private final Consumer<ConnectionContext> consumerNewConnection;
private final Consumer<ConnectionContext> consumerDisconnect; @Setter
private Consumer<ConnectionContext> consumerNewConnection;
@Setter
private Consumer<ConnectionContext> consumerDisconnect;
@Override @Override
public void channelActive(@Nonnull ChannelHandlerContext ctx) throws Exception { public void channelActive(@Nonnull ChannelHandlerContext ctx) throws Exception {

View File

@@ -11,6 +11,7 @@ import mc.protocol.State;
import mc.protocol.api.Server; import mc.protocol.api.Server;
import mc.protocol.di.DaggerProtocolComponent; import mc.protocol.di.DaggerProtocolComponent;
import mc.protocol.di.ProtocolComponent; import mc.protocol.di.ProtocolComponent;
import mc.protocol.di.ProtocolModule;
import mc.protocol.packets.PingPacket; import mc.protocol.packets.PingPacket;
import mc.protocol.packets.client.HandshakePacket; import mc.protocol.packets.client.HandshakePacket;
import mc.protocol.packets.client.LoginStartPacket; import mc.protocol.packets.client.LoginStartPacket;
@@ -40,8 +41,6 @@ public class Main {
private void run(OptionSet optionSet) { private void run(OptionSet optionSet) {
log.info("mc-project launch"); log.info("mc-project launch");
ProtocolComponent protocolComponent = DaggerProtocolComponent.create();
ConfigModule configModule = new ConfigModule((Path) optionSet.valueOf(CLI_CONFIG)); ConfigModule configModule = new ConfigModule((Path) optionSet.valueOf(CLI_CONFIG));
ServerComponent serverComponent = DaggerServerComponent.builder() ServerComponent serverComponent = DaggerServerComponent.builder()
@@ -50,6 +49,10 @@ public class Main {
Config config = serverComponent.getConfig(); Config config = serverComponent.getConfig();
ProtocolComponent protocolComponent = DaggerProtocolComponent.builder()
.protocolModule(new ProtocolModule(true))
.build();
Server server = protocolComponent.getServer(); Server server = protocolComponent.getServer();
PacketHandler packetHandler = serverComponent.getPacketHandler(); PacketHandler packetHandler = serverComponent.getPacketHandler();