/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.view.worker;
import java.util.List;
import java.util.Map;
import java.util.Set;
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.ComputationTargetType;
import com.opengamma.engine.target.ComputationTargetTypeVisitor;
import com.opengamma.id.UniqueId;
import com.opengamma.id.UniqueIdentifiable;
/**
* Visitor to remap the unique identifier from a target specification.
*/
/* package */final class ComputationTargetIdentifierRemapVisitor implements ComputationTargetReferenceVisitor<ComputationTargetReference> {
private static final ComputationTargetTypeVisitor<Void, ComputationTargetType> s_getLeafType = new ComputationTargetTypeVisitor<Void, ComputationTargetType>() {
@Override
public ComputationTargetType visitMultipleComputationTargetTypes(final Set<ComputationTargetType> types, final Void data) {
throw new IllegalStateException();
}
@Override
public ComputationTargetType visitNestedComputationTargetTypes(final List<ComputationTargetType> types, final Void data) {
return types.get(types.size() - 1);
}
@Override
public ComputationTargetType visitNullComputationTargetType(final Void data) {
throw new IllegalStateException();
}
@Override
public ComputationTargetType visitClassComputationTargetType(final Class<? extends UniqueIdentifiable> type, final Void data) {
throw new IllegalStateException();
}
};
private final Map<UniqueId, UniqueId> _map;
public ComputationTargetIdentifierRemapVisitor(final Map<UniqueId, UniqueId> map) {
_map = map;
}
public ComputationTargetRequirement remap(final ComputationTargetRequirement requirement) {
ComputationTargetReference parent = requirement.getParent();
if (parent != null) {
final ComputationTargetReference rewriteParent = parent.accept(this);
if (rewriteParent != null) {
return rewriteParent.containing(requirement.getType().accept(s_getLeafType, null), requirement.getIdentifiers());
}
}
return null;
}
public ComputationTargetSpecification remap(final ComputationTargetSpecification specification) {
UniqueId rewriteSelf = _map.get(specification.getUniqueId());
ComputationTargetReference parent = specification.getParent();
if (parent != null) {
final ComputationTargetReference rewriteParent = parent.accept(this);
if (rewriteParent != null) {
if (rewriteSelf != null) {
return rewriteParent.containing(specification.getType().accept(s_getLeafType, null), rewriteSelf);
} else {
return rewriteParent.containing(specification.getType().accept(s_getLeafType, null), specification.getUniqueId());
}
}
}
if (rewriteSelf != null) {
return specification.replaceIdentifier(rewriteSelf);
}
return null;
}
// ComputationTargetReferenceVisitor
@Override
public ComputationTargetReference visitComputationTargetRequirement(ComputationTargetRequirement requirement) {
return remap(requirement);
}
@Override
public ComputationTargetReference visitComputationTargetSpecification(ComputationTargetSpecification specification) {
return remap(specification);
}
}