package org.marketcetera.client;
import java.beans.ExceptionListener;
import java.math.BigDecimal;
import java.util.*;
import org.marketcetera.client.brokers.BrokersStatus;
import org.marketcetera.client.users.UserInfo;
import org.marketcetera.core.notifications.ServerStatusListener;
import org.marketcetera.core.position.PositionKey;
import org.marketcetera.trade.*;
import org.marketcetera.trade.Currency;
import com.google.common.collect.Lists;
/* $License$ */
/**
* Test {@link Client} implementation.
*
* <p>This test client is used by many different tests. Users may customize this class or derive
* new ones from it. Please take care to leave current implementation intact in order to avoid
* disrupting other tests. The exception to this rule is for methods that are current unimplemented
* (throw <code>UnsupportedOperationException</code>).
*
* @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a>
* @version $Id: MockClient.java 16888 2014-04-22 18:32:36Z colin $
* @since 2.1.4
*/
public class MockClient
implements Client
{
/**
* Create a new MockClient instance.
*
* @param inClientParameters a <code>ClientParameters</code> value
*/
public MockClient(ClientParameters inClientParameters)
{
clientParameters = inClientParameters;
}
/**
* Create a new MockClient instance.
*/
public MockClient()
{
this(null);
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#sendOrder(org.marketcetera.trade.OrderSingle)
*/
@Override
public void sendOrder(OrderSingle inOrderSingle)
throws ConnectionException, OrderValidationException
{
if(sendOrderSingleConnectionException != null) {
throw sendOrderSingleConnectionException;
}
if(sendOrderSingleValidationException != null) {
throw sendOrderSingleValidationException;
}
orders.add(inOrderSingle);
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#sendOrder(org.marketcetera.trade.OrderReplace)
*/
@Override
public void sendOrder(OrderReplace inOrderReplace)
throws ConnectionException, OrderValidationException
{
if(sendOrderReplaceConnectionException != null) {
throw sendOrderReplaceConnectionException;
}
if(sendOrderReplaceValidationException != null) {
throw sendOrderReplaceValidationException;
}
replaces.add(inOrderReplace);
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#sendOrder(org.marketcetera.trade.OrderCancel)
*/
@Override
public void sendOrder(OrderCancel inOrderCancel)
throws ConnectionException, OrderValidationException
{
if(sendOrderCancelConnectionException != null) {
throw sendOrderCancelConnectionException;
}
if(sendOrderCancelValidationException != null) {
throw sendOrderCancelValidationException;
}
cancels.add(inOrderCancel);
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#sendOrderRaw(org.marketcetera.trade.FIXOrder)
*/
@Override
public void sendOrderRaw(FIXOrder inFIXOrder)
throws ConnectionException, OrderValidationException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#getReportsSince(java.util.Date)
*/
@Override
public ReportBase[] getReportsSince(Date inDate)
throws ConnectionException
{
if(getReportsSinceThrows != null) {
throw getReportsSinceThrows;
}
List<ReportBase> reportsToReturn = new ArrayList<ReportBase>();
for(ReportBase report : reports) {
if(report.getSendingTime().compareTo(inDate) != -1) {
reportsToReturn.add(report);
}
}
return reportsToReturn.toArray(new ReportBase[reportsToReturn.size()]);
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#getEquityPositionAsOf(java.util.Date, org.marketcetera.trade.Equity)
*/
@Override
public BigDecimal getEquityPositionAsOf(Date inDate,
Equity inEquity)
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#getAllEquityPositionsAsOf(java.util.Date)
*/
@Override
public Map<PositionKey<Equity>, BigDecimal> getAllEquityPositionsAsOf(Date inDate)
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#getFuturePositionAsOf(java.util.Date, org.marketcetera.trade.Future)
*/
@Override
public BigDecimal getFuturePositionAsOf(Date inDate,
Future inFuture)
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#getAllFuturePositionsAsOf(java.util.Date)
*/
@Override
public Map<PositionKey<Future>, BigDecimal> getAllFuturePositionsAsOf(Date inDate)
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#getOptionPositionAsOf(java.util.Date, org.marketcetera.trade.Option)
*/
@Override
public BigDecimal getOptionPositionAsOf(Date inDate,
Option inOption)
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#getAllOptionPositionsAsOf(java.util.Date)
*/
@Override
public Map<PositionKey<Option>, BigDecimal> getAllOptionPositionsAsOf(Date inDate)
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#getOptionPositionsAsOf(java.util.Date, java.lang.String[])
*/
@Override
public Map<PositionKey<Option>, BigDecimal> getOptionPositionsAsOf(Date inDate,
String... inRootSymbols)
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#getUnderlying(java.lang.String)
*/
@Override
public String getUnderlying(String inOptionRoot)
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#getOptionRoots(java.lang.String)
*/
@Override
public Collection<String> getOptionRoots(String inUnderlying)
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#addReportListener(org.marketcetera.client.ReportListener)
*/
@Override
public void addReportListener(ReportListener inListener)
{
reportListeners.add(inListener);
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#removeReportListener(org.marketcetera.client.ReportListener)
*/
@Override
public void removeReportListener(ReportListener inListener)
{
reportListeners.remove(inListener);
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#addBrokerStatusListener(org.marketcetera.client.BrokerStatusListener)
*/
@Override
public void addBrokerStatusListener(BrokerStatusListener inListener)
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#removeBrokerStatusListener(org.marketcetera.client.BrokerStatusListener)
*/
@Override
public void removeBrokerStatusListener(BrokerStatusListener inListener)
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#addServerStatusListener(org.marketcetera.client.ServerStatusListener)
*/
@Override
public void addServerStatusListener(ServerStatusListener inListener)
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#removeServerStatusListener(org.marketcetera.client.ServerStatusListener)
*/
@Override
public void removeServerStatusListener(ServerStatusListener inListener)
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#addExceptionListener(java.beans.ExceptionListener)
*/
@Override
public void addExceptionListener(ExceptionListener inListener)
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#removeExceptionListener(java.beans.ExceptionListener)
*/
@Override
public void removeExceptionListener(ExceptionListener inListener)
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#close()
*/
@Override
public void close()
{
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#reconnect()
*/
@Override
public void reconnect()
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#reconnect(org.marketcetera.client.ClientParameters)
*/
@Override
public void reconnect(ClientParameters inParameters)
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#getParameters()
*/
@Override
public ClientParameters getParameters()
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#getLastConnectTime()
*/
@Override
public Date getLastConnectTime()
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#getBrokersStatus()
*/
@Override
public BrokersStatus getBrokersStatus()
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#getUserInfo(org.marketcetera.trade.UserID, boolean)
*/
@Override
public UserInfo getUserInfo(UserID inId,
boolean inUseCache)
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#isCredentialsMatch(java.lang.String, char[])
*/
@Override
public boolean isCredentialsMatch(String inUsername,
char[] inPassword)
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#isServerAlive()
*/
@Override
public boolean isServerAlive()
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#setUserData(java.util.Properties)
*/
@Override
public void setUserData(Properties inProperties)
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#getUserData()
*/
@Override
public Properties getUserData()
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#resolveSymbol(java.lang.String)
*/
@Override
public Instrument resolveSymbol(String inSymbol)
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#deleteReport(org.marketcetera.trade.ExecutionReportImpl)
*/
@Override
public void deleteReport(ExecutionReportImpl inReport)
throws ConnectionException
{
throw new UnsupportedOperationException();
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#findRootOrderIdFor(org.marketcetera.trade.OrderID)
*/
@Override
public OrderID findRootOrderIdFor(OrderID inOrderID)
{
throw new UnsupportedOperationException(); // TODO
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#getOpenOrders()
*/
@Override
public List<ReportBaseImpl> getOpenOrders()
throws ConnectionException
{
return openOrders;
}
@Override
public BigDecimal getCurrencyPositionAsOf(Date inDate, Currency inCurrency)
throws ConnectionException {
// TODO Auto-generated method stub
return null;
}
@Override
public Map<PositionKey<Currency>, BigDecimal> getAllCurrencyPositionsAsOf(
Date inDate) throws ConnectionException {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see org.marketcetera.client.Client#addReport(org.marketcetera.trade.FIXMessageWrapper, org.marketcetera.trade.BrokerID, org.marketcetera.trade.Hierarchy)
*/
@Override
public void addReport(FIXMessageWrapper inReport,
BrokerID inBrokerID,
Hierarchy inHierarchy)
throws ConnectionException
{
throw new UnsupportedOperationException(); // TODO
}
/**
* Gets the <code>ClientParameters</code> value used to initialize the client.
*
* @return a <code>ClientParameters</code> value or <code>null</code>
*/
public ClientParameters getClientParameters()
{
return clientParameters;
}
/**
* Gets the registered report listeners.
*
* @return a <code>Collection<ReportListener></code> value
*/
public Collection<ReportListener> getReportListeners()
{
return reportListeners;
}
/**
* Gets the reports used to feed report-based operations.
*
* @return a <code>Set<ReportBase></code> value
*/
public Set<ReportBase> getReports()
{
return reports;
}
/**
* Gets the orders collected via {@link #sendOrder(OrderSingle)}.
*
* @return a <code>Collection<OrderSingle></code> value
*/
public Collection<OrderSingle> getOrders()
{
return orders;
}
/**
* Get the replaces value.
*
* @return a <code>Collection<OrderReplace></code> value
*/
public Collection<OrderReplace> getReplaces()
{
return replaces;
}
/**
* Get the cancels value.
*
* @return a <code>Collection<OrderCancel></code> value
*/
public Collection<OrderCancel> getCancels()
{
return cancels;
}
/**
* Sends the given <code>ReportBase</code> to registered report listeners.
*
* @param inReport a <code>ReportBase</code> value
*/
public void sendToListeners(ReportBase inReport)
{
for(ReportListener reportListener : reportListeners) {
if(inReport instanceof ExecutionReport) {
reportListener.receiveExecutionReport((ExecutionReport)inReport);
} else if(inReport instanceof OrderCancelReject) {
reportListener.receiveCancelReject((OrderCancelReject)inReport);
} else {
throw new UnsupportedOperationException();
}
}
}
/**
* Sets the exception to be thrown during {@link #getReportsSince(Date)}.
*
* @param inException a <code>ConnectionException</code> value or <code>null</code>
*/
public void setGetReportsSinceException(ConnectionException inException)
{
getReportsSinceThrows = inException;
}
/**
* Sets the exception to be thrown during {@link #sendOrder(OrderSingle)}.
*
* @param inException a <code>ConnectionException</code> value or <code>null</code>
*/
public void setSendOrderSingleException(ConnectionException inException)
{
sendOrderSingleConnectionException = inException;
}
/**
* Sets the sendOrderReplaceConnectionException value.
*
* @param a <code>ConnectionException</code> value
*/
public void setSendOrderReplaceConnectionException(ConnectionException inSendOrderReplaceConnectionException)
{
sendOrderReplaceConnectionException = inSendOrderReplaceConnectionException;
}
/**
* Sets the sendOrderCancelConnectionException value.
*
* @param a <code>ConnectionException</code> value
*/
public void setSendOrderCancelConnectionException(ConnectionException inSendOrderCancelConnectionException)
{
sendOrderCancelConnectionException = inSendOrderCancelConnectionException;
}
/**
* Sets the sendOrderSingleValidationException value.
*
* @param an <code>OrderValidationException</code> value
*/
public void setSendOrderSingleValidationException(OrderValidationException inSendOrderSingleValidationException)
{
sendOrderSingleValidationException = inSendOrderSingleValidationException;
}
/**
* Sets the sendOrderReplaceValidationException value.
*
* @param an <code>OrderValidationException</code> value
*/
public void setSendOrderReplaceValidationException(OrderValidationException inSendOrderReplaceValidationException)
{
sendOrderReplaceValidationException = inSendOrderReplaceValidationException;
}
/**
* Sets the sendOrderCancelValidationException value.
*
* @param an <code>OrderValidationException</code> value
*/
public void setSendOrderCancelValidationException(OrderValidationException inSendOrderCancelValidationException)
{
sendOrderCancelValidationException = inSendOrderCancelValidationException;
}
/**
* Clears the client state.
*/
public void reset()
{
reportListeners.clear();
reports.clear();
orders.clear();
replaces.clear();
cancels.clear();
openOrders.clear();
setGetReportsSinceException(null);
setSendOrderSingleException(null);
setSendOrderReplaceConnectionException(null);
setSendOrderCancelConnectionException(null);
setSendOrderSingleValidationException(null);
setSendOrderReplaceValidationException(null);
setSendOrderCancelValidationException(null);
}
/**
* Creates {@link MockClient} objects.
*
* @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a>
* @version $Id: MockClient.java 16888 2014-04-22 18:32:36Z colin $
* @since 2.1.4
*/
public static class MockClientFactory
implements ClientFactory
{
/* (non-Javadoc)
* @see org.marketcetera.client.ClientFactory#getClient(org.marketcetera.client.ClientParameters)
*/
@Override
public Client getClient(ClientParameters inClientParameters)
throws ClientInitException, ConnectionException
{
return new MockClient(inClientParameters);
}
}
/**
* Compares the sending times of two <code>ReportBase</code> values.
*
* @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a>
* @version $Id: MockClient.java 16888 2014-04-22 18:32:36Z colin $
* @since 2.1.4
*/
private enum ReportSendingTimeComparator
implements Comparator<ReportBase>
{
INSTANCE;
/* (non-Javadoc)
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
@Override
public int compare(ReportBase inO1,
ReportBase inO2)
{
return inO1.getSendingTime().compareTo(inO2.getSendingTime());
}
}
/**
* reports used to feed report-related calls
*/
private final Set<ReportBase> reports = new TreeSet<ReportBase>(ReportSendingTimeComparator.INSTANCE);
/**
* open orders (in addition to existing reports to return)
*/
private final List<ReportBaseImpl> openOrders = Lists.newArrayList();
/**
* orders sent since last {@link #reset()}
*/
private final Collection<OrderSingle> orders = new ArrayList<OrderSingle>();
/**
* replaces sent since last {@link #reset()}
*/
private final Collection<OrderReplace> replaces = new ArrayList<OrderReplace>();
/**
* cancels sent since last {@link #reset()}
*/
private final Collection<OrderCancel> cancels = new ArrayList<OrderCancel>();
/**
* client parameters used to instantiate the client, may be <code>null</code>
*/
private final ClientParameters clientParameters;
/**
* listeners registered for execution reports
*/
private final Collection<ReportListener> reportListeners = new LinkedHashSet<ReportListener>();
/**
* if non-null, will be thrown during {@link #getReportsSince(Date)}.
*/
private volatile ConnectionException getReportsSinceThrows;
/**
* if non-null, will be thrown during {@link #sendOrder(OrderSingle)}
*/
private volatile ConnectionException sendOrderSingleConnectionException = null;
/**
* if non-null, will be thrown during {@link #sendOrder(OrderReplace)
*/
private volatile ConnectionException sendOrderReplaceConnectionException = null;
/**
* if non-null, will be thrown during {@link #sendCancel(OrderCancel)
*/
private volatile ConnectionException sendOrderCancelConnectionException = null;
/**
* if non-null, will be thrown during {@link #sendOrder(OrderSingle)}
*/
private volatile OrderValidationException sendOrderSingleValidationException = null;
/**
* if non-null, will be thrown during {@link #sendOrder(OrderReplace)
*/
private volatile OrderValidationException sendOrderReplaceValidationException = null;
/**
* if non-null, will be thrown during {@link #sendCancel(OrderCancel)
*/
private volatile OrderValidationException sendOrderCancelValidationException = null;
}