/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.calcnode; import org.apache.commons.lang.ObjectUtils; import com.opengamma.util.ArgumentChecker; /** * Capability exported by a {@link JobInvoker} about the node(s) it is invoking jobs on, or a requirement * of a job. */ public final class Capability implements Comparable<Capability> { private final String _identifier; private final Double _parameterLow; private final Double _parameterHigh; private Capability(final String identifier, final Double parameterLow, final Double parameterHigh) { ArgumentChecker.notNull(identifier, "identifier"); _identifier = identifier; _parameterLow = parameterLow; _parameterHigh = parameterHigh; } public static Capability instanceOf(final String identifier) { return new Capability(identifier, null, null); } public static Capability parameterInstanceOf(final String identifier, final double parameter) { return new Capability(identifier, parameter, parameter); } public static Capability lowerBoundInstanceOf(final String identifier, final double lowerBoundParameter) { return new Capability(identifier, lowerBoundParameter, null); } public static Capability upperBoundInstanceOf(final String identifier, final double upperBoundParameter) { return new Capability(identifier, null, upperBoundParameter); } public static Capability boundedInstanceOf(final String identifier, final double lowerBoundParameter, final double upperBoundParameter) { ArgumentChecker.isTrue(lowerBoundParameter <= upperBoundParameter, "lower bound must be less than upper bound"); return new Capability(identifier, lowerBoundParameter, upperBoundParameter); } public String getIdentifier() { return _identifier; } public Double getLowerBoundParameter() { return _parameterLow; } public Double getUpperBoundParameter() { return _parameterHigh; } @Override public int hashCode() { final int multiplier = 17; int hc = 1; hc += getIdentifier().hashCode(); hc *= multiplier; if (getLowerBoundParameter() != null) { hc += getLowerBoundParameter().hashCode(); } hc *= multiplier; if (getUpperBoundParameter() != null) { hc += getUpperBoundParameter().hashCode(); } return hc; } @Override public boolean equals(final Object o) { if (o == this) { return true; } if (!(o instanceof Capability)) { return false; } final Capability other = (Capability) o; return ObjectUtils.equals(getIdentifier(), other.getIdentifier()) && ObjectUtils.equals(getLowerBoundParameter(), other.getLowerBoundParameter()) && ObjectUtils.equals(getUpperBoundParameter(), other.getUpperBoundParameter()); } /** * Capabilities are ordered by identifier, then by lower bound (with unbounded before bounded), then by upper bound (with bounded before unbounded). * * @param o capability to compare to * @return result of the comparison */ @Override public int compareTo(Capability o) { int cmp = getIdentifier().compareTo(o.getIdentifier()); if (cmp != 0) { return cmp; } if (getLowerBoundParameter() == null) { if (o.getLowerBoundParameter() != null) { return -1; } } else { if (o.getLowerBoundParameter() == null) { return 1; } else { cmp = getLowerBoundParameter().compareTo(o.getLowerBoundParameter()); if (cmp != 0) { return cmp; } } } if (getUpperBoundParameter() != null) { if (o.getUpperBoundParameter() != null) { return getUpperBoundParameter().compareTo(o.getUpperBoundParameter()); } else { return -1; } } else { if (o.getUpperBoundParameter() != null) { return 1; } else { return 0; } } } }