/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.function.resolver; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; import org.threeten.bp.Instant; import com.opengamma.engine.function.CompiledFunctionDefinition; import com.opengamma.engine.function.CompiledFunctionRepository; import com.opengamma.engine.function.CompiledFunctionService; import com.opengamma.engine.function.FunctionDefinition; import com.opengamma.engine.function.ParameterizedFunction; import com.opengamma.util.ArgumentChecker; /** * Default implementation of the function resolver. * <p> * The aim of the resolution is to find functions that are capable of satisfying a requirement. In addition, a priority mechanism is used to return functions in priority order from highest to lowest. * Resolution actually occurs in the {@code CompiledFunctionResolver}. This class creates a {@code DefaultCompiledFunctionResolver} instance. * <p> * This class is not thread-safe. */ public class DefaultFunctionResolver implements FunctionResolver { /** * The provider of compiled functions. */ private final CompiledFunctionService _functionCompilationService; /** * The provider of the priority of a function. */ private final FunctionPriority _prioritizer; /** * The default resolution rules. */ private Set<ResolutionRule> _defaultRules; /** * Creates an instance. * * @param functionCompilationService the provider of compiled functions, not null */ public DefaultFunctionResolver(final CompiledFunctionService functionCompilationService) { ArgumentChecker.notNull(functionCompilationService, "functionCompilationService"); _functionCompilationService = functionCompilationService; _prioritizer = null; } /** * Creates an instance. * * @param functionCompilationService the provider of compiled functions, not null * @param prioritizer the provider of the priority of a function, not null */ public DefaultFunctionResolver(final CompiledFunctionService functionCompilationService, final FunctionPriority prioritizer) { ArgumentChecker.notNull(functionCompilationService, "functionCompilationService"); ArgumentChecker.notNull(prioritizer, "prioritizer"); _functionCompilationService = functionCompilationService; _prioritizer = prioritizer; } //------------------------------------------------------------------------- /** * Adds a single rule to the resolver. * * @param resolutionRule the rule to add, not null */ public void addRule(ResolutionRule resolutionRule) { addRules(Collections.singleton(resolutionRule)); } /** * Adds rules to the resolver. * * @param resolutionRules the rules to add, no nulls, not null */ public void addRules(Collection<ResolutionRule> resolutionRules) { if (_defaultRules == null) { _defaultRules = new HashSet<ResolutionRule>(); } _defaultRules.addAll(resolutionRules); } //------------------------------------------------------------------------- /** * Extracts all the compiled function definitions from the repository and converts them to resolution rules. * * @param repository the function repository, not null * @return the rules, not null */ protected Collection<ResolutionRule> getRepositoryRules(final CompiledFunctionRepository repository) { // REVIEW 2011-07-29 SJC: static method? final Collection<CompiledFunctionDefinition> functions = repository.getAllFunctions(); final Collection<ResolutionRule> result = new ArrayList<ResolutionRule>(functions.size()); for (CompiledFunctionDefinition compiledFnDefn : repository.getAllFunctions()) { if (compiledFnDefn.getTargetType() != null) { ParameterizedFunction paramFn = new ParameterizedFunction(compiledFnDefn, compiledFnDefn.getFunctionDefinition().getDefaultParameters()); result.add(new ResolutionRule(paramFn, ApplyToAllTargets.INSTANCE, getPriority(compiledFnDefn))); } } return result; } /** * Gets the priority of a compiled function definition. This uses the stored priority provider. * * @param function the function to examine, not null * @return the priority, default zero */ protected int getPriority(final CompiledFunctionDefinition function) { return (_prioritizer != null) ? _prioritizer.getPriority(function) : 0; } //------------------------------------------------------------------------- @Override public CompiledFunctionResolver compile(final Instant atInstant) { final DefaultCompiledFunctionResolver result = new DefaultCompiledFunctionResolver(_functionCompilationService.getFunctionCompilationContext()); result.addRules(getRepositoryRules(_functionCompilationService.compileFunctionRepository(atInstant))); if (_defaultRules != null) { result.addRules(_defaultRules); } result.compileRules(); return result; } @Override public FunctionDefinition getFunction(final String uniqueId) { return _functionCompilationService.getFunctionRepository().getFunction(uniqueId); } }