/** * 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.util.Collection; import java.util.Map; import com.opengamma.core.position.Position; import com.opengamma.core.position.Trade; import com.opengamma.engine.ComputationTargetResolver; import com.opengamma.engine.ComputationTargetSpecification; /** * A position implementation that defers to a target resolver for the component parts. */ public class TargetResolverPosition extends TargetResolverPositionOrTrade implements Position { private final ComputationTargetSpecification[] _tradeSpecs; private transient volatile Collection<Trade> _trades; private final Map<String, String> _attributes; public TargetResolverPosition(final ComputationTargetResolver.AtVersionCorrection targetResolver, final Position copyFrom) { super(targetResolver, copyFrom); final Collection<Trade> trades = copyFrom.getTrades(); _tradeSpecs = new ComputationTargetSpecification[trades.size()]; int i = 0; for (Trade trade : trades) { _tradeSpecs[i++] = ComputationTargetSpecification.of(trade); } _attributes = copyFrom.getAttributes(); } @Override public Collection<Trade> getTrades() { if (_trades == null) { synchronized (this) { if (_trades == null) { _trades = new TargetResolverList<Trade>(getTargetResolver(), _tradeSpecs) { @Override protected Trade createObject(final ComputationTargetSpecification specification) { return new LazyTargetResolverTrade(getTargetResolver(), specification); } }; } } } return _trades; } @Override public Map<String, String> getAttributes() { return _attributes; } }