/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.marketdata; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.DataNotFoundException; import com.opengamma.core.id.ExternalSchemes; import com.opengamma.core.security.SecuritySource; import com.opengamma.core.value.MarketDataRequirementNames; import com.opengamma.engine.ComputationTargetResolver; import com.opengamma.engine.ComputationTargetSpecification; import com.opengamma.engine.cache.MissingInput; import com.opengamma.engine.marketdata.OverrideOperation; import com.opengamma.engine.marketdata.OverrideOperationCompiler; import com.opengamma.engine.target.ComputationTargetReference; import com.opengamma.engine.target.ComputationTargetReferenceVisitor; import com.opengamma.engine.target.ComputationTargetRequirement; import com.opengamma.engine.target.ComputationTargetType; import com.opengamma.engine.value.ValueRequirement; import com.opengamma.engine.view.cycle.SingleComputationCycle; import com.opengamma.id.ExternalIdBundle; import com.opengamma.util.ArgumentChecker; /** * Implements the hacks previously in {@link SingleComputationCycle} using the * {@link OverrideOperation} mechanism. * * @deprecated Should not be used; the EL based compiler is more flexible */ @Deprecated public class MarketDataHackedExpressionCompiler implements OverrideOperationCompiler { private static final Logger s_logger = LoggerFactory.getLogger(MarketDataHackedExpressionCompiler.class); private final SecuritySource _securitySource; private final class Operation implements OverrideOperation { private final double _shift; public Operation(final double shift) { _shift = shift; } @Override public Object apply(final ValueRequirement valueRequirement, final Object value) { final ComputationTargetReference targetSpec = valueRequirement.getTargetReference(); // Only shift equities if (targetSpec.getType().isTargetType(ComputationTargetType.SECURITY) || !MarketDataRequirementNames.MARKET_VALUE.equals(valueRequirement.getValueName())) { return value; } final ExternalIdBundle bundle = targetSpec.accept(new ComputationTargetReferenceVisitor<ExternalIdBundle>() { @Override public ExternalIdBundle visitComputationTargetRequirement(final ComputationTargetRequirement requirement) { return requirement.getIdentifiers(); } @Override public ExternalIdBundle visitComputationTargetSpecification(final ComputationTargetSpecification specification) { try { return getSecuritySource().get(specification.getUniqueId()).getExternalIdBundle(); } catch (final DataNotFoundException ex) { return null; } } }); if ((bundle == null) || !bundle.getValue(ExternalSchemes.BLOOMBERG_TICKER).contains("Equity")) { return value; } if (value instanceof Number) { return ((Number) value).doubleValue() * _shift; } else if (value instanceof MissingInput) { return value; } else { s_logger.warn("Can't shift market data {} - not a number", value); } return value; } } public MarketDataHackedExpressionCompiler(final SecuritySource securitySource) { ArgumentChecker.notNull(securitySource, "securitySource"); _securitySource = securitySource; } @Override public OverrideOperation compile(final String operation, final ComputationTargetResolver.AtVersionCorrection resolver) { try { return new Operation(Double.parseDouble(operation)); } catch (final NumberFormatException e) { throw new IllegalArgumentException("Market data shift " + operation + " not valid"); } } private SecuritySource getSecuritySource() { return _securitySource; } }