/** * */ package vnet.sms.gateway.nettysupport.transport.incoming; import java.io.Serializable; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelUpstreamHandler; import org.jboss.netty.channel.UpstreamMessageEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import vnet.sms.common.messages.GsmPdu; import vnet.sms.common.messages.LoginRequest; import vnet.sms.common.messages.LoginResponse; import vnet.sms.common.messages.PingRequest; import vnet.sms.common.messages.PingResponse; import vnet.sms.common.messages.Sms; import vnet.sms.common.wme.WindowedMessageEvent; import vnet.sms.gateway.nettysupport.MessageProcessingContext; /** * @author obergner * */ public abstract class TransportProtocolAdaptingUpstreamChannelHandler<ID extends Serializable, TP> extends SimpleChannelUpstreamHandler { public static final String NAME = "vnet.sms.gateway:incoming-transport-protocol-adapter-handler"; public enum PduType { UNKNOWN, LOGIN_REQUEST, LOGIN_RESPONSE, PING_REQUEST, PING_RESPONSE, SMS; } private final Logger log = LoggerFactory.getLogger(getClass()); @Override public void messageReceived(final ChannelHandlerContext ctx, final MessageEvent e) throws Exception { GsmPdu convertedPdu = null; try { final Object pdu = e.getMessage(); getLog().trace("Attempting to convert PDU {} to message ...", pdu); final ID extractedWindowId; switch (typeOf(pdu)) { case LOGIN_REQUEST: extractedWindowId = extractWindowId((TP) pdu); convertedPdu = convertPduToLoginRequest((TP) pdu); break; case LOGIN_RESPONSE: extractedWindowId = extractWindowId((TP) pdu); convertedPdu = convertPduToLoginResponse((TP) pdu); break; case PING_REQUEST: extractedWindowId = extractWindowId((TP) pdu); convertedPdu = convertPduToPingRequest((TP) pdu); break; case PING_RESPONSE: extractedWindowId = extractWindowId((TP) pdu); convertedPdu = convertPduToPingResponse((TP) pdu); break; case SMS: extractedWindowId = extractWindowId((TP) pdu); convertedPdu = convertPduToSms((TP) pdu); break; case UNKNOWN: default: throw new IllegalStateException("Unsupported message type: " + pdu.getClass()); } MessageProcessingContext.INSTANCE.onMessageEnter(convertedPdu); getLog().trace("PDU {} converted to {}", pdu, convertedPdu); final WindowedMessageEvent<ID, ? extends GsmPdu> windowedMessageEvent = UpstreamMessageEventToWindowedMessageEventConverter.INSTANCE .convert(extractedWindowId, (UpstreamMessageEvent) e, convertedPdu); ctx.sendUpstream(windowedMessageEvent); } finally { MessageProcessingContext.INSTANCE.onMessageExit(convertedPdu); } } protected abstract PduType typeOf(final Object pdu); protected abstract ID extractWindowId(final TP pdu); protected abstract LoginRequest convertPduToLoginRequest( final TP loginRequestPdu); protected abstract LoginResponse convertPduToLoginResponse( final TP loginResponsePdu); protected abstract PingRequest convertPduToPingRequest( final TP pingRequestPdu); protected abstract PingResponse convertPduToPingResponse( final TP pingResponsePdu); protected abstract Sms convertPduToSms(final TP smsPdu); protected Logger getLog() { return this.log; } }