/** * */ package vnet.sms.gateway.nettysupport; import java.io.Serializable; import java.net.SocketAddress; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelDownstreamHandler; import org.jboss.netty.channel.ChannelEvent; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.MessageEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import vnet.sms.common.wme.acknowledge.SendLoginRequestAckEvent; import vnet.sms.common.wme.acknowledge.SendLoginRequestNackEvent; import vnet.sms.common.wme.acknowledge.SendSmsAckContainer; import vnet.sms.common.wme.acknowledge.SendSmsAckEvent; import vnet.sms.common.wme.acknowledge.SendSmsNackContainer; import vnet.sms.common.wme.acknowledge.SendSmsNackEvent; import vnet.sms.common.wme.send.SendPingRequestEvent; import vnet.sms.common.wme.send.SendSmsContainer; import vnet.sms.common.wme.send.SendSmsEvent; import vnet.sms.gateway.nettysupport.login.incoming.NonLoginMessageReceivedOnUnauthenticatedChannelEvent; /** * @author obergner * */ public abstract class DownstreamWindowedChannelHandler<ID extends Serializable> implements ChannelDownstreamHandler { private final Logger log = LoggerFactory.getLogger(getClass()); /** * {@inheritDoc} Down-casts the received downstream event into more * meaningful sub-type event and calls an appropriate handler method with * the down-casted event. */ @Override public final void handleDownstream(final ChannelHandlerContext ctx, final ChannelEvent e) throws Exception { getLog().debug("Processing {} ...", e); if (e instanceof SendPingRequestEvent) { writePingRequestRequested(ctx, (SendPingRequestEvent<ID>) e); } else if (e instanceof SendLoginRequestAckEvent) { writeLoginRequestAcceptedRequested(ctx, (SendLoginRequestAckEvent<ID>) e); } else if (e instanceof SendLoginRequestNackEvent) { writeLoginRequestRejectedRequested(ctx, (SendLoginRequestNackEvent<ID>) e); } else if (e instanceof NonLoginMessageReceivedOnUnauthenticatedChannelEvent) { writeNonLoginMessageReceivedOnUnauthenticatedChannelRequested( ctx, (NonLoginMessageReceivedOnUnauthenticatedChannelEvent<ID, ?>) e); } else if (e instanceof SendPingRequestEvent) { writePingRequestRequested(ctx, (SendPingRequestEvent<ID>) e); } else if ((e instanceof MessageEvent) && (MessageEvent.class.cast(e).getMessage() instanceof SendSmsContainer)) { final SendSmsEvent sendSmsEvent = SendSmsEvent .convert(MessageEvent.class.cast(e)); ctx.sendDownstream(sendSmsEvent); } else if (e instanceof SendSmsEvent) { writeSmsRequested(ctx, (SendSmsEvent) e); } else if ((e instanceof MessageEvent) && (MessageEvent.class.cast(e).getMessage() instanceof SendSmsAckContainer)) { final SendSmsAckEvent<ID> receivedSmsAckedEvent = SendSmsAckEvent .convert(MessageEvent.class.cast(e)); ctx.sendDownstream(receivedSmsAckedEvent); } else if (e instanceof SendSmsAckEvent) { writeReceivedSmsAckedRequested(ctx, (SendSmsAckEvent) e); } else if ((e instanceof MessageEvent) && (MessageEvent.class.cast(e).getMessage() instanceof SendSmsNackContainer)) { final SendSmsNackEvent<ID> receivedSmsNackedEvent = SendSmsNackEvent .convert(MessageEvent.class.cast(e)); ctx.sendDownstream(receivedSmsNackedEvent); } else if (e instanceof SendSmsNackEvent) { writeReceivedSmsNackedRequested(ctx, (SendSmsNackEvent) e); } else if (e instanceof ChannelStateEvent) { final ChannelStateEvent evt = (ChannelStateEvent) e; switch (evt.getState()) { case OPEN: if (!Boolean.TRUE.equals(evt.getValue())) { closeRequested(ctx, evt); } break; case BOUND: if (evt.getValue() != null) { bindRequested(ctx, evt); } else { unbindRequested(ctx, evt); } break; case CONNECTED: if (evt.getValue() != null) { connectRequested(ctx, evt); } else { disconnectRequested(ctx, evt); } break; case INTEREST_OPS: setInterestOpsRequested(ctx, evt); break; default: ctx.sendDownstream(e); } } else { throw new IllegalStateException("Unsupported ChannelEvent [" + e + "] of type [" + e.getClass().getName() + "] - please add a handler method in " + DownstreamWindowedChannelHandler.class.getName()); } getLog().debug("Finished processing {}", e); } /** * @param ctx * @param e * @throws Exception */ protected void writePingRequestRequested(final ChannelHandlerContext ctx, final SendPingRequestEvent<ID> e) throws Exception { ctx.sendDownstream(e); } /** * @param ctx * @param e * @throws Exception */ protected void writeLoginRequestAcceptedRequested( final ChannelHandlerContext ctx, final SendLoginRequestAckEvent<ID> e) throws Exception { ctx.sendDownstream(e); } /** * @param ctx * @param e * @throws Exception */ protected void writeLoginRequestRejectedRequested( final ChannelHandlerContext ctx, final SendLoginRequestNackEvent<ID> e) throws Exception { ctx.sendDownstream(e); } /** * @param ctx * @param e * @throws Exception */ protected void writeNonLoginMessageReceivedOnUnauthenticatedChannelRequested( final ChannelHandlerContext ctx, final NonLoginMessageReceivedOnUnauthenticatedChannelEvent<ID, ?> e) throws Exception { ctx.sendDownstream(e); } /** * @param ctx * @param e * @throws Exception */ protected void writeSmsRequested(final ChannelHandlerContext ctx, final SendSmsEvent e) throws Exception { ctx.sendDownstream(e); } /** * @param ctx * @param e * @throws Exception */ protected void writeReceivedSmsAckedRequested( final ChannelHandlerContext ctx, final SendSmsAckEvent<ID> e) throws Exception { ctx.sendDownstream(e); } /** * @param ctx * @param e * @throws Exception */ protected void writeReceivedSmsNackedRequested( final ChannelHandlerContext ctx, final SendSmsNackEvent<ID> e) throws Exception { ctx.sendDownstream(e); } /** * Invoked when {@link Channel#bind(SocketAddress)} was called. */ public void bindRequested(final ChannelHandlerContext ctx, final ChannelStateEvent e) throws Exception { ctx.sendDownstream(e); } /** * Invoked when {@link Channel#connect(SocketAddress)} was called. */ public void connectRequested(final ChannelHandlerContext ctx, final ChannelStateEvent e) throws Exception { ctx.sendDownstream(e); } /** * Invoked when {@link Channel#setInterestOps(int)} was called. */ public void setInterestOpsRequested(final ChannelHandlerContext ctx, final ChannelStateEvent e) throws Exception { ctx.sendDownstream(e); } /** * Invoked when {@link Channel#disconnect()} was called. */ public void disconnectRequested(final ChannelHandlerContext ctx, final ChannelStateEvent e) throws Exception { ctx.sendDownstream(e); } /** * Invoked when {@link Channel#unbind()} was called. */ public void unbindRequested(final ChannelHandlerContext ctx, final ChannelStateEvent e) throws Exception { ctx.sendDownstream(e); } /** * Invoked when {@link Channel#close()} was called. */ public void closeRequested(final ChannelHandlerContext ctx, final ChannelStateEvent e) throws Exception { ctx.sendDownstream(e); } protected Logger getLog() { return this.log; } }