/** * 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.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import com.opengamma.livedata.LiveDataListener; import com.opengamma.livedata.LiveDataSpecification; import com.opengamma.livedata.LiveDataValueUpdate; import com.opengamma.livedata.msg.LiveDataSubscriptionResponse; import com.opengamma.livedata.msg.LiveDataSubscriptionResult; /** * Just collects events for use in a test environment. * * @author kirk */ public class CollectingLiveDataListener implements LiveDataListener { private final Semaphore _responses; private final Semaphore _updates; private final List<LiveDataSubscriptionResponse> _subscriptionResponses = new ArrayList<LiveDataSubscriptionResponse>(); private final List<LiveDataSpecification> _stoppedSubscriptions = new ArrayList<LiveDataSpecification>(); private final Map<LiveDataSpecification, LiveDataSpecification> _client2ServerSpec = new HashMap<LiveDataSpecification, LiveDataSpecification>(); private final Map<LiveDataSpecification, List<LiveDataValueUpdate>> _valueUpdates = new HashMap<LiveDataSpecification, List<LiveDataValueUpdate>>(); public CollectingLiveDataListener() { this(1, 1); } public CollectingLiveDataListener(int numResponsesToExpect, int numUpdatesToWaitFor) { _responses = new Semaphore(1 - numResponsesToExpect); _updates = new Semaphore(1 - numUpdatesToWaitFor); } public synchronized void clear() { _subscriptionResponses.clear(); _stoppedSubscriptions.clear(); _valueUpdates.clear(); } @Override public synchronized void subscriptionResultReceived(LiveDataSubscriptionResponse subscriptionResult) { _subscriptionResponses.add(subscriptionResult); if (subscriptionResult.getSubscriptionResult() == LiveDataSubscriptionResult.SUCCESS) { _client2ServerSpec.put(subscriptionResult.getRequestedSpecification(), subscriptionResult.getFullyQualifiedSpecification()); } _responses.release(); } @Override public synchronized void subscriptionResultsReceived(Collection<LiveDataSubscriptionResponse> subscriptionResults) { _subscriptionResponses.addAll(subscriptionResults); for (LiveDataSubscriptionResponse subscriptionResult : subscriptionResults) { if (subscriptionResult.getSubscriptionResult() == LiveDataSubscriptionResult.SUCCESS) { _client2ServerSpec.put(subscriptionResult.getRequestedSpecification(), subscriptionResult.getFullyQualifiedSpecification()); } _responses.release(); } } @Override public synchronized void subscriptionStopped(LiveDataSpecification fullyQualifiedSpecification) { _stoppedSubscriptions.add(fullyQualifiedSpecification); } @Override public synchronized void valueUpdate(LiveDataValueUpdate valueUpdate) { List<LiveDataValueUpdate> updates = _valueUpdates.get(valueUpdate.getSpecification()); if (updates == null) { updates = new ArrayList<LiveDataValueUpdate>(); _valueUpdates.put(valueUpdate.getSpecification(), updates); } updates.add(valueUpdate); _updates.release(); } public synchronized List<LiveDataSubscriptionResponse> getSubscriptionResponses() { return new ArrayList<LiveDataSubscriptionResponse>(_subscriptionResponses); } public synchronized List<LiveDataSpecification> getStoppedSubscriptions() { return new ArrayList<LiveDataSpecification>(_stoppedSubscriptions); } public synchronized List<LiveDataValueUpdate> getValueUpdates() { ArrayList<LiveDataValueUpdate> returnValue = new ArrayList<LiveDataValueUpdate>(); for (List<LiveDataValueUpdate> updates : _valueUpdates.values()) { returnValue.addAll(updates); } return returnValue; } public synchronized List<LiveDataValueUpdate> getValueUpdates(LiveDataSpecification specFromClient) { LiveDataSpecification fullyQualifiedSpec = _client2ServerSpec.get(specFromClient); if (fullyQualifiedSpec == null) { return Collections.emptyList(); } List<LiveDataValueUpdate> updates = _valueUpdates.get(fullyQualifiedSpec); if (updates == null) { return Collections.emptyList(); } return new ArrayList<LiveDataValueUpdate>(updates); } public boolean waitForResponses(final int count, final long timeoutMs) { try { return _responses.tryAcquire(count, timeoutMs, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { Thread.interrupted(); throw new RuntimeException("Interrupted"); } } public boolean waitUntilAllResponsesReceived(final long timeoutMs) { return waitForResponses(1, timeoutMs); } public boolean waitForUpdates(final int count, final long timeoutMs) { try { return _updates.tryAcquire(count, timeoutMs, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { Thread.interrupted(); throw new RuntimeException("Interrupted"); } } public boolean waitUntilEnoughUpdatesReceived(final long timeoutMs) { return waitForUpdates(1, timeoutMs); } }