/**
* 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.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opengamma.engine.marketdata.availability.FixedMarketDataAvailabilityProvider;
import com.opengamma.engine.marketdata.availability.MarketDataAvailabilityProvider;
import com.opengamma.engine.marketdata.spec.MarketDataSpecification;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.value.ValueSpecification;
/**
* An implementation of {@link MarketDataProvider} which maintains an LKV cache of externally-provided values.
*/
public class InMemoryLKVMarketDataProvider extends AbstractMarketDataProvider implements MarketDataInjector {
private static final Logger s_logger = LoggerFactory.getLogger(InMemoryLKVMarketDataProvider.class);
private final Map<ValueSpecification, Object> _lastKnownValues = new ConcurrentHashMap<ValueSpecification, Object>();
private final FixedMarketDataAvailabilityProvider _availability = new FixedMarketDataAvailabilityProvider();
private final MarketDataPermissionProvider _permissionProvider;
/**
* Constructs an instance.
*/
public InMemoryLKVMarketDataProvider() {
_permissionProvider = new PermissiveMarketDataPermissionProvider();
}
//-------------------------------------------------------------------------
@Override
public void subscribe(final ValueSpecification valueSpecification) {
subscribe(Collections.singleton(valueSpecification));
}
@Override
public void subscribe(final Set<ValueSpecification> valueSpecifications) {
// No actual subscription to make, but we still need to acknowledge it.
s_logger.debug("Added subscriptions to {}", valueSpecifications);
subscriptionsSucceeded(valueSpecifications);
}
@Override
public void unsubscribe(final ValueSpecification valueSpecification) {
unsubscribe(Collections.singleton(valueSpecification));
}
@Override
public void unsubscribe(final Set<ValueSpecification> valueSpecifications) {
// No actual unsubscription to make
s_logger.debug("Unsubscribed from {}", valueSpecifications);
}
@Override
public MarketDataAvailabilityProvider getAvailabilityProvider(final MarketDataSpecification marketDataSpec) {
return _availability;
}
@Override
public MarketDataPermissionProvider getPermissionProvider() {
return _permissionProvider;
}
@Override
public boolean isCompatible(final MarketDataSpecification marketDataSpec) {
return true;
}
@Override
public InMemoryLKVMarketDataSnapshot snapshot(final MarketDataSpecification marketDataSpec) {
return new InMemoryLKVMarketDataSnapshot(this);
}
@Override
public void addValue(final ValueSpecification specification, final Object value) {
if (value != null) {
_lastKnownValues.put(specification, value);
}
_availability.addAvailableData(specification);
valueChanged(specification);
}
@Override
public void addValue(final ValueRequirement requirement, final Object value) {
final ValueSpecification resolved = _availability.resolveRequirement(requirement);
addValue(resolved, value);
}
@Override
public void removeValue(final ValueSpecification specification) {
_availability.removeAvailableData(specification);
_lastKnownValues.remove(specification);
valueChanged(specification);
}
@Override
public void removeValue(final ValueRequirement valueRequirement) {
final ValueSpecification resolved = _availability.resolveRequirement(valueRequirement);
removeValue(resolved);
}
//-------------------------------------------------------------------------
public Set<ValueSpecification> getAllValueKeys() {
return Collections.unmodifiableSet(_lastKnownValues.keySet());
}
public Object getCurrentValue(final ValueSpecification specification) {
return _lastKnownValues.get(specification);
}
//-------------------------------------------------------------------------
/*package*/Map<ValueSpecification, Object> doSnapshot() {
return new HashMap<>(_lastKnownValues);
}
}