/**
* 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.List;
import com.opengamma.core.position.PortfolioNode;
import com.opengamma.core.position.Position;
import com.opengamma.engine.ComputationTargetResolver;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.id.UniqueId;
/**
* A portfolio node implementation that defers to a target resolver for the component parts.
*/
public final class TargetResolverPortfolioNode extends TargetResolverObject implements PortfolioNode {
private static final long serialVersionUID = 1L;
private final UniqueId _uniqueId;
private final UniqueId _parentNodeId;
private final ComputationTargetSpecification[] _childNodeSpecs;
private transient volatile List<PortfolioNode> _childNodes;
private final ComputationTargetSpecification[] _positionSpecs;
private transient volatile List<Position> _positions;
private final String _name;
public TargetResolverPortfolioNode(final ComputationTargetResolver.AtVersionCorrection targetResolver, final PortfolioNode copyFrom) {
super(targetResolver);
_uniqueId = copyFrom.getUniqueId();
_parentNodeId = copyFrom.getParentNodeId();
final List<PortfolioNode> childNodes = copyFrom.getChildNodes();
_childNodeSpecs = new ComputationTargetSpecification[childNodes.size()];
int i = 0;
for (PortfolioNode childNode : childNodes) {
_childNodeSpecs[i++] = ComputationTargetSpecification.of(childNode);
}
final List<Position> positions = copyFrom.getPositions();
_positionSpecs = new ComputationTargetSpecification[positions.size()];
i = 0;
for (Position position : positions) {
_positionSpecs[i++] = ComputationTargetSpecification.of(position);
}
_name = copyFrom.getName();
}
@Override
public UniqueId getUniqueId() {
return _uniqueId;
}
@Override
public UniqueId getParentNodeId() {
return _parentNodeId;
}
@Override
public int size() {
return _childNodeSpecs.length + _positionSpecs.length;
}
@Override
public List<PortfolioNode> getChildNodes() {
if (_childNodes == null) {
synchronized (this) {
if (_childNodes == null) {
_childNodes = new TargetResolverList<PortfolioNode>(getTargetResolver(), _childNodeSpecs) {
@Override
protected PortfolioNode createObject(final ComputationTargetSpecification target) {
return new LazyTargetResolverPortfolioNode(getTargetResolver(), target);
}
};
}
}
}
return _childNodes;
}
@Override
public List<Position> getPositions() {
if (_positions == null) {
synchronized (this) {
if (_positions == null) {
_positions = new TargetResolverList<Position>(getTargetResolver(), _positionSpecs) {
@Override
protected Position createObject(final ComputationTargetSpecification target) {
return new LazyTargetResolverPosition(getTargetResolver(), target);
}
};
}
}
}
return _positions;
}
@Override
public String getName() {
return _name;
}
}