/** * 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.id.UniqueId; /** * A position or trade implementation that may not be fully resolved at construction but will appear fully resolved when used. */ /* package */abstract class LazyResolvedPositionOrTrade<T extends PositionOrTrade> extends LazyResolvedObject<T> implements PositionOrTrade { private volatile boolean _resolved; /** * Creates a new lazily resolved position. * * @param underlying the underlying, un-resolved position * @param context the lazy resolution context */ public LazyResolvedPositionOrTrade(final LazyResolveContext.AtVersionCorrection context, final T underlying) { super(context, underlying); } @Override public UniqueId getUniqueId() { return getUnderlying().getUniqueId(); } @Override public BigDecimal getQuantity() { return getUnderlying().getQuantity(); } @Override public SecurityLink getSecurityLink() { return getUnderlying().getSecurityLink(); } @Override public Security getSecurity() { final SecurityLink link = getSecurityLink(); if (_resolved) { return link.getTarget(); } else { Security target = getLazyResolveContext().resolveLink(link); if (target == null) { throw new OpenGammaRuntimeException("Couldn't resolve " + link); } _resolved = true; return target; } } }