package uk.nhs.kch.rassyeyanie.common.testing.integration; import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.camel.component.hl7.HL7Converter; import org.apache.commons.lang.ArrayUtils; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.buffer.SimpleBufferAllocator; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ca.uhn.hl7v2.model.Message; /** */ public class BaseHandler extends IoHandlerAdapter { private static final Logger logger = LoggerFactory.getLogger(BaseHandler.class); private static final byte START_BYTE = 0x0b; private static final byte END_BYTE_1 = 0x1c; private static final byte END_BYTE_2 = 0x0d; protected Integer getLocalPort(IoSession session) { InetSocketAddress localAddress = (InetSocketAddress)session.getLocalAddress(); return Integer.valueOf(localAddress.getPort()); } protected Integer getRemotePort(IoSession session) { InetSocketAddress localAddress = (InetSocketAddress)session.getRemoteAddress(); return Integer.valueOf(localAddress.getPort()); } @Override public void exceptionCaught(IoSession session, Throwable cause) { logger.error(cause.getMessage(), cause); session.close(true); } protected void writeMessage(IoSession session, String message) { byte[] source = message.getBytes(Charset.defaultCharset()); byte[] body = new byte[source.length + 3]; System.arraycopy(source, 0, body, 1, source.length); body[0] = START_BYTE; body[body.length - 2] = END_BYTE_1; body[body.length - 1] = END_BYTE_2; IoBuffer buffer = new SimpleBufferAllocator().allocate(body.length, true); buffer.put(body); buffer.flip(); session.write(buffer); } protected String readMessage(IoBuffer buffer) { byte[] original = buffer.array(); int lastPos = ArrayUtils.lastIndexOf(original, END_BYTE_1); byte[] copy = new byte[lastPos - 1]; System.arraycopy(original, 1, copy, 0, copy.length); return new String(copy).replaceAll("\r", "\n").trim(); } protected void sendAck(IoSession session, String body) throws Exception { Message message = HL7Converter.toMessage(body); Message ack = message.generateACK(); String response = HL7Converter.toString(ack); logger.debug("Sending ACK \n\t{}", response.replaceAll("\r", "\n\t").trim()); writeMessage(session, response); } protected void sendNack(IoSession session) { // TODO: Send proper NACK response writeMessage(session, "Not OK"); } }