/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.model;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import com.google.common.collect.Iterables;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.core.position.Position;
import com.opengamma.core.position.Trade;
import com.opengamma.core.security.Security;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.function.AbstractFunction;
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.ValueRequirement;
import com.opengamma.engine.value.ValueRequirementNames;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.financial.security.future.DeliverableSwapFutureSecurity;
import com.opengamma.financial.security.future.InterestRateFutureSecurity;
import com.opengamma.util.async.AsynchronousExecution;
/**
*
*/
public class MarketQuotePositionFunction extends AbstractFunction.NonCompiledInvoker {
@Override
public Set<ComputedValue> execute(FunctionExecutionContext executionContext, FunctionInputs inputs, ComputationTarget target,
Set<ValueRequirement> desiredValues) throws AsynchronousExecution {
final ValueRequirement desiredValue = Iterables.getOnlyElement(desiredValues);
final ValueProperties properties = desiredValue.getConstraints();
final Collection<ComputedValue> marketQuotes = inputs.getAllValues();
final Iterator<ComputedValue> iter = marketQuotes.iterator();
final Double marketQuote = (Double) iter.next().getValue();
while (iter.hasNext()) {
final Double test = (Double) iter.next().getValue();
if (Double.compare(marketQuote, test) != 0) {
throw new OpenGammaRuntimeException("Have different values for market quote in the same position");
}
}
return Collections.singleton(new ComputedValue(new ValueSpecification(ValueRequirementNames.MARKET_QUOTE, target.toSpecification(), properties), marketQuote));
}
@Override
public ComputationTargetType getTargetType() {
return ComputationTargetType.POSITION;
}
@Override
public boolean canApplyTo(FunctionCompilationContext context, ComputationTarget target) {
final Position position = target.getPosition();
final Collection<Trade> trades = position.getTrades();
for (Trade trade : trades) {
Security security = trade.getSecurity();
if (security instanceof InterestRateFutureSecurity || security instanceof DeliverableSwapFutureSecurity) {
return true;
}
}
return false;
}
@Override
public Set<ValueSpecification> getResults(FunctionCompilationContext context, ComputationTarget target) {
final ValueProperties properties = ValueProperties.all();
return Collections.singleton(new ValueSpecification(ValueRequirementNames.MARKET_QUOTE, target.toSpecification(), properties));
}
@Override
public Set<ValueRequirement> getRequirements(FunctionCompilationContext context, ComputationTarget target, ValueRequirement desiredValue) {
final ValueProperties properties = desiredValue.getConstraints();
final Position position = target.getPosition();
final Collection<Trade> trades = position.getTrades();
final Set<ValueRequirement> requirements = new HashSet<>();
for (Trade trade : trades) {
requirements.add(new ValueRequirement(ValueRequirementNames.MARKET_QUOTE, ComputationTargetSpecification.of(trade), properties));
}
return requirements;
}
}