/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.marketdata.availability; import java.io.Serializable; import com.opengamma.engine.ComputationTargetSpecification; import com.opengamma.engine.function.MarketDataSourcingFunction; import com.opengamma.engine.target.ComputationTargetType; import com.opengamma.engine.target.resolver.IdentifierResolver; import com.opengamma.engine.value.ValueProperties; import com.opengamma.engine.value.ValuePropertyNames; import com.opengamma.engine.value.ValueRequirement; import com.opengamma.engine.value.ValueSpecification; import com.opengamma.id.ExternalBundleIdentifiable; import com.opengamma.id.ExternalIdentifiable; import com.opengamma.id.UniqueId; import com.opengamma.id.VersionCorrection; /** * An implementation of {@link MarketDataAvailabilityProvider} that produces arbitrary value specifications for all values. * <p> * This is provided for use in test cases only, and would normally be used as the provider passed to an existing {@link MarketDataAvailabilityFilter}. A market data provider would normally require * more control over the specifications issued in order to manage later subscriptions to the values. */ public class DefaultMarketDataAvailabilityProvider implements MarketDataAvailabilityProvider { private static IdentifierResolver s_identifiers = (IdentifierResolver) ComputationTargetType.PRIMITIVE; /** * Creates a default computation target specification for an object that is either {@link ExternalBundleIdentifiable} or {@link ExternalIdentifiable} using the * {@link ComputationTargetType#PRIMITIVE} logic. * <p> * This is suitable for cases where the market data provider can recognize the target object identifiers, but the system could not resolve it to a strict specification (for example it is for a * ticker describing a security that is not present in the security master). * * @param target the object to create a specification for, not null * @return a specification, not null * @throws IllegalArgumentException if the target is not a suitable type */ public static ComputationTargetSpecification createPrimitiveComputationTargetSpecification(final Object target) { final UniqueId uid; if (target instanceof ExternalBundleIdentifiable) { // VersionCorrection.LATEST is correct for this - the primitive identifier resolution hacking is independent of the resolution time uid = s_identifiers.resolveExternalId(((ExternalBundleIdentifiable) target).getExternalIdBundle(), VersionCorrection.LATEST); } else if (target instanceof ExternalIdentifiable) { // VersionCorrection.LATEST is correct for this - the primitive identifier resolution hacking is independent of the resolution time uid = s_identifiers.resolveExternalId(((ExternalIdentifiable) target).getExternalId().toBundle(), VersionCorrection.LATEST); } else { throw new IllegalArgumentException(target.toString()); } return new ComputationTargetSpecification(ComputationTargetType.PRIMITIVE, uid); } @Override public ValueSpecification getAvailability(ComputationTargetSpecification targetSpec, final Object target, final ValueRequirement desiredValue) throws MarketDataNotSatisfiableException { if (targetSpec == null) { targetSpec = createPrimitiveComputationTargetSpecification(target); } return new ValueSpecification(desiredValue.getValueName(), targetSpec, ValueProperties.with(ValuePropertyNames.FUNCTION, MarketDataSourcingFunction.UNIQUE_ID).get()); } @Override public MarketDataAvailabilityFilter getAvailabilityFilter() { return new ProviderMarketDataAvailabilityFilter(this); } @Override public Serializable getAvailabilityHintKey() { return getClass(); } }