/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.function; import com.opengamma.engine.ComputationTargetSpecification; import com.opengamma.engine.target.ComputationTargetReference; import com.opengamma.engine.target.ComputationTargetRequirement; import com.opengamma.engine.target.ComputationTargetType; import com.opengamma.engine.value.ValueProperties; import com.opengamma.engine.value.ValuePropertyNames; import com.opengamma.engine.value.ValueRequirement; import com.opengamma.engine.value.ValueRequirementNames; import com.opengamma.engine.value.ValueSpecification; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.id.ObjectId; import com.opengamma.id.UniqueId; /** * Special case of function implementation that is never executed by the graph executor but is used to source computation targets. It will not be considered directly during graph construction; the * singleton instance is associated with DependencyNode objects to act as a marker on the node. * <p> * This should never be present in a function repository as it should never be selected for execution. */ public final class TargetSourcingFunction extends IntrinsicFunction { /** * Property on the value specification indicating that the resolution is suitable for relative referencing (for example by object id or one of the associated external identifiers). */ public static final String REFERENCE_MODE_PROPERTY = "Ref"; /** * Value of the {@link #REFERENCE_MODE_PROPERTY} property when the resolution was based on a relative reference. */ public static final String REFERENCE_MODE_RELATIVE = "Rel"; /** * Singleton instance. */ public static final TargetSourcingFunction INSTANCE = new TargetSourcingFunction(); /** * Function unique ID. */ public static final String UNIQUE_ID = "TargetSourcingFunction"; private static final ValueProperties RELATIVE_REFERENCED = ValueProperties.with(ValuePropertyNames.FUNCTION, UNIQUE_ID).with(REFERENCE_MODE_PROPERTY, REFERENCE_MODE_RELATIVE).get(); private static final ValueProperties ABSOLUTE_REFERENCED = ValueProperties.with(ValuePropertyNames.FUNCTION, UNIQUE_ID).get(); private TargetSourcingFunction() { super(UNIQUE_ID); } public static ValueRequirement createRequirement(final ComputationTargetType type, final UniqueId uid) { return createRequirement(new ComputationTargetSpecification(type, uid), ABSOLUTE_REFERENCED); } public static ValueRequirement createRequirement(final ComputationTargetType type, final ObjectId oid) { return createRequirement(new ComputationTargetSpecification(type, oid.atLatestVersion()), RELATIVE_REFERENCED); } public static ValueRequirement createRequirement(final ComputationTargetType type, final ExternalId eid) { return createRequirement(new ComputationTargetRequirement(type, eid), RELATIVE_REFERENCED); } public static ValueRequirement createRequirement(final ComputationTargetType type, final ExternalIdBundle eids) { return createRequirement(new ComputationTargetRequirement(type, eids), RELATIVE_REFERENCED); } private static ValueRequirement createRequirement(final ComputationTargetReference target, final ValueProperties constraints) { return new ValueRequirement(ValueRequirementNames.TARGET, target, constraints); } public static ValueSpecification createSpecification(final ValueRequirement requirement, final ComputationTargetSpecification target) { assert ValueRequirementNames.TARGET.equals(requirement.getValueName()); return createSpecification(target, requirement.getConstraints()); } public static ValueSpecification createSpecification(final ComputationTargetSpecification target) { return createSpecification(target, ABSOLUTE_REFERENCED); } private static ValueSpecification createSpecification(final ComputationTargetSpecification target, final ValueProperties properties) { return new ValueSpecification(ValueRequirementNames.TARGET, target, properties); } }