/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame.marketdata; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.slf4j.helpers.MessageFormatter; import com.google.common.collect.ImmutableSet; import com.opengamma.id.ExternalIdBundle; import com.opengamma.util.ArgumentChecker; /** * A mutable representation of the results of live market data. * <p> * This uses a map to record the current {@link LiveDataResult} for each ticker. * <p> * This class is mutable and intended for use from a single thread. * If shared between threads it must be synchronized externally. */ class DefaultMutableLiveDataResults implements MutableLiveDataResults { /** * The set of results being maintained. */ private final Map<ExternalIdBundle, LiveDataResult> _currentResults = new HashMap<>(); //------------------------------------------------------------------------- @Override public boolean containsTicker(ExternalIdBundle ticker) { return _currentResults.containsKey(ticker); } @Override public ImmutableSet<ExternalIdBundle> tickerSet() { return ImmutableSet.copyOf(_currentResults.keySet()); } @Override public int size() { return _currentResults.size(); } //------------------------------------------------------------------------- @Override public LiveDataResult get(ExternalIdBundle ticker) { return _currentResults.get(ticker); } @Override public void update(ExternalIdBundle ticker, LiveDataUpdate update) { _currentResults.put(ticker, generateMergedResult(ticker, update)); } private LiveDataResult generateMergedResult(ExternalIdBundle ticker, LiveDataUpdate update) { if (_currentResults.containsKey(ticker)) { LiveDataResult result = _currentResults.get(ticker); return result.update(update); } else { return new DefaultLiveDataResult(ticker, update); } } @Override public void remove(ExternalIdBundle ticker) { _currentResults.remove(ticker); } @Override public DefaultImmutableLiveDataResults createSnapshot(Set<ExternalIdBundle> tickers) { ArgumentChecker.notNull(tickers, "tickers"); Map<ExternalIdBundle, LiveDataResult> results = new HashMap<>(); for (ExternalIdBundle ticker : tickers) { LiveDataResult result = _currentResults.get(ticker); if (result != null) { results.put(ticker, result.permissionCheck()); } } return new DefaultImmutableLiveDataResults(results); } @Override public ImmutableLiveDataResults createSnapshot() { return createSnapshot(_currentResults.keySet()); } //------------------------------------------------------------------------- @Override public void markAsPending(ExternalIdBundle ticker) { _currentResults.put(ArgumentChecker.notNull(ticker, "ticker"), new PendingLiveDataResult(ticker)); } @Override public void markAsMissing(ExternalIdBundle ticker, String userMessage, Object... args) { String message = formatMessage(userMessage, args); _currentResults.put(ArgumentChecker.notNull(ticker, "ticker"), new MissingLiveDataResult(ticker, message)); } @Override public void markAsPermissionDenied(ExternalIdBundle ticker, String userMessage, Object... args) { String message = formatMessage(userMessage, args); _currentResults.put(ArgumentChecker.notNull(ticker, "ticker"), new PermissionDeniedLiveDataResult(message)); } private String formatMessage(String userMessage, Object[] args) { return MessageFormatter.format(ArgumentChecker.notNull(userMessage, "userMessage"), args).getMessage(); } //------------------------------------------------------------------------- @Override public boolean isPending(ExternalIdBundle ticker) { if (containsTicker(ticker)) { return _currentResults.get(ticker).isPending(); } else { throw new IllegalArgumentException("No result found for ticker: " + ticker); } } //------------------------------------------------------------------------- @Override public String toString() { return "DefaultMutableLiveDataResults[size=" + _currentResults.size() + "]"; } }