/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.marketdata.live;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.engine.marketdata.MarketDataProvider;
import com.opengamma.engine.marketdata.spec.LiveMarketDataSpecification;
import com.opengamma.engine.marketdata.spec.MarketDataSpecification;
import com.opengamma.livedata.UserPrincipal;
import com.opengamma.util.ArgumentChecker;
/**
* Factory for {@link MarketDataProvider}s backed by live data.
*/
public class InMemoryLKVLiveMarketDataProviderFactory implements LiveMarketDataProviderFactory {
private final LiveDataFactory _defaultFactory;
private final Map<String, LiveDataFactory> _namedFactories;
private final List<String> _providerNames;
public InMemoryLKVLiveMarketDataProviderFactory(LiveDataFactory defaultFactory, Map<String, LiveDataFactory> namedFactories) {
ArgumentChecker.notNull(defaultFactory, "defaultFactory");
ArgumentChecker.notNull(namedFactories, "namedFactories");
_defaultFactory = defaultFactory;
_namedFactories = ImmutableMap.copyOf(namedFactories);
String defaultFactoryName = null;
for (Map.Entry<String, LiveDataFactory> namedFactoryEntry : namedFactories.entrySet()) {
LiveDataFactory factory = namedFactoryEntry.getValue();
if (defaultFactory == factory) {
defaultFactoryName = namedFactoryEntry.getKey();
continue;
}
}
if (defaultFactoryName == null) {
throw new OpenGammaRuntimeException("Default factory not found in named factories map");
}
List<String> providerNames = new ArrayList<>(_namedFactories.keySet());
Collections.sort(providerNames);
providerNames.remove(defaultFactoryName);
providerNames.add(0, defaultFactoryName);
_providerNames = ImmutableList.copyOf(providerNames);
}
@Override
public MarketDataProvider create(UserPrincipal user, MarketDataSpecification marketDataSpec) {
ArgumentChecker.notNull(user, "user");
ArgumentChecker.notNull(marketDataSpec, "marketDataSpec");
LiveMarketDataSpecification liveSpec = (LiveMarketDataSpecification) marketDataSpec;
if (liveSpec.getDataSource() == null) {
return _defaultFactory.create(user);
}
LiveDataFactory liveDataFactory = _namedFactories.get(liveSpec.getDataSource());
if (liveDataFactory == null) {
throw new IllegalArgumentException("No provider could be created for data source '" + liveSpec.getDataSource() + "'");
}
return liveDataFactory.create(user);
}
@Override
public List<String> getProviderNames() {
return _providerNames;
}
}