package edu.washington.escience.myria.parallel.ipc; import org.jboss.netty.channel.AbstractChannelSink; import org.jboss.netty.channel.ChannelEvent; import org.jboss.netty.channel.ChannelFuture; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelState; import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.MessageEvent; import org.slf4j.LoggerFactory; /** * ChannelSink implementation for InJVM channels. <br> * All the messages reaching the sink will automatically be pushed into the associated @{link MessageChannelHandler}. * * */ public class InJVMLoopbackChannelSink extends AbstractChannelSink { /** The logger for this class. */ protected static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(InJVMLoopbackChannelSink.class); @Override public final void eventSunk(final ChannelPipeline pipeline, final ChannelEvent e) throws Exception { InJVMChannel channel = (InJVMChannel) e.getChannel(); ChannelFuture future = e.getFuture(); try { if (e instanceof ChannelStateEvent) { ChannelStateEvent event = (ChannelStateEvent) e; ChannelState state = event.getState(); Object value = event.getValue(); switch (state) { case OPEN: if (Boolean.FALSE.equals(value)) { channel.closeNow(future); } else { future.setSuccess(); } break; case BOUND: if (value != null) { Channels.fireChannelBound(channel, channel.getLocalAddress()); future.setSuccess(); } else { channel.closeNow(future); } break; case CONNECTED: if (value != null) { Channels.fireChannelConnected(channel, InJVMChannel.PSEUDO_SERVER_ADDRESS); future.setSuccess(); } else { channel.closeNow(future); } break; case INTEREST_OPS: int newInterest = (Integer) event.getValue(); if (channel.getInterestOps() != newInterest) { channel.setInterestOpsNow(newInterest); Channels.fireChannelInterestChanged(channel); } future.setSuccess(); break; } } else if (e instanceof MessageEvent) { // this.messageProcessor.processMessage(channel, myIPCID, (M) ((MessageEvent) e).getMessage()); Channels.fireMessageReceived(channel, ((MessageEvent) e).getMessage()); future.setSuccess(); Channels.fireWriteComplete(channel, 1); } else { if (LOGGER.isErrorEnabled()) { LOGGER.error("Unexpected channel event catched at sink. {}", e); } } } catch (Throwable t) { future.setFailure(t); } if (!future.isDone()) { future.setFailure(null); } } }