рефакторинг DI
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
42
protocol/src/main/java/mc/protocol/di/PoolModule.java
Normal file
42
protocol/src/main/java/mc/protocol/di/PoolModule.java
Normal 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 {
|
||||||
|
|
||||||
|
|||||||
@@ -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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user