package uk.nhs.kch.rassyeyanie.common.testing.integration; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** */ public class SimpleServerHandler extends BaseHandler implements ServerHandler { private static final Logger logger = LoggerFactory.getLogger(SimpleServerHandler.class); private static final int TIMEOUT = 10; private final List<String> messagesReceived = Collections.synchronizedList(new ArrayList<String>()); private final AtomicInteger count = new AtomicInteger(0); private AtomicInteger expected = new AtomicInteger(0); public List<String> getMessagesReceived() { return messagesReceived; } @Override public void messageReceived(IoSession session, Object message) { count.incrementAndGet(); expected.decrementAndGet(); try { if (message instanceof IoBuffer) { logger.debug("Receiver on port {} received message", getLocalPort(session)); String s = readMessage((IoBuffer)message); messagesReceived.add(s); sendAck(session, s); return; } } catch (Exception ex) { logger.error(ex.getMessage(), ex); } sendNack(session); } @Override public void sessionCreated(IoSession session) { session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, TIMEOUT); } @Override public void messageSent(IoSession session, Object message) { count.decrementAndGet(); } @Override public boolean isStillWaitingToSendMessages() { return count.intValue() > 0; } @Override public void setExpectedMessageCount(int expected) { this.expected = new AtomicInteger(expected); } @Override public int getMessageCount() { return messagesReceived.size(); } public void waitForMessages(int seconds) throws InterruptedException { int timeout = seconds * 2; while (expected.intValue() > 0 && timeout > 0) { Thread.sleep(500L); timeout--; } } @Override public void waitForMessages() throws InterruptedException { waitForMessages(TIMEOUT); } public void reset() { messagesReceived.clear(); } }