package org.marketcetera.client;
import java.math.BigDecimal;
import java.util.*;
import javax.jws.WebParam;
import org.marketcetera.client.brokers.BrokerStatus;
import org.marketcetera.client.brokers.BrokersStatus;
import org.marketcetera.client.users.UserInfo;
import org.marketcetera.core.position.PositionKey;
import org.marketcetera.core.position.PositionKeyFactory;
import org.marketcetera.trade.*;
import org.marketcetera.trade.Currency;
import org.marketcetera.util.misc.ClassVersion;
import org.marketcetera.util.ws.stateful.*;
import org.marketcetera.util.ws.wrappers.DateWrapper;
import org.marketcetera.util.ws.wrappers.MapWrapper;
import org.marketcetera.util.ws.wrappers.RemoteException;
/**
* A test service implementation to aid testing of client via {@link
* MockServer}.
*
* @author tlerios@marketcetera.com
* @since 1.0.0
* @version $Id: MockServiceImpl.java 16888 2014-04-22 18:32:36Z colin $
*/
/* $License$ */
@ClassVersion("$Id: MockServiceImpl.java 16888 2014-04-22 18:32:36Z colin $")
public class MockServiceImpl
extends ServiceBaseImpl<Object>
implements Service
{
// INSTANCE DATA.
private int mNextOrderID;
// CONSTRUCTORS.
public MockServiceImpl
(SessionManager<Object> sessionManager)
{
super(sessionManager);
}
// INSTANCE METHODS.
private BrokersStatus getBrokersStatusImpl()
{
LinkedList<BrokerStatus> list=new LinkedList<BrokerStatus>();
list.add(new BrokerStatus("N1",new BrokerID("ID1"),true));
list.add(new BrokerStatus("N2",new BrokerID("ID2"),false));
return new BrokersStatus(list);
}
private UserInfo getUserInfoImpl
(UserID id)
{
if (id==null) {
throw new NullPointerException();
}
return new UserInfo("bob",id,sActive,false,null);
}
private ReportBaseImpl[] getReportsSinceImpl
(Date date)
throws MessageCreationException
{
return sReports;
}
private BigDecimal getPositionAsOfImpl
(Date date,
Equity equity)
{
return new BigDecimal(date.getTime());
}
private MapWrapper<PositionKey<Equity>,BigDecimal> getPositionsAsOfImpl
(Date date)
{
return new MapWrapper<PositionKey<Equity>, BigDecimal>(POSITIONS);
}
private BigDecimal getFuturePositionAsOfImpl(Date inDate,
Future inFuture)
{
return new BigDecimal(inDate.getTime());
}
private MapWrapper<PositionKey<Future>,BigDecimal> getFuturePositionsAsOfImpl(Date date)
{
return new MapWrapper<PositionKey<Future>, BigDecimal>(FUTURES_POSITIONS);
}
private BigDecimal getOptionPositionAsOfImpl
(Date inRaw,
Option inOption)
{
return inOption.getStrikePrice().add(BigDecimal.valueOf(inRaw.getTime()));
}
private MapWrapper<PositionKey<Option>, BigDecimal> getAllOptionPositionsAsOfImpl
(Date inRaw)
{
Map<PositionKey<Option>, BigDecimal> map = new HashMap<PositionKey<Option>, BigDecimal>();
map.put(PositionKeyFactory.createOptionKey("OPT", "20101010",
BigDecimal.TEN, OptionType.Call, "acc", "tra"),
BigDecimal.valueOf(inRaw.getTime()));
return new MapWrapper<PositionKey<Option>, BigDecimal>(map);
}
private MapWrapper<PositionKey<Option>, BigDecimal> getOptionPositionsAsOfImpl
(Date inRaw,
String... inSymbols)
{
Map<PositionKey<Option>, BigDecimal> map = new HashMap<PositionKey<Option>, BigDecimal>();
if (inSymbols != null) {
for(String symbol: inSymbols) {
map.put(PositionKeyFactory.createOptionKey(symbol, "20101010",
BigDecimal.TEN, OptionType.Call, "acc", "tra"),
BigDecimal.valueOf(inRaw.getTime()));
}
}
return new MapWrapper<PositionKey<Option>, BigDecimal>(map);
}
private String getNextOrderIDImpl()
{
return ID_PREFIX +(mNextOrderID++);
}
private String getUnderlyingImpl(String inOptionRoot)
{
mServiceInvoked = true;
return inOptionRoot;
}
private Collection<String> getOptionRootsImpl(String inUnderlying)
{
mServiceInvoked = true;
if(inUnderlying == null) {
return null;
}
List<String> list = new LinkedList<String>();
for(int i = 0; i < inUnderlying.length(); i++) {
list.add(inUnderlying);
}
return list;
}
public boolean isServiceInvoked()
{
return mServiceInvoked;
}
public void resetServiceInvoked()
{
mServiceInvoked = false;
}
boolean toggleServerStatus()
{
mHeartbeatSuccess=!mHeartbeatSuccess;
return mHeartbeatSuccess;
}
int getHeartbeatCount()
{
return mHeartbeatCount;
}
// Service.
@Override
public BrokersStatus getBrokersStatus
(ClientContext context)
throws RemoteException
{
return (new RemoteCaller<Object,BrokersStatus>
(getSessionManager()) {
@Override
protected BrokersStatus call
(ClientContext context,
SessionHolder<Object> sessionHolder)
{
return getBrokersStatusImpl();
}}).execute(context);
}
@Override
public UserInfo getUserInfo
(ClientContext context,
final UserID id)
throws RemoteException
{
return (new RemoteCaller<Object,UserInfo>
(getSessionManager()) {
@Override
protected UserInfo call
(ClientContext context,
SessionHolder<Object> sessionHolder)
{
return getUserInfoImpl(id);
}}).execute(context);
}
@Override
public ReportBaseImpl[] getReportsSince
(ClientContext context,
final DateWrapper date)
throws RemoteException
{
return (new RemoteCaller<Object,ReportBaseImpl[]>
(getSessionManager()) {
@Override
protected ReportBaseImpl[] call
(ClientContext context,
SessionHolder<Object> sessionHolder)
throws MessageCreationException
{
return getReportsSinceImpl(date.getRaw());
}}).execute(context);
}
@Override
public BigDecimal getEquityPositionAsOf
(ClientContext context,
final DateWrapper date,
final Equity equity)
throws RemoteException
{
return (new RemoteCaller<Object,BigDecimal>
(getSessionManager()) {
@Override
protected BigDecimal call
(ClientContext context,
SessionHolder<Object> sessionHolder)
{
return getPositionAsOfImpl(date.getRaw(),equity);
}}).execute(context);
}
@Override
public MapWrapper<PositionKey<Equity>,BigDecimal> getAllEquityPositionsAsOf
(ClientContext context,
final DateWrapper date)
throws RemoteException
{
return (new RemoteCaller<Object,MapWrapper<PositionKey<Equity>,BigDecimal>>
(getSessionManager()) {
@Override
protected MapWrapper<PositionKey<Equity>,BigDecimal> call
(ClientContext context,
SessionHolder<Object> sessionHolder)
{
return getPositionsAsOfImpl(date.getRaw());
}}).execute(context);
}
/* (non-Javadoc)
* @see org.marketcetera.client.Service#getAllFuturePositionsAsOf(org.marketcetera.util.ws.stateful.ClientContext, org.marketcetera.util.ws.wrappers.DateWrapper)
*/
@Override
public MapWrapper<PositionKey<Future>, BigDecimal> getAllFuturePositionsAsOf(ClientContext inContext,
final DateWrapper inDate)
throws RemoteException
{
return (new RemoteCaller<Object,MapWrapper<PositionKey<Future>,BigDecimal>>
(getSessionManager()) {
@Override
protected MapWrapper<PositionKey<Future>,BigDecimal> call
(ClientContext context,
SessionHolder<Object> sessionHolder)
{
return getFuturePositionsAsOfImpl(inDate.getRaw());
}}).execute(inContext);
}
/* (non-Javadoc)
* @see org.marketcetera.client.Service#getFuturePositionAsOf(org.marketcetera.util.ws.stateful.ClientContext, org.marketcetera.util.ws.wrappers.DateWrapper, org.marketcetera.trade.Future)
*/
@Override
public BigDecimal getFuturePositionAsOf(ClientContext inContext,
final DateWrapper inDate,
final Future inFuture)
throws RemoteException
{
return (new RemoteCaller<Object,BigDecimal>(getSessionManager()) {
@Override
protected BigDecimal call(ClientContext context,
SessionHolder<Object> sessionHolder)
{
return getFuturePositionAsOfImpl(inDate.getRaw(),
inFuture);
}}).execute(inContext);
}
@Override
public BigDecimal getOptionPositionAsOf
(ClientContext context,
final DateWrapper date,
final Option option) throws RemoteException
{
return (new RemoteCaller<Object,BigDecimal>
(getSessionManager()) {
@Override
protected BigDecimal call
(ClientContext context,
SessionHolder<Object> sessionHolder)
{
return getOptionPositionAsOfImpl
(date.getRaw(),option);
}}).execute(context);
}
@Override
public MapWrapper<PositionKey<Option>, BigDecimal> getAllOptionPositionsAsOf
(ClientContext context,
final DateWrapper date) throws RemoteException
{
return (new RemoteCaller<Object,MapWrapper<PositionKey<Option>,
BigDecimal>>
(getSessionManager()) {
@Override
protected MapWrapper<PositionKey<Option>,BigDecimal> call
(ClientContext context,
SessionHolder<Object> sessionHolder)
{
return getAllOptionPositionsAsOfImpl
(date.getRaw());
}}).execute(context);
}
@Override
public MapWrapper<PositionKey<Option>, BigDecimal> getOptionPositionsAsOf
(ClientContext context,
final DateWrapper date,
final String... symbols) throws RemoteException
{
return (new RemoteCaller<Object,MapWrapper<PositionKey<Option>,
BigDecimal>>
(getSessionManager()) {
@Override
protected MapWrapper<PositionKey<Option>,BigDecimal> call
(ClientContext context,
SessionHolder<Object> sessionHolder)
{
return getOptionPositionsAsOfImpl
(date.getRaw(), symbols);
}}).execute(context);
}
@Override
public String getUnderlying
(ClientContext context,
final String optionRoot) throws RemoteException
{
return (new RemoteCaller<Object,String>
(getSessionManager()) {
@Override
protected String call
(ClientContext context,
SessionHolder<Object> sessionHolder)
{
return getUnderlyingImpl(optionRoot);
}}).execute(context);
}
@Override
public Collection<String> getOptionRoots
(ClientContext context,
final String underlying) throws RemoteException
{
return (new RemoteCaller<Object,Collection<String>>
(getSessionManager()) {
@Override
protected Collection<String> call
(ClientContext context,
SessionHolder<Object> sessionHolder)
{
return getOptionRootsImpl(underlying);
}}).execute(context);
}
@Override
public String getNextOrderID
(ClientContext context)
throws RemoteException
{
return (new RemoteCaller<Object,String>
(getSessionManager()) {
@Override
protected String call
(ClientContext context,
SessionHolder<Object> sessionHolder)
{
return getNextOrderIDImpl();
}}).execute(context);
}
@Override
public void heartbeat
(ClientContext context)
throws RemoteException
{
if (!mHeartbeatSuccess) {
throw new IllegalStateException();
}
mHeartbeatCount++;
}
/* (non-Javadoc)
* @see org.marketcetera.client.Service#getUserData(org.marketcetera.util.ws.stateful.ClientContext)
*/
@Override
public String getUserData(final ClientContext inContext)
throws RemoteException
{
return userdata;
}
/* (non-Javadoc)
* @see org.marketcetera.client.Service#setUserData(org.marketcetera.util.ws.stateful.ClientContext, java.util.Properties)
*/
@Override
public void setUserData(ClientContext inContext,
String inData)
throws RemoteException
{
userdata = inData;
}
private String userdata;
static final String ID_PREFIX = "MyID";
// Mocking interface.
private int mHeartbeatCount = 0;
private boolean mHeartbeatSuccess = true;
private boolean mServiceInvoked = false;
static ReportBaseImpl[] sReports = null;
static boolean sActive = true;
static final Map<PositionKey<Equity>, BigDecimal> POSITIONS;
static final Map<PositionKey<Future>,BigDecimal> FUTURES_POSITIONS;
static {
Map<PositionKey<Equity>, BigDecimal> positions =
new HashMap<PositionKey<Equity>, BigDecimal>();
positions.put(PositionKeyFactory.createEquityKey("A","acme","bob"),
BigDecimal.TEN);
positions.put(PositionKeyFactory.createEquityKey("B","wally","sue"),
BigDecimal.ONE.negate());
POSITIONS = Collections.unmodifiableMap(positions);
Map<PositionKey<Future>, BigDecimal> futurePositions = new HashMap<PositionKey<Future>,BigDecimal>();
futurePositions.put(PositionKeyFactory.createFutureKey("ENOQ1-11","201103","acme","bob"),
BigDecimal.TEN);
futurePositions.put(PositionKeyFactory.createFutureKey("BRN12N","201207","wally","sue"),
BigDecimal.ONE.negate());
FUTURES_POSITIONS = Collections.unmodifiableMap(futurePositions);
}
@Override
public BigDecimal getCurrencyPositionAsOf(
@WebParam(name = "context") ClientContext context,
@WebParam(name = "date") DateWrapper date,
@WebParam(name = "currency") Currency currency)
throws RemoteException {
// TODO Auto-generated method stub
return null;
}
@Override
public MapWrapper<PositionKey<Currency>, BigDecimal> getAllCurrencyPositionsAsOf(
@WebParam(name = "context") ClientContext context,
@WebParam(name = "date") DateWrapper date) throws RemoteException {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see org.marketcetera.client.Service#deleteReport(org.marketcetera.util.ws.stateful.ClientContext, org.marketcetera.trade.ExecutionReportImpl)
*/
@Override
public void deleteReport(ClientContext inContext,
ExecutionReportImpl inReport)
throws RemoteException
{
throw new UnsupportedOperationException();
}
/* (non-Javadoc)
* @see org.marketcetera.client.Service#resolveSymbol(org.marketcetera.util.ws.stateful.ClientContext, java.lang.String)
*/
@Override
public Instrument resolveSymbol(@WebParam(name = "context")
ClientContext inContext,
@WebParam(name = "symbol")
String inSymbol)
throws RemoteException
{
throw new UnsupportedOperationException();
}
/* (non-Javadoc)
* @see org.marketcetera.client.Service#getOpenOrders(org.marketcetera.util.ws.stateful.ClientContext)
*/
@Override
public List<ReportBaseImpl> getOpenOrders(@WebParam(name = "context")
ClientContext inContext)
throws RemoteException
{
return Collections.emptyList();
}
/* (non-Javadoc)
* @see org.marketcetera.client.Service#findRootOrderIdFor(org.marketcetera.util.ws.stateful.ClientContext, org.marketcetera.trade.OrderID)
*/
@Override
public OrderID getRootOrderIdFor(ClientContext inServiceContext,
OrderID inOrderID)
throws RemoteException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Service#addReport(org.marketcetera.util.ws.stateful.ClientContext, org.marketcetera.trade.FIXMessageWrapper, org.marketcetera.trade.BrokerID, org.marketcetera.trade.Hierarchy)
*/
@Override
public void addReport(ClientContext inContext,
FIXMessageWrapper inReport,
BrokerID inBrokerID,
Hierarchy inHierarchy)
throws RemoteException
{
throw new UnsupportedOperationException(); // TODO
}
}