/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.livedata.test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.fudgemsg.FudgeContext;
import org.fudgemsg.FudgeMsg;
import org.springframework.context.Lifecycle;
import com.opengamma.livedata.client.DistributedLiveDataClient;
import com.opengamma.livedata.client.JmsLiveDataClient;
import com.opengamma.livedata.entitlement.EntitlementServer;
import com.opengamma.livedata.server.StandardLiveDataServer;
import com.opengamma.livedata.server.SubscriptionRequestReceiver;
import com.opengamma.livedata.server.distribution.FudgeSenderFactory;
import com.opengamma.livedata.server.distribution.JmsSenderFactory;
import com.opengamma.transport.ByteArrayFudgeMessageReceiver;
import com.opengamma.transport.ByteArrayFudgeMessageSender;
import com.opengamma.transport.ByteArrayFudgeRequestSender;
import com.opengamma.transport.DirectInvocationByteArrayMessageSender;
import com.opengamma.transport.FudgeMessageReceiver;
import com.opengamma.transport.FudgeRequestDispatcher;
import com.opengamma.transport.FudgeRequestSender;
import com.opengamma.transport.InMemoryByteArrayRequestConduit;
import com.opengamma.util.jms.JmsConnector;
import com.opengamma.util.test.ActiveMQTestUtils;
import com.opengamma.util.test.TestLifecycle;
/**
* Utility methods to get LiveData clients suitable for testing.
*/
public class LiveDataClientTestUtils {
private static ExecutorService executor(final int threads) {
if (threads == 0) {
return null;
}
final ExecutorService executor = Executors.newFixedThreadPool(threads);
TestLifecycle.register(new Lifecycle() {
@Override
public void start() {
throw new UnsupportedOperationException();
}
@Override
public void stop() {
executor.shutdown();
}
@Override
public boolean isRunning() {
return !executor.isShutdown();
}
});
return executor;
}
/**
* Creates a test client connected to the server.
*
* @param server the test server, not null
* @param threads the number of communication threads, or 0 for direct/inline calls to the server
* @return the client
*/
public static DistributedLiveDataClient getInMemoryConduitClient(final StandardLiveDataServer server, final int threads) {
final ExecutorService executor = executor(threads);
final FudgeRequestSender subscriptionRequestSender = getSubscriptionRequestSender(server, executor);
final FudgeRequestSender entitlementRequestSender = getEntitlementRequestSender(server, executor);
final DistributedLiveDataClient liveDataClient = new DistributedLiveDataClient(subscriptionRequestSender, entitlementRequestSender);
final FudgeSenderFactory factory = new FudgeSenderFactory(new ByteArrayFudgeMessageSender(new DirectInvocationByteArrayMessageSender(new ByteArrayFudgeMessageReceiver(liveDataClient))));
server.setMarketDataSenderFactory(factory);
liveDataClient.setFudgeContext(liveDataClient.getFudgeContext());
return liveDataClient;
}
public static DistributedLiveDataClient getInMemoryConduitClient(final StandardLiveDataServer server) {
return getInMemoryConduitClient(server, 0);
}
/**
* Creates a test client connected to the server.
*
* @param server the test server, not null
* @param threads the number of communication threads, or 0 for direct/inline calls to the server
* @return the client
*/
public static JmsLiveDataClient getJmsClient(final StandardLiveDataServer server, final int threads) {
final ExecutorService executor = executor(threads);
final FudgeRequestSender subscriptionRequestSender = getSubscriptionRequestSender(server, executor);
final FudgeRequestSender entitlementRequestSender = getEntitlementRequestSender(server, executor);
final JmsConnector jmsConnector = ActiveMQTestUtils.createTestJmsConnector();
final JmsLiveDataClient liveDataClient = new JmsLiveDataClient(subscriptionRequestSender, entitlementRequestSender, jmsConnector);
final JmsSenderFactory factory = new JmsSenderFactory();
factory.setJmsConnector(jmsConnector);
server.setMarketDataSenderFactory(factory);
liveDataClient.setFudgeContext(liveDataClient.getFudgeContext());
liveDataClient.start();
return liveDataClient;
}
public static JmsLiveDataClient getJmsClient(final StandardLiveDataServer server) {
return getJmsClient(server, 0);
}
private static FudgeRequestSender sender(final FudgeRequestSender sender, final ExecutorService executor) {
if (executor == null) {
return sender;
} else {
return new FudgeRequestSender() {
@Override
public FudgeContext getFudgeContext() {
return sender.getFudgeContext();
}
@Override
public void sendRequest(final FudgeMsg request, final FudgeMessageReceiver responseReceiver) {
executor.execute(new Runnable() {
@Override
public void run() {
try {
sender.sendRequest(request, responseReceiver);
} catch (Throwable t) {
t.printStackTrace();
}
}
});
}
};
}
}
private static FudgeRequestSender getEntitlementRequestSender(final StandardLiveDataServer server, final ExecutorService executor) {
return sender(new ByteArrayFudgeRequestSender(new InMemoryByteArrayRequestConduit(new FudgeRequestDispatcher(new EntitlementServer(server.getEntitlementChecker())))), executor);
}
private static FudgeRequestSender getSubscriptionRequestSender(final StandardLiveDataServer server, final ExecutorService executor) {
return sender(new ByteArrayFudgeRequestSender(new InMemoryByteArrayRequestConduit(new FudgeRequestDispatcher(new SubscriptionRequestReceiver(server)))), executor);
}
}