/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.marketdata;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.ComputationTargetResolver;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.target.ComputationTargetReference;
import com.opengamma.engine.target.ComputationTargetReferenceVisitor;
import com.opengamma.engine.target.ComputationTargetRequirement;
import com.opengamma.engine.target.ComputationTargetSpecificationResolver;
import com.opengamma.id.ExternalBundleIdentifiable;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.id.ExternalIdentifiable;
/**
* Helper class for obtaining the maximal {@link ExternalIdBundle} for a target. This is intended for use by market data integrations that must obtain external identifier appropriate to that provider
* from a more restricted target reference or resolved object.
*/
public class ExternalIdBundleResolver implements ComputationTargetReferenceVisitor<ExternalIdBundle> {
private final ComputationTargetResolver.AtVersionCorrection _targetResolver;
private final ComputationTargetSpecificationResolver.AtVersionCorrection _specificationResolver;
public ExternalIdBundleResolver(final ComputationTargetResolver.AtVersionCorrection resolver) {
_targetResolver = resolver;
_specificationResolver = resolver.getSpecificationResolver();
}
public ComputationTargetSpecification getTargetSpecification(final ComputationTargetReference reference) {
return _specificationResolver.getTargetSpecification(reference);
}
public ExternalIdBundle getExternalIdBundle(final ComputationTargetReference reference) {
return reference.accept(this);
}
@Override
public ExternalIdBundle visitComputationTargetRequirement(final ComputationTargetRequirement requirement) {
final ComputationTargetSpecification specification = _specificationResolver.getTargetSpecification(requirement);
if (specification != null) {
return visitComputationTargetSpecification(specification);
} else {
return requirement.getIdentifiers();
}
}
@Override
public ExternalIdBundle visitComputationTargetSpecification(final ComputationTargetSpecification specification) {
final ComputationTarget target = _targetResolver.resolve(specification);
if (target == null) {
// Note: Don't convert the unique identifier to an external identifier
return null;
}
if (target.getValue() instanceof ExternalBundleIdentifiable) {
return ((ExternalBundleIdentifiable) target.getValue()).getExternalIdBundle();
} else if (target.getValue() instanceof ExternalIdentifiable) {
return ((ExternalIdentifiable) target.getValue()).getExternalId().toBundle();
} else {
// Note: Don't convert the unique identifier to an external identifier.
return null;
}
}
}