/** * Copyright (C) 2012 - 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.value.ValueRequirement; import com.opengamma.engine.value.ValueSpecification; import com.opengamma.id.ExternalBundleIdentifiable; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.id.ExternalIdentifiable; import com.opengamma.id.UniqueId; import com.opengamma.id.UniqueIdentifiable; /** * A partial implementation of {@link MarketDataAvailabilityProvider}. */ public abstract class AbstractMarketDataAvailabilityProvider implements MarketDataAvailabilityProvider { /** * Resolves the availability of an item that can be referenced by external identifier. * * @param targetSpec the target specification as passed to {@link MarketDataAvailabilityProvider#getAvailability}, possibly null * @param identifier the external identifier of the target object, not null * @param desiredValue the requested value to test and resolve, not null * @return the resolved subscription value if available, null otherwise */ protected abstract ValueSpecification getAvailability(final ComputationTargetSpecification targetSpec, final ExternalId identifier, final ValueRequirement desiredValue); /** * Resolves the availability of an item that can be referenced by one or more external identifiers. * * @param targetSpec the target specification as passed to {@link MarketDataAvailabilityProvider#getAvailability}, possibly null * @param identifiers the external identifiers of the target object, not null * @param desiredValue the requested value to test and resolve, not null * @return the resolved subscription value if available, null otherwise */ protected abstract ValueSpecification getAvailability(final ComputationTargetSpecification targetSpec, final ExternalIdBundle identifiers, final ValueRequirement desiredValue); /** * Resolves the availability of an item that can only be referenced by unique identifier * * @param targetSpec the target specification as passed to {@link MarketDataAvailabilityProvider#getAvailability}, possibly null * @param identifier the unique identifier of the target object, not null * @param desiredValue the requested value to test and resolve, not null * @return the resolved subscription value if available, null otherwise */ protected abstract ValueSpecification getAvailability(final ComputationTargetSpecification targetSpec, final UniqueId identifier, final ValueRequirement desiredValue); /** * Resolves the availability of the null target. * * @param targetSpec the target specification, always {@link ComputationTargetSpecification#NULL} * @param desiredValue the requested value to test and resolve, not null * @return the resolved subscription value if available, null otherwise */ protected abstract ValueSpecification getAvailability(final ComputationTargetSpecification targetSpec, final ValueRequirement desiredValue); /** * Tests how the target can be referenced and defers to one of the other {@code getAvailability} methods. * * @param targetSpec the target specification as passed to {@link MarketDataAvailabilityProvider#getAvailability}, possibly null * @param target the target to evaluate, not null * @param desiredValue the requested value to test and resolve, not null * @return the resolved subscription value if available, null otherwise */ @Override public final ValueSpecification getAvailability(final ComputationTargetSpecification targetSpec, final Object target, final ValueRequirement desiredValue) { if (target instanceof ExternalBundleIdentifiable) { final ValueSpecification availability = getAvailability(targetSpec, ((ExternalBundleIdentifiable) target).getExternalIdBundle(), desiredValue); if (availability != null) { return availability; } } if (target instanceof ExternalIdentifiable) { final ValueSpecification availability = getAvailability(targetSpec, ((ExternalIdentifiable) target).getExternalId(), desiredValue); if (availability != null) { return availability; } } if (target instanceof UniqueIdentifiable) { final ValueSpecification availability = getAvailability(targetSpec, ((UniqueIdentifiable) target).getUniqueId(), desiredValue); if (availability != null) { return availability; } } if (target == null) { return getAvailability(targetSpec, desiredValue); } else { return null; } } @Override public MarketDataAvailabilityFilter getAvailabilityFilter() { return new ProviderMarketDataAvailabilityFilter(this); } public static AbstractMarketDataAvailabilityProvider of(final MarketDataAvailabilityProvider provider) { if (provider instanceof AbstractMarketDataAvailabilityProvider) { return (AbstractMarketDataAvailabilityProvider) provider; } else { return new AbstractMarketDataAvailabilityProvider() { @Override public MarketDataAvailabilityFilter getAvailabilityFilter() { return provider.getAvailabilityFilter(); } @Override protected ValueSpecification getAvailability(final ComputationTargetSpecification targetSpec, final ExternalId identifier, final ValueRequirement desiredValue) { return provider.getAvailability(targetSpec, identifier, desiredValue); } @Override protected ValueSpecification getAvailability(final ComputationTargetSpecification targetSpec, final ExternalIdBundle identifiers, final ValueRequirement desiredValue) { return provider.getAvailability(targetSpec, identifiers, desiredValue); } @Override protected ValueSpecification getAvailability(final ComputationTargetSpecification targetSpec, final UniqueId identifier, final ValueRequirement desiredValue) { return provider.getAvailability(targetSpec, identifier, desiredValue); } @Override protected ValueSpecification getAvailability(final ComputationTargetSpecification targetSpec, final ValueRequirement desiredValue) { return provider.getAvailability(targetSpec, null, desiredValue); } @Override public Serializable getAvailabilityHintKey() { return provider.getAvailabilityHintKey(); } }; } } }