package com.outbrain.gruffalo.netty;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.timeout.IdleStateHandler;
import io.netty.util.concurrent.EventExecutorGroup;
import org.springframework.util.Assert;
class TcpServerPipelineFactory extends ChannelInitializer<Channel> {
private final int readerIdleTimeSeconds;
private final LineBasedFrameDecoderFactory framerFactory;
private final StringDecoder decoder;
private final MetricBatcherFactory metricBatcherFactory;
private final MetricPublishHandler publishHandler;
private final EventExecutorGroup publishExecutor;
public TcpServerPipelineFactory(final int readerIdleTimeSeconds, final LineBasedFrameDecoderFactory framerFactory, final StringDecoder decoder,
final MetricBatcherFactory metricBatcherFactory, final MetricPublishHandler publishHandler, final EventExecutorGroup publishExecutor) {
Assert.notNull(framerFactory, "framerFactory, may not be null");
Assert.notNull(decoder, "decoder may not be null");
Assert.notNull(metricBatcherFactory, "metricBatcherFactory may not be null");
Assert.notNull(publishHandler, "publishHandler may not be null");
Assert.notNull(publishExecutor, "publishExecutor may not be null");
this.readerIdleTimeSeconds = readerIdleTimeSeconds;
this.framerFactory = framerFactory;
this.decoder = decoder;
this.metricBatcherFactory = metricBatcherFactory;
this.publishHandler = publishHandler;
this.publishExecutor = publishExecutor;
}
@Override
protected void initChannel(final Channel channel) throws Exception {
final ChannelPipeline pipeline = channel.pipeline();
pipeline.addLast("idleStateHandler", new IdleStateHandler(readerIdleTimeSeconds, 0, 0));
pipeline.addLast("framer", framerFactory.getLineFramer());
pipeline.addLast("decoder", decoder);
pipeline.addLast("batchHandler", metricBatcherFactory.getMetricBatcher());
pipeline.addLast("publishHandler", publishHandler);
}
}