package org.marketcetera.client;
import org.marketcetera.util.misc.ClassVersion;
import org.marketcetera.util.misc.NamedThreadFactory;
import org.marketcetera.module.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.Map;
import java.util.Hashtable;
/* $License$ */
/**
* The module for sending orders.
*
* @author anshul@marketcetera.com
* @version $Id: OrderSenderModule.java 16154 2012-07-14 16:34:05Z colin $
* @since 1.0.0
*/
@ClassVersion("$Id: OrderSenderModule.java 16154 2012-07-14 16:34:05Z colin $")
//$NON-NLS-1$
public class OrderSenderModule extends Module implements DataEmitter {
protected OrderSenderModule(ModuleURN inURN, Object[] inOrders) {
super(inURN, true);
mOrders = inOrders;
}
@Override
protected void preStart() throws ModuleException {
}
@Override
protected void preStop() throws ModuleException {
}
@Override
public void requestData(DataRequest inRequest,
DataEmitterSupport inSupport)
throws RequestDataException {
mTable.put(inSupport.getRequestID(), sExecutors.submit(
new OrderSender(inSupport)));
}
@Override
public void cancel(DataFlowID inFlowID, RequestID inRequestID) {
Future<?> future = mTable.remove(inRequestID);
future.cancel(true);
}
public class OrderSender implements Callable<Object> {
@Override
public Object call() throws Exception {
for (Object o : mOrders) {
if (Boolean.FALSE.equals(o)) {
//Help test client failure duing data flow
ClientManager.getInstance().close();
} else {
mSupport.send(o);
}
}
//Sleep until the flow is cancelled
synchronized(this) {
wait();
}
return null;
}
public OrderSender(DataEmitterSupport inSupport) {
mSupport = inSupport;
}
private DataEmitterSupport mSupport;
}
private final Object[] mOrders;
private final Map<RequestID, Future<?>> mTable = new Hashtable<RequestID, Future<?>>();
private final static ExecutorService sExecutors =
Executors.newCachedThreadPool(new NamedThreadFactory("TestOrderSender-"));
}