/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.value;
import java.io.Serializable;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.builder.ToStringStyle;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.PublicAPI;
/**
* A value computed by the engine.
* <p>
* A computed value consists of the value itself and the specification that defines it.
* <p>
* This class is immutable and thread-safe if the value is immutable.
*/
@PublicAPI
public class ComputedValue implements Serializable {
//NOTE kirk 2009-12-30 -- This is VERY intentionally NOT generified. Having actually
//worked with the old version of ComputedValue with generics in the engine, the number
//of warning suppressions necessary just to get it working wasn't matched by any
//type of benefit in the additional type information at compile time.
//REVIEW kirk 2009-12-30 -- I've intentionally not made this an interface as we
//never actually made use of that functionality. We'll split it if and when we have
//a compelling reason to do so.
private static final long serialVersionUID = 1L;
/**
* The specification of the value.
*/
private final ValueSpecification _specification;
/**
* The value itself.
*/
private final Object _value;
/**
* Creates a computed value.
* <p>
* This combines the value and its specification.
*
* @param specification the specification of the value, not null
* @param value the actual value
*/
public ComputedValue(final ValueSpecification specification, final Object value) {
ArgumentChecker.notNull(specification, "value specification");
if (value instanceof ComputedValue) {
throw new IllegalArgumentException("Value must not be a ComputedValue instance");
}
_specification = specification;
_value = value;
}
//-------------------------------------------------------------------------
/**
* Gets the value specification.
*
* @return the specification, not null
*/
public ValueSpecification getSpecification() {
return _specification;
}
/**
* Gets the value.
*
* @return the value, not null
*/
public Object getValue() {
return _value;
}
//-------------------------------------------------------------------------
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof ComputedValue)) {
return false;
}
final ComputedValue other = (ComputedValue) obj;
return ObjectUtils.equals(_specification, other._specification)
&& ObjectUtils.equals(_value, other._value);
}
@Override
public int hashCode() {
int result = _specification.hashCode();
result = 31 * result + (_value != null ? _value.hashCode() : 0);
return result;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer();
final ToStringStyle style = ToStringStyle.SHORT_PREFIX_STYLE;
style.appendStart(sb, this);
appendFieldsToString(sb, style);
style.appendEnd(sb, this);
return sb.toString();
}
protected void appendFieldsToString(final StringBuffer sb, final ToStringStyle style) {
// carefully select useful fields for toString
final ValueSpecification spec = getSpecification();
if (spec != null) {
style.append(sb, "name", spec.getValueName(), null);
final ComputationTargetSpecification targetSpec = spec.getTargetSpecification();
style.append(sb, "targetId", targetSpec.getUniqueId(), null);
style.append(sb, "targetType", targetSpec.getType(), null);
style.append(sb, "properties", spec.getProperties(), null);
}
style.append(sb, "value", getValue(), null);
}
}