}
@Override
public Set<ComputedValue> execute(final FunctionExecutionContext executionContext, final FunctionInputs inputs, final ComputationTarget target,
final Set<ValueRequirement> desiredValues) throws AsynchronousExecution {
final SnapshotDataBundle marketData = new SnapshotDataBundle();
final ExternalIdBundleResolver resolver = new ExternalIdBundleResolver(executionContext.getComputationTargetResolver());
for (final CurveNodeWithIdentifier id : _specification.getNodes()) {
if (id.getDataField() != null) {
final ComputedValue value = inputs.getComputedValue(new ValueRequirement(id.getDataField(), ComputationTargetType.PRIMITIVE, id.getIdentifier()));
if (value != null) {
final ExternalIdBundle identifiers = value.getSpecification().getTargetSpecification().accept(resolver);
if (id instanceof PointsCurveNodeWithIdentifier) {
final PointsCurveNodeWithIdentifier pointsId = (PointsCurveNodeWithIdentifier) id;
final ComputedValue base = inputs.getComputedValue(new ValueRequirement(pointsId.getUnderlyingDataField(), ComputationTargetType.PRIMITIVE, pointsId.getUnderlyingIdentifier()));
if (base != null) {
final ExternalIdBundle spreadIdentifiers = value.getSpecification().getTargetSpecification().accept(resolver);
if (value.getValue() == null || base.getValue() == null) {
marketData.setDataPoint(spreadIdentifiers, null);
} else {
marketData.setDataPoint(spreadIdentifiers, (Double) value.getValue() + (Double) base.getValue());
}
} else {
s_logger.info("Could not get market data for {}", pointsId.getUnderlyingIdentifier());
}
} else {
marketData.setDataPoint(identifiers, (Double) value.getValue());
}
} else {
s_logger.info("Could not get market data for {}", id.getIdentifier());
}
} else {
final ComputedValue value = inputs.getComputedValue(new ValueRequirement(MarketDataRequirementNames.MARKET_VALUE, ComputationTargetType.PRIMITIVE, id.getIdentifier()));
if (value != null) {
final ExternalIdBundle identifiers = value.getSpecification().getTargetSpecification().accept(resolver);
marketData.setDataPoint(identifiers, (Double) value.getValue());
} else {
s_logger.info("Could not get market data for {}", id.getIdentifier());
}
}
}