package com.myselia.stem.communication.states; import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelPipeline; import java.io.IOException; import java.util.Iterator; import java.util.Map.Entry; import com.myselia.javacommon.communication.codecs.StringToTransmissionDecoder; import com.myselia.javacommon.communication.codecs.TransmissionToStringEncoder; import com.myselia.javacommon.communication.units.Transmission; import com.myselia.stem.communication.StemClientSession; import com.myselia.stem.communication.handlers.ComponentHandlerBase; import com.myselia.stem.communication.handlers.ComponentHandlerFactory; public class HandshakeConnectionState implements ConnectionState { private ComponentHandlerBase handler; private StemClientSession session; @Override public void primeConnectionState(StemClientSession session) { this.session = session; } @Override public void process(Transmission t) throws IOException { System.out.println("HANDSHAKE RECV: " + t); handleSetupPacket(t); } @Override public ComponentHandlerBase getHandler() { return handler; } @Override public void setHandler(ComponentHandlerBase handler) { this.handler = handler; } private void handleSetupPacket(Transmission s) { System.out.print("[HANDSHAKE BEGIN]"); ComponentHandlerBase handler = null; try { System.out.println("\t!!!!!!!!!!!!!!!RECV!!!!!!!!!!!!!!!!!!\n" + "\t|----> " + s); handler = ComponentHandlerFactory.createHandler(s, session); System.out.println("\tVALUE OF READY IS: " + handler.ready()); if (handler.ready()) { setupPipeline(session.getClientChannel()); this.setHandler(handler); session.setComponentHandler(handler); session.setConnectionState(session.getStateContainer().getConnectedState()); } else { session.die(); } } catch (Exception e) { System.out.println("\tSetup packet from component is malformed!"); e.printStackTrace(); } System.out.println("[HANDSHAKE COMPLETE]"); } /** * This method sets up the channel pipeline to contain the proper codecs for transmission payload transportation * */ private void setupPipeline(Channel ch) { ChannelPipeline pipeline = ch.pipeline(); //Decoders pipeline.addAfter("stringDecoder", "transmissionDecoder", new StringToTransmissionDecoder()); //Encoders pipeline.addAfter("stringEncoder", "transmissionEncoder", new TransmissionToStringEncoder()); Iterator<Entry<String, ChannelHandler>> it = pipeline.iterator(); while (it.hasNext()) { Entry<String, ChannelHandler> s = it.next(); System.out.println("Entry is: " + s.getKey() ); System.out.println("\t->Handler: " + s.toString() ); } System.err.println("[Component Handshaker] ~~ Pipeline Setup Complete"); } public String toString() { return "[State] ~~ Handshake @ " + this.getClass(); } }