/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.management;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Maps;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.engine.view.ViewCalculationConfiguration;
import com.opengamma.engine.view.compilation.CompiledViewCalculationConfiguration;
import com.opengamma.engine.view.compilation.CompiledViewDefinition;
/**
* Contains mappings between {@link ValueRequirement}s and {@link ValueSpecification}s for a compiled view definition. These mappings can be large and are used by both the primitives and portfolio
* grids so it makes sense to share them.
*/
public class ValueMappings {
private static final Logger s_logger = LoggerFactory.getLogger(ValueMappings.class);
private final class ConfigurationData {
private final Map<ValueRequirement, ValueSpecification> _reqsToSpecs = Maps.newHashMap();
public ConfigurationData(final CompiledViewCalculationConfiguration compiledConfig) {
Map<ValueSpecification, Set<ValueRequirement>> terminalOutputs = compiledConfig.getTerminalOutputSpecifications();
for (Map.Entry<ValueSpecification, Set<ValueRequirement>> entry : terminalOutputs.entrySet()) {
Set<ValueRequirement> requirements = entry.getValue();
if (requirements == null) {
s_logger.error("Unexpected set of null requirements in terminal outputs map from " + entry.getKey() + ". This is a bug in incremental dependency graph compilation.");
continue;
}
for (ValueRequirement valueRequirement : requirements) {
_reqsToSpecs.put(createRequirement(valueRequirement), entry.getKey());
}
}
}
public ValueSpecification getValueSpecification(final ValueRequirement valueRequirement) {
return _reqsToSpecs.get(createRequirement(valueRequirement));
}
}
/**
* Subclasses of ValueMappings need to alter the ValueRequirement, for example
* UnversionedValueMappings strips out version from the unique id
* @param valueRequirement in this case it is returned unaltered
* @return valueRequirement
*/
protected ValueRequirement createRequirement(ValueRequirement valueRequirement) {
return valueRequirement;
}
/**
* Data held for each view calculation configuration.
*/
private final Map<String, ConfigurationData> _configurations;
/**
* Creates an instance with no mappings.
*/
public ValueMappings() {
_configurations = Collections.emptyMap();
}
public ValueMappings(CompiledViewDefinition compiledViewDef) {
_configurations = Maps.newHashMap();
for (ViewCalculationConfiguration calcConfig : compiledViewDef.getViewDefinition().getAllCalculationConfigurations()) {
String configName = calcConfig.getName();
CompiledViewCalculationConfiguration compiledConfig = compiledViewDef.getCompiledCalculationConfiguration(configName);
// store the mappings from outputs to requirements for each calc config
_configurations.put(configName, new ConfigurationData(compiledConfig));
}
}
/**
* Returns the {@link ValueSpecification} for a {@link ValueRequirement} in a particular calculation configuration.
*
* @param calcConfigName The name of the calculation configuration
* @param valueReq The requirement
* @return The specification or null if there isn't one for the specified requirement and config
*/
public ValueSpecification getValueSpecification(String calcConfigName, ValueRequirement valueReq) {
final ConfigurationData configuration = _configurations.get(calcConfigName);
if (configuration != null) {
return configuration.getValueSpecification(valueReq);
} else {
return null;
}
}
}