/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.function.config;
import java.util.List;
import java.util.Set;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.opengamma.core.config.ConfigSource;
import com.opengamma.id.VersionCorrection;
import com.opengamma.util.ArgumentChecker;
/**
* Aggregate functions defined in a {@link FunctionConfigurationDefinition}
*/
public final class FunctionConfigurationDefinitionAggregator {
private final ConfigSource _configSource;
public FunctionConfigurationDefinitionAggregator(final ConfigSource configSource) {
ArgumentChecker.notNull(configSource, "configSource");
_configSource = configSource;
}
/**
* Loads the given definition, aggregating any referenced definitions.
*
* @param configDefinitionName the definition to load, not null
* @param version the configuration version/correction timestamp, not null
* @return the configuration bundle, not null
*/
public FunctionConfigurationBundle aggregate(final String configDefinitionName, final VersionCorrection version) {
ArgumentChecker.notNull(configDefinitionName, "configDefinitionName");
FunctionConfigurationDefinition configDefinition = _configSource.getSingle(FunctionConfigurationDefinition.class, configDefinitionName, version);
FunctionConfigurationBundle bundle = new FunctionConfigurationBundle();
if (configDefinition != null) {
bundle = functionAggregator(configDefinition, version);
}
return bundle;
}
/**
* Loads the given definition, aggregating any referenced definitions.
*
* @param configDefinitionName the definition to load, not null
* @return a static {@link FunctionConfigurationSource} that returns the definitions, not null
* @deprecated The configuration returned will be static - make repeated calls to {@link #aggregate(String, VersionCorrection)} if you need to handle configuration changes at run-time
*/
@Deprecated
public FunctionConfigurationSource aggregate(final String configDefinitionName) {
return new SimpleFunctionConfigurationSource(aggregate(configDefinitionName, VersionCorrection.LATEST));
}
private FunctionConfigurationBundle functionAggregator(final FunctionConfigurationDefinition configDefinition, final VersionCorrection version) {
final Set<FunctionConfiguration> functions = Sets.newHashSet();
final List<String> visitedConfigs = Lists.newArrayList();
functionAggregatorHelper(functions, visitedConfigs, configDefinition, version);
return new FunctionConfigurationBundle(functions);
}
private void functionAggregatorHelper(final Set<FunctionConfiguration> functions, final List<String> visitedConfigs, final FunctionConfigurationDefinition configDefinition,
final VersionCorrection version) {
visitedConfigs.add(configDefinition.getName());
functions.addAll(configDefinition.getStaticFunctions());
functions.addAll(configDefinition.getParameterizedFunctions());
for (String configDefinitionName : configDefinition.getFunctionConfigurationDefinitions()) {
if (!visitedConfigs.contains(configDefinitionName)) {
FunctionConfigurationDefinition linkedConfig = _configSource.getSingle(FunctionConfigurationDefinition.class, configDefinitionName, version);
if (linkedConfig != null) {
functionAggregatorHelper(functions, visitedConfigs, linkedConfig, version);
}
}
}
}
}