/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.integration.tool.enginedebugger.node; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import com.opengamma.engine.ComputationTargetSpecification; import com.opengamma.engine.target.ComputationTargetRequirement; import com.opengamma.engine.value.ValueRequirement; import com.opengamma.engine.value.ValueSpecification; import com.opengamma.util.ArgumentChecker; /** * Listing an entry in the map - has convenience functions to make it easier to represent in a table. */ public class SpecToRequirementEntryNode implements TreeTableNode { private static final String NAME = "ValueSpec->ValueReq"; private final ValueSpecification _specification; private final ValueRequirement _requirement; private List<String> _orderedUnionProperties; public SpecToRequirementEntryNode(ValueSpecification specification, ValueRequirement requirement) { ArgumentChecker.notNull(specification, "specification"); ArgumentChecker.notNull(requirement, "requirement"); _specification = specification; _requirement = requirement; _orderedUnionProperties = new ArrayList<>(getUnionConstraints()); } private Set<String> getUnionConstraints() { Set<String> constraintNames = new LinkedHashSet<>(_specification.getProperties().getProperties()); constraintNames.addAll(_specification.getProperties().getProperties()); return constraintNames; } public String getValueName() { return _specification.getValueName(); } public String getFunctionUniqueId() { return _specification.getFunctionUniqueId(); } public ComputationTargetRequirement getRequirementTarget() { return (ComputationTargetRequirement) _requirement.getTargetReference(); } public ComputationTargetSpecification getSpecificationTarget() { return _specification.getTargetSpecification(); } public SpanningValuePropertyEntryNode getSpanningValuePropertyEntry(int i) { String propertyName = _orderedUnionProperties.get(i); return new SpanningValuePropertyEntryNode(propertyName, getRequirementConstraint(propertyName), isOptionalRequirementConstraint(propertyName), getSpecificationConstraint(propertyName), isOptionalSpecificationConstraint(propertyName)); } public String getRequirementConstraint(String constraint) { return _requirement.getConstraints().getValues(constraint).toString(); } public boolean isOptionalRequirementConstraint(String constraint) { return _requirement.getConstraints().isOptional(constraint); } public String getSpecificationConstraint(String constraint) { return _specification.getProperties().getValues(constraint).toString(); } public boolean isOptionalSpecificationConstraint(String constraint) { return _specification.getProperties().isOptional(constraint); } public ValueSpecification getValueSpecification() { return _specification; } public ValueRequirement getValueRequirement() { return _requirement; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null) { return false; } if (!(o instanceof SpecToRequirementEntryNode)) { return false; } SpecToRequirementEntryNode other = (SpecToRequirementEntryNode) o; return _specification.equals(other._specification) && _requirement.equals(other._requirement); } @Override public int hashCode() { return _specification.hashCode() ^ _requirement.hashCode(); } @Override public Object getChildAt(int index) { switch (index) { case 0: return new ValueRequirementNode(this, _requirement); case 1: return new ValueSpecificationNode(this, _specification); default: return getSpanningValuePropertyEntry(index - 2); } } @Override public int getChildCount() { return _orderedUnionProperties.size() + 2; // add the requirement and spec } @Override public int getIndexOfChild(Object child) { if (child instanceof SpanningValuePropertyEntryNode) { SpanningValuePropertyEntryNode node = (SpanningValuePropertyEntryNode) child; return _orderedUnionProperties.indexOf(node.getCommonConstraintName()) + 2; } else if (child instanceof ValueRequirementNode) { if (child.equals(new ValueRequirementNode(this, _requirement))) { return 0; } } else if (child instanceof ValueSpecificationNode) { if (child.equals(new ValueSpecificationNode(this, _specification))) { return 1; } } return -1; } @Override public Object getColumn(int column) { switch (column) { case 0: return NAME; case 1: return getValueName(); case 2: return getFunctionUniqueId(); } return null; } }