package org.marketcetera.client; import org.marketcetera.util.misc.ClassVersion; import org.marketcetera.util.log.SLF4JLoggerProxy; import org.marketcetera.trade.*; import org.marketcetera.quickfix.FIXVersion; import org.marketcetera.event.HasFIXMessage; import org.marketcetera.client.jms.OrderEnvelope; import org.marketcetera.client.jms.ReceiveOnlyHandler; import org.springframework.jms.core.JmsOperations; import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.atomic.AtomicLong; import java.math.BigDecimal; import quickfix.field.OrdStatus; import quickfix.FieldNotFound; /* $License$ */ /** * Message handler on the {@link MockServer} used to collect messages * received by it and provide it with messages that it should send to the * client. * * @author anshul@marketcetera.com * @version $Id: MockMessageHandler.java 16154 2012-07-14 16:34:05Z colin $ * @since 1.0.0 */ @ClassVersion("$Id: MockMessageHandler.java 16154 2012-07-14 16:34:05Z colin $") //$NON-NLS-1$ public class MockMessageHandler implements ReceiveOnlyHandler<OrderEnvelope> { @Override public void receiveMessage(OrderEnvelope inObject) { Object send; if(inObject.getOrder() instanceof HasFIXMessage) { try { TypesTestBase.logFields(((HasFIXMessage)inObject.getOrder()).getMessage()); } catch (FieldNotFound ignore) { } } else { SLF4JLoggerProxy.debug(this, "Received {}", inObject); } mReceived.add(inObject); if (!mToSend.isEmpty()) { send = mToSend.remove(); } else { send = createExecutionReport(); } SLF4JLoggerProxy.debug(this, "Sending {}", send); getReplySender().convertAndSend(send); } public synchronized void addToSend(Object inObject) { SLF4JLoggerProxy.debug(this, "ADDED {}", inObject); //Use add() instead of put() as we need a non-blocking method. mToSend.add(inObject); } public synchronized void addToSendStatus(Object inObject) { SLF4JLoggerProxy.debug(this, "ADDED STATUS {}", inObject); //Use add() instead of put() as we need a non-blocking method. mToSendStatus.add(inObject); } public synchronized Object removeReceived() throws InterruptedException { //block until a report is available. return mReceived.take(); } public synchronized int numReceived() { return mReceived.size(); } public synchronized void clear() { mReceived.clear(); mToSend.clear(); mToSendStatus.clear(); } static ExecutionReport createExecutionReport() { try { long id = mLong.getAndIncrement(); return Factory.getInstance().createExecutionReport(FIXVersion.FIX42. getMessageFactory().newExecutionReport("ord" + id, "clord" + id, "exec" + id, OrdStatus.NEW, quickfix.field.Side.BUY, new BigDecimal("4343.49"), new BigDecimal("498.34"), new BigDecimal("783343.49"), new BigDecimal("598.34"), new BigDecimal("234343.49"), new BigDecimal("798.34"), new Equity("IBM"), "my acc", "text"), new BrokerID("bro"), Originator.Broker, null, null); } catch (MessageCreationException e) { throw new RuntimeException(e); } catch (FieldNotFound e) { throw new RuntimeException(e); } } JmsOperations getReplySender() { return mReplySender; } void setReplySender(JmsOperations replySender) { mReplySender=replySender; } private final BlockingQueue<Object> mReceived = new LinkedBlockingQueue<Object>(); private final Queue<Object> mToSend = new LinkedList<Object>(); private final Queue<Object> mToSendStatus = new LinkedList<Object>(); private JmsOperations mReplySender; private static final AtomicLong mLong = new AtomicLong(); }