/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.marketdata.live;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Set;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.marketdata.availability.AbstractMarketDataAvailabilityProvider;
import com.opengamma.engine.marketdata.availability.DefaultMarketDataAvailabilityProvider;
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.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.id.UniqueId;
import com.opengamma.livedata.LiveDataSpecification;
import com.opengamma.util.ArgumentChecker;
/**
* Market data availability delegate that can perform conversion to/from the {@link LiveDataSpecification} objects needed by the data provider.
*/
/* package */class LiveMarketDataAvailabilityProvider extends AbstractMarketDataAvailabilityProvider {
private static final String IDENTIFIER_PROPERTY = "Id";
private static final String NORMALIZATION_PROPERTY = "Normalization";
private final String _normalizationRules;
/**
* Constructs a new instance.
*
* @param normalizationRules the normalization rules to use
*/
public LiveMarketDataAvailabilityProvider(final String normalizationRules) {
ArgumentChecker.notNull(normalizationRules, "normalizationRules");
_normalizationRules = normalizationRules;
}
protected String getNormalizationRules() {
return _normalizationRules;
}
protected String getSyntheticFunctionName() {
return "LiveMarketData";
}
/**
* Creates a live data specification based on a {@link ValueSpecification} created by this availability provider. The normalization ruleset is used as the target. The external identifiers are marked
* with properties.
*
* @param properties the properties, not null
* @return the original live data specification, not null
*/
public static LiveDataSpecification getLiveDataSpecification(final ValueSpecification valueSpec) {
final String normalizer = valueSpec.getProperty(NORMALIZATION_PROPERTY);
final Set<String> identifierStrings = valueSpec.getProperties().getValues(IDENTIFIER_PROPERTY);
final ExternalId[] identifiers = new ExternalId[identifierStrings.size()];
int i = 0;
for (final String identifierString : identifierStrings) {
identifiers[i++] = ExternalId.parse(identifierString);
}
return new LiveDataSpecification(normalizer, identifiers);
}
protected ValueProperties.Builder createValueProperties() {
return ValueProperties.with(ValuePropertyNames.FUNCTION, getSyntheticFunctionName()).with(NORMALIZATION_PROPERTY, getNormalizationRules());
}
@Override
protected ValueSpecification getAvailability(ComputationTargetSpecification targetSpec, final ExternalId identifier, final ValueRequirement desiredValue) {
if (targetSpec == null) {
targetSpec = DefaultMarketDataAvailabilityProvider.createPrimitiveComputationTargetSpecification(identifier);
}
return new ValueSpecification(desiredValue.getValueName(), targetSpec, createValueProperties().with(IDENTIFIER_PROPERTY, identifier.toString()).get());
}
@Override
protected ValueSpecification getAvailability(ComputationTargetSpecification targetSpec, final ExternalIdBundle identifiers, final ValueRequirement desiredValue) {
if (targetSpec == null) {
targetSpec = DefaultMarketDataAvailabilityProvider.createPrimitiveComputationTargetSpecification(identifiers);
}
final String[] identifierStrings = new String[identifiers.size()];
int i = 0;
for (final ExternalId identifier : identifiers) {
identifierStrings[i++] = identifier.toString();
}
return new ValueSpecification(desiredValue.getValueName(), targetSpec, createValueProperties().with(IDENTIFIER_PROPERTY, identifierStrings).get());
}
@Override
protected ValueSpecification getAvailability(final ComputationTargetSpecification targetSpec, final UniqueId identifier, final ValueRequirement desiredValue) {
// Can't provide any live data unless there is an external identifier recognized by the data provider
return null;
}
@Override
protected ValueSpecification getAvailability(final ComputationTargetSpecification targetSpec, final ValueRequirement desiredValue) {
// Can't provide any live data for the NULL target
return null;
}
@Override
public Serializable getAvailabilityHintKey() {
final ArrayList<Serializable> key = new ArrayList<Serializable>(3);
key.add(getClass().getName());
key.add(getNormalizationRules());
return key;
}
}