/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.fxforwardcurve;
import java.util.Set;
import org.threeten.bp.Instant;
import com.google.common.collect.ImmutableSet;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.function.AbstractFunction;
import com.opengamma.engine.function.CompiledFunctionDefinition;
import com.opengamma.engine.function.FunctionCompilationContext;
import com.opengamma.engine.function.FunctionExecutionContext;
import com.opengamma.engine.function.FunctionInputs;
import com.opengamma.engine.target.ComputationTargetType;
import com.opengamma.engine.value.ComputedValue;
import com.opengamma.engine.value.ValueProperties;
import com.opengamma.engine.value.ValuePropertyNames;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.value.ValueRequirementNames;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.util.async.AsynchronousExecution;
import com.opengamma.util.money.Currency;
import com.opengamma.util.money.UnorderedCurrencyPair;
/**
* Retrieves an FXForwardCurveDefinition.
*/
public class FXForwardCurveDefinitionFunction extends AbstractFunction {
private final UnorderedCurrencyPair _currencies;
private final String _curveName;
private final ComputationTargetSpecification _targetSpec;
private ConfigDBFXForwardCurveDefinitionSource _fxForwardCurveDefinitionSource;
public FXForwardCurveDefinitionFunction(String ccy1, String ccy2, String curveName) {
this(UnorderedCurrencyPair.of(Currency.of(ccy1), Currency.of(ccy2)), curveName);
}
public FXForwardCurveDefinitionFunction(UnorderedCurrencyPair currencies, String curveName) {
_currencies = currencies;
_curveName = curveName;
_targetSpec = ComputationTargetType.UNORDERED_CURRENCY_PAIR.specification(currencies);
}
@Override
public void init(final FunctionCompilationContext context) {
_fxForwardCurveDefinitionSource = ConfigDBFXForwardCurveDefinitionSource.init(context, this);
}
private class CompiledImpl extends AbstractFunction.AbstractInvokingCompiledFunction {
private final FXForwardCurveDefinition _curveDefinition;
public CompiledImpl(FXForwardCurveDefinition curveDefinition) {
_curveDefinition = curveDefinition;
}
@Override
public ComputationTargetType getTargetType() {
return ComputationTargetType.UNORDERED_CURRENCY_PAIR;
}
@Override
public boolean canApplyTo(FunctionCompilationContext context, ComputationTarget target) {
return _currencies.equals((UnorderedCurrencyPair) target.getValue());
}
@Override
public Set<ValueSpecification> getResults(FunctionCompilationContext context, ComputationTarget target) {
ValueProperties properties = createResultProperties();
return ImmutableSet.of(new ValueSpecification(ValueRequirementNames.FX_FORWARD_CURVE_DEFINITION, _targetSpec, properties));
}
protected ValueProperties createResultProperties() {
return createValueProperties().with(ValuePropertyNames.CURVE, _curveName).get();
}
@Override
public Set<ValueRequirement> getRequirements(FunctionCompilationContext context, ComputationTarget target, ValueRequirement desiredValue) {
return ImmutableSet.of();
}
@Override
public Set<ComputedValue> execute(FunctionExecutionContext executionContext, FunctionInputs inputs, ComputationTarget target, Set<ValueRequirement> desiredValues)
throws AsynchronousExecution {
return ImmutableSet.of(new ComputedValue(new ValueSpecification(ValueRequirementNames.FX_FORWARD_CURVE_DEFINITION, _targetSpec, createResultProperties()), _curveDefinition));
}
}
@Override
public CompiledFunctionDefinition compile(FunctionCompilationContext context, Instant atInstant) {
final FXForwardCurveDefinition definition = _fxForwardCurveDefinitionSource.getDefinition(_curveName, _currencies.toString());
return new CompiledImpl(definition);
}
}