package com.activequant.trading;
import org.apache.log4j.Logger;
import com.activequant.domainmodel.ETransportType;
import com.activequant.domainmodel.PersistentEntity;
import com.activequant.domainmodel.exceptions.TransportException;
import com.activequant.domainmodel.streaming.MarketDataSnapshot;
import com.activequant.domainmodel.streaming.Tick;
import com.activequant.interfaces.transport.IReceiver;
import com.activequant.interfaces.transport.ITransportFactory;
import com.activequant.interfaces.utils.IEventListener;
import com.activequant.messages.AQMessages;
import com.activequant.messages.AQMessages.BaseMessage;
import com.activequant.messages.AQMessages.BaseMessage.CommandType;
import com.activequant.messages.Marshaller;
/**
* Convenience wrapper.
*
* @author ustaudinger
*
*/
public class MarketDataFeedAdapter {
private Marshaller marshaller = new Marshaller();
private Logger log = Logger.getLogger(MarketDataFeedAdapter.class);
private final String mdi;
private final ITransportFactory transFac;
/**
*
*/
private IEventListener<byte[]> rawListener = new IEventListener<byte[]>() {
@Override
public void eventFired(byte[] event) {
BaseMessage bm;
try {
bm = marshaller.demarshall(event);
if (bm.getType().equals(CommandType.MDS)) {
MarketDataSnapshot mds = marshaller
.demarshall(((AQMessages.MarketDataSnapshot) bm
.getExtension(AQMessages.MarketDataSnapshot.cmd)));
processMarketDataSnapshot(mds);
}
else if(bm.getType().equals(CommandType.TICK)){
Tick t = marshaller.demarshall(((AQMessages.Tick) bm
.getExtension(AQMessages.Tick.cmd)));
processTick(t);
}
} catch (Exception e) {
e.printStackTrace();
log.warn("Exception: ", e);
}
}
};
//
private IEventListener<PersistentEntity> persListener = new IEventListener<PersistentEntity>(){
@Override
public void eventFired(PersistentEntity event) {
if(event instanceof MarketDataSnapshot)
processMarketDataSnapshot((MarketDataSnapshot)event);
}
};
/**
* override this in your class.
*
* @param mds
*/
public void processMarketDataSnapshot(MarketDataSnapshot mds) {
if (log.isDebugEnabled())
log.debug("Received MDS: " + mds);
}
/**
* override this in your class.
*
* @param tick
*/
public void processTick(Tick tick){
if (log.isDebugEnabled())
log.debug("Received Tick: " + tick);
}
/**
* public constructor.
*
* @param mdi
* @param transFac
*/
public MarketDataFeedAdapter(String mdi, ITransportFactory transFac) {
this.mdi = mdi;
this.transFac = transFac;
}
/**
* Use it to start a feed.
* @throws TransportException
*/
public void start() throws TransportException {
IReceiver r = transFac.getReceiver(ETransportType.MARKET_DATA, mdi);
r.getRawEvent()
.addEventListener(rawListener);
// let's also add an old-format event listener.
r.getMsgRecEvent().addEventListener(persListener);
}
}