/** * 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.Collection; import java.util.HashSet; import java.util.Map; import java.util.Set; import com.google.common.collect.ImmutableMap; import com.opengamma.engine.marketdata.spec.LiveMarketDataSpecification; import com.opengamma.id.ExternalIdBundle; import com.opengamma.livedata.LiveDataClient; import com.opengamma.provider.livedata.LiveDataMetaDataProvider; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.jms.JmsConnector; import com.opengamma.util.result.FailureStatus; import com.opengamma.util.result.Result; /** * Market data factory that requests data from one or more live data sources. */ public class LiveMarketDataFactory implements MarketDataFactory<LiveMarketDataSpecification> { /** Sources of live data, keyed by data source name. */ private final Map<String, LiveDataManager> _liveDataManagerBySource; /** * @param providers meta data about the live data sources * @param jmsConnector for connecting to the live data sources */ public LiveMarketDataFactory(Collection<LiveDataMetaDataProvider> providers, JmsConnector jmsConnector) { ImmutableMap.Builder<String, LiveDataManager> builder = ImmutableMap.builder(); for (LiveDataMetaDataProvider provider : providers) { LiveDataClient liveDataClient = MarketDataUtils.createLiveDataClient(provider, jmsConnector); builder.put(provider.metaData().getDescription(), new DefaultLiveDataManager(liveDataClient)); } _liveDataManagerBySource = builder.build(); } @Override public Class<LiveMarketDataSpecification> getSpecificationType() { return LiveMarketDataSpecification.class; } @Override public MarketDataSource create(LiveMarketDataSpecification spec) { String dataSourceName = spec.getDataSource(); LiveDataManager liveDataManager = _liveDataManagerBySource.get(dataSourceName); if (liveDataManager == null) { throw new IllegalArgumentException("Unsupported live data source: " + dataSourceName); } LDClient liveDataClient = new LDClient(liveDataManager); return new DataSource(liveDataClient, dataSourceName); } /** * Data source that requests live data from a {@link LDClient}. */ private static class DataSource implements MarketDataSource { /** The live data client. */ private final LDClient _liveDataClient; /** The name of the live data source. */ private final String _dataSourceName; public DataSource(LDClient liveDataClient, String dataSourceName) { _dataSourceName = dataSourceName; _liveDataClient = ArgumentChecker.notNull(liveDataClient, "liveDataClient"); } @Override public Map<MarketDataRequest, Result<?>> get(Set<MarketDataRequest> requests) { Set<ExternalIdBundle> requestIds = new HashSet<>(); for (MarketDataRequest request : requests) { requestIds.add(request.getId()); } _liveDataClient.subscribe(requestIds); _liveDataClient.waitForSubscriptions(); ImmutableLiveDataResults results = _liveDataClient.retrieveLatestData(); ImmutableMap.Builder<MarketDataRequest, Result<?>> builder = ImmutableMap.builder(); for (MarketDataRequest request : requests) { LiveDataResult liveDataResult = results.get(request.getId()); if (liveDataResult != null) { builder.put(request, liveDataResult.getValue(request.getFieldName())); } else { builder.put(request, Result.failure(FailureStatus.MISSING_DATA, "No live data available for {} from {}", request, _dataSourceName)); } } return builder.build(); } } }