package restx.factory;
import com.google.common.collect.ImmutableMap;
public class AlternativesFactoryMachine<T> extends SingleNameFactoryMachine<FactoryMachine> {
public AlternativesFactoryMachine(int priority,
final Name<T> name,
final ImmutableMap<T, ? extends FactoryMachine> alternatives,
ComponentBox.BoxFactory boxFactory) {
super(priority, new StdMachineEngine<FactoryMachine>(
Name.of(FactoryMachine.class, name.getName() + "Alternatives"), priority, boxFactory) {
private Factory.Query<T> query = Factory.Query.byName(name);
@Override
protected FactoryMachine doNewComponent(SatisfiedBOM satisfiedBOM) {
FactoryMachine factoryMachine = alternatives.get(satisfiedBOM.getOne(query).get().getComponent());
if (factoryMachine != null) {
return factoryMachine;
} else {
return NoopFactoryMachine.INSTANCE;
}
}
@Override
public BillOfMaterials getBillOfMaterial() {
return BillOfMaterials.of(query);
}
});
}
}