package org.menacheri.zombie; import java.util.concurrent.atomic.AtomicInteger; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandler; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.Channels; import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; import org.jboss.netty.handler.codec.frame.LengthFieldPrepender; import org.jboss.netty.handler.codec.oneone.OneToOneDecoder; import org.menacheri.jetserver.event.Events; import org.menacheri.jetserver.event.Event; import org.menacheri.jetserver.handlers.netty.EventDecoder; public class PipelineFactory implements ChannelPipelineFactory { private static final LengthFieldPrepender LENGTH_FIELD_PREPENDER = new LengthFieldPrepender(2); private static final TimerCanceller CANCELLER = new TimerCanceller("Zombie",ZombieClient.SERVICE); private static final EventDecoder EVENT_DECODER = new EventDecoder(); private static final StartEventCounter COUNTER = new StartEventCounter(); private final ChannelHandler businessHandler; private static final AtomicInteger INTEGER = new AtomicInteger(0); public PipelineFactory(ChannelHandler handler) { this.businessHandler = handler; } @Override public ChannelPipeline getPipeline() throws Exception { ChannelPipeline pipeline = Channels.pipeline(); pipeline.addLast("lengthDecoder", new LengthFieldBasedFrameDecoder(256, 0, 2,0,2)); pipeline.addLast("lengthFieldPrepender", LENGTH_FIELD_PREPENDER); pipeline.addLast("eventDecoder", EVENT_DECODER); pipeline.addLast("counter", COUNTER); pipeline.addLast("businessHandler",businessHandler); pipeline.addLast("canceller",CANCELLER); return pipeline; } public static class StartEventCounter extends OneToOneDecoder { private final AtomicInteger counter = new AtomicInteger(0); @Override protected Object decode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { Event event = (Event)msg; if(Events.START == event.getType()) { int started = counter.incrementAndGet(); System.out.println("Started: " + started); } else if(Events.NETWORK_MESSAGE == event.getType()) { System.out.println("Client Recieved Data No: " + INTEGER.addAndGet(5000)); } else { System.out.println("Recieved eventType: " + event.getType()); } return msg; } } }