package cz.cuni.mff.d3s.been.socketworks.twoway; import cz.cuni.mff.d3s.been.mq.MessagingException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * A two-way communication socket-pair poll participant */ class PipelineHandler implements FrameSink { private final ExecutorService exec; private final ReadReplyHandlerFactory factory; private final FrameForwardMapper forwardMapper; private PipelineHandler(ReadReplyHandlerFactory factory, FrameForwardMapper forwardMapper) { this.exec = Executors.newCachedThreadPool(); this.factory = factory; this.forwardMapper = forwardMapper; } /** * Create the pipeline handler * * @param factory Handler factory to create handlers on demand * @param forwardMapper Mapper for frame forwarding * * @return The pipeline handler */ public static PipelineHandler create(ReadReplyHandlerFactory factory, FrameForwardMapper forwardMapper) { return new PipelineHandler(factory, forwardMapper); } @Override public void receiveFromBuddy(Frames frames) throws MessagingException { final ReplyingWorker worker = ReplyingWorker.create(forwardMapper.getForwardFor(this)); worker.setUp(factory.getHandler(), frames); exec.submit(worker); } @Override public void receiveFromWire(Frames frames) throws MessagingException { throw new MessagingException("This sink has no wire."); } }