package restx.factory; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; import java.util.Set; /** * User: xavierhanin * Date: 1/31/13 * Time: 7:23 PM */ public class DefaultFactoryMachine implements FactoryMachine { private final int priority; protected final ImmutableMap<Name<?>, MachineEngine<?>> engines; public DefaultFactoryMachine(int priority, MachineEngine<?>... engines) { this.priority = priority; ImmutableMap.Builder<Name<?>, MachineEngine<?>> builder = ImmutableMap.builder(); for (MachineEngine<?> engine : engines) { builder.put(engine.getName(), engine); } this.engines = builder.build(); } @Override public boolean canBuild(Name<?> name) { return engines.containsKey(name); } @Override @SuppressWarnings("unchecked") public <T> MachineEngine<T> getEngine(Name<T> name) { return (MachineEngine<T>) engines.get(name); } @Override @SuppressWarnings("unchecked") public <T> Set<Name<T>> nameBuildableComponents(Class<T> componentClass) { Set<Name<T>> names = Sets.newHashSet(); for (Name<?> name : engines.keySet()) { if (componentClass.isAssignableFrom(name.getClazz())) { names.add((Name<T>) name); } } return names; } @Override public int priority() { return priority; } @Override public String toString() { return "DefaultFactoryMachine{" + "priority=" + priority + ", engines=" + engines + '}'; } }