/**
* 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.AbstractList;
import java.util.Iterator;
import com.opengamma.engine.ComputationTargetResolver;
import com.opengamma.engine.ComputationTargetSpecification;
/**
* Implements a lazily constructed list of objects held by the computation target specifications.
*/
/* package */abstract class TargetResolverList<T> extends AbstractList<T> {
private final ComputationTargetResolver.AtVersionCorrection _resolver;
private final ComputationTargetSpecification[] _specifications;
private final Object[] _resolved;
public TargetResolverList(final ComputationTargetResolver.AtVersionCorrection resolver, final ComputationTargetSpecification[] specifications) {
_resolver = resolver;
_specifications = specifications;
_resolved = new Object[specifications.length];
}
protected ComputationTargetResolver.AtVersionCorrection getTargetResolver() {
return _resolver;
}
protected abstract T createObject(ComputationTargetSpecification specification);
@Override
public int size() {
return _specifications.length;
}
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
private int _index;
@Override
public boolean hasNext() {
return _index < _specifications.length;
}
@Override
public T next() {
return get(_index++);
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
@SuppressWarnings("unchecked")
@Override
public synchronized T get(final int index) {
if (_resolved[index] == null) {
_resolved[index] = createObject(_specifications[index]);
}
return (T) _resolved[index];
}
}