/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.marketdata; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.TimeUnit; import org.threeten.bp.Instant; import com.google.common.collect.Maps; import com.opengamma.engine.value.ValueSpecification; import com.opengamma.id.UniqueId; import com.opengamma.util.tuple.Pair; /** * */ public class CombinedMarketDataSnapshot extends AbstractMarketDataSnapshot { private final Map<MarketDataProvider, MarketDataSnapshot> _snapshotByProvider; private final MarketDataSnapshot _preferredSnapshot; private final CombinedMarketDataProvider _combinedMarketDataProvider; public CombinedMarketDataSnapshot(final MarketDataSnapshot preferredSnapshot, final Map<MarketDataProvider, MarketDataSnapshot> snapshotByProvider, final CombinedMarketDataProvider combinedMarketDataProvider) { _preferredSnapshot = preferredSnapshot; _snapshotByProvider = snapshotByProvider; _combinedMarketDataProvider = combinedMarketDataProvider; } @Override public UniqueId getUniqueId() { // REVIEW 2013-02-06 Andrew -- This isn't really a useful unique id; it should be allocated by whatever persists this object or is capable of recreating it. // Two snapshots containing different data but from the same time will also have the same unique identifier return UniqueId.of(MARKET_DATA_SNAPSHOT_ID_SCHEME, "CombinedMarketDataSnapshot:" + getSnapshotTime()); } @Override public Instant getSnapshotTimeIndication() { return _preferredSnapshot.getSnapshotTimeIndication(); } @Override public void init() { for (final MarketDataSnapshot entry : _snapshotByProvider.values()) { entry.init(); } } @Override public void init(final Set<ValueSpecification> values, final long timeout, final TimeUnit unit) { //TODO: timeout should be total final Map<MarketDataProvider, Set<ValueSpecification>> groupByProvider = _combinedMarketDataProvider.getProviders(values); for (final Entry<MarketDataProvider, Set<ValueSpecification>> entry : groupByProvider.entrySet()) { final MarketDataSnapshot snapshot = _snapshotByProvider.get(entry.getKey()); snapshot.init(entry.getValue(), timeout, unit); } } @Override public boolean isInitialized() { return _preferredSnapshot.isInitialized(); } @Override public boolean isEmpty() { assertInitialized(); for (MarketDataSnapshot snapshot : _snapshotByProvider.values()) { if (!snapshot.isEmpty()) { return false; } } return true; } @Override public Instant getSnapshotTime() { return _preferredSnapshot.getSnapshotTime(); } @Override public Object query(final ValueSpecification value) { final Pair<MarketDataProvider, ValueSpecification> providerAndSpec = _combinedMarketDataProvider.getProvider(value); return _snapshotByProvider.get(providerAndSpec.getFirst()).query(providerAndSpec.getSecond()); } @Override public Map<ValueSpecification, Object> query(final Set<ValueSpecification> values) { final Map<ValueSpecification, Object> result = Maps.newHashMapWithExpectedSize(values.size()); final Map<MarketDataProvider, Map<ValueSpecification, ValueSpecification>> groupByProvider = _combinedMarketDataProvider.getProvidersAsMap(values); for (final Entry<MarketDataProvider, Map<ValueSpecification, ValueSpecification>> entry : groupByProvider.entrySet()) { for (Map.Entry<ValueSpecification, Object> innerResult : _snapshotByProvider.get(entry.getKey()).query(entry.getValue().keySet()).entrySet()) { result.put(entry.getValue().get(innerResult.getKey()), innerResult.getValue()); } } return result; } }