/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.target;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.id.UniqueIdentifiable;
/**
* Default implementation of the {@link ComputationTargetTypeProvider} populated from the public constants on {@ComputationTargetType}.
*/
public final class DefaultComputationTargetTypeProvider implements ComputationTargetTypeProvider {
private final Collection<ComputationTargetType> _simpleTypes;
private final Collection<ComputationTargetType> _additionalTypes;
private final Collection<ComputationTargetType> _allTypes;
public DefaultComputationTargetTypeProvider() {
final List<ComputationTargetType> simpleTypes = new ArrayList<ComputationTargetType>();
final List<ComputationTargetType> additionalTypes = new ArrayList<ComputationTargetType>();
final ComputationTargetTypeVisitor<Void, Boolean> isSimple = new ComputationTargetTypeVisitor<Void, Boolean>() {
@Override
public Boolean visitMultipleComputationTargetTypes(final Set<ComputationTargetType> types, final Void data) {
return Boolean.FALSE;
}
@Override
public Boolean visitNestedComputationTargetTypes(final List<ComputationTargetType> types, final Void data) {
return Boolean.FALSE;
}
@Override
public Boolean visitNullComputationTargetType(final Void data) {
return null;
}
@Override
public Boolean visitClassComputationTargetType(final Class<? extends UniqueIdentifiable> type, final Void data) {
if (UniqueIdentifiable.class.equals(type)) {
return null;
} else {
return Boolean.TRUE;
}
}
};
try {
final Class<?> c = ComputationTargetType.class;
for (Field field : c.getDeclaredFields()) {
if (Modifier.isPublic(field.getModifiers()) && Modifier.isStatic(field.getModifiers()) &&
field.isSynthetic() == false && c.isAssignableFrom(field.getType())) {
final ComputationTargetType type = (ComputationTargetType) field.get(null);
final Boolean simple = type.accept(isSimple, null);
if (simple != null) {
if (simple.booleanValue()) {
simpleTypes.add(type);
} else {
additionalTypes.add(type);
}
}
}
}
} catch (IllegalAccessException e) {
throw new OpenGammaRuntimeException("Can't initialise", e);
}
_simpleTypes = Collections.unmodifiableList(simpleTypes);
_additionalTypes = Collections.unmodifiableList(additionalTypes);
final List<ComputationTargetType> allTypes = new ArrayList<ComputationTargetType>(simpleTypes);
allTypes.addAll(additionalTypes);
_allTypes = Collections.unmodifiableList(allTypes);
}
@Override
public Collection<ComputationTargetType> getSimpleTypes() {
return _simpleTypes;
}
@Override
public Collection<ComputationTargetType> getAdditionalTypes() {
return _additionalTypes;
}
@Override
public Collection<ComputationTargetType> getAllTypes() {
return _allTypes;
}
}