package br.com.caelum.iogi.collections;
import java.util.ArrayList;
import java.util.List;
import br.com.caelum.iogi.Instantiator;
import br.com.caelum.iogi.parameters.Parameters;
import br.com.caelum.iogi.reflection.Target;
import br.com.caelum.iogi.util.Assert;
import com.google.common.collect.Lists;
public class IndexedListInstantiator implements Instantiator<List<Object>> {
private final Instantiator<Object> listElementInstantiator;
public IndexedListInstantiator(final Instantiator<Object> listElementInstantiator) {
this.listElementInstantiator = listElementInstantiator;
}
public boolean isAbleToInstantiate(final Target<?> target) {
return List.class.isAssignableFrom(target.getClassType());
}
public List<Object> instantiate(final Target<?> target, final Parameters parameters) {
final ParametersByIndex parametersByIndex = new ParametersByIndex(parameters, target);
final Target<?> elementTarget = elementTarget(target);
final ArrayList<Object> newList = Lists.newArrayListWithExpectedSize(parametersByIndex.count());
for (final Integer index : parametersByIndex.indexes()) {
final Parameters atIndex = parametersByIndex.at(index);
final Object newElement = listElementInstantiator.instantiate(elementTarget , atIndex);
newList.add(newElement);
}
return newList;
}
private Target<?> elementTarget(final Target<?> target) {
Assert.isNotARawType(target);
return (Target<?>) target.typeArgument(0);
}
}