/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.target.lazy;
import java.math.BigDecimal;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.core.position.PositionOrTrade;
import com.opengamma.core.security.Security;
import com.opengamma.core.security.SecurityLink;
import com.opengamma.core.security.impl.SimpleSecurityLink;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.ComputationTargetResolver;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.id.UniqueId;
/**
* A position or trade implementation that defers to a target resolver for the component parts.
*/
/* package */abstract class TargetResolverPositionOrTrade extends TargetResolverObject implements PositionOrTrade {
private final UniqueId _uniqueId;
private final BigDecimal _quantity;
private final ComputationTargetSpecification _securitySpec;
private transient volatile ComputationTarget _security;
public TargetResolverPositionOrTrade(final ComputationTargetResolver.AtVersionCorrection targetResolver, final PositionOrTrade copyFrom) {
super(targetResolver);
_uniqueId = copyFrom.getUniqueId();
_quantity = copyFrom.getQuantity();
_securitySpec = ComputationTargetSpecification.of(copyFrom.getSecurity());
}
@Override
public UniqueId getUniqueId() {
return _uniqueId;
}
@Override
public BigDecimal getQuantity() {
return _quantity;
}
@Override
public SecurityLink getSecurityLink() {
return SimpleSecurityLink.of(getSecurity());
}
@Override
public Security getSecurity() {
if (_security == null) {
synchronized (this) {
if (_security == null) {
_security = getTargetResolver().resolve(_securitySpec);
if (_security == null) {
throw new OpenGammaRuntimeException("Couldn't resolve " + _securitySpec);
}
}
}
}
return _security.getSecurity();
}
}