private ImmutableList<ComponentCustomizerEngine> buildCustomizerEngines(Factory factory) { Set<ComponentCustomizerEngine> componentCustomizerEngines = new LinkedHashSet<>(); for (FactoryMachine machine : factory.machines) { Set<Name<ComponentCustomizerEngine>> names = factory.nameBuildableComponents(machine, ComponentCustomizerEngine.class); for (Name<ComponentCustomizerEngine> name : names) { Optional<NamedComponent<ComponentCustomizerEngine>> customizer = factory.buildAndStore(Query.byName(name), machine.getEngine(name)); componentCustomizerEngines.add(customizer.get().getComponent()); } } return ImmutableList.copyOf(componentCustomizerEngines); }
MachineEngine<FactoryMachine> engine = machine.getEngine(name); try { machines.add(factory.buildAndStore(Query.byName(name), engine).get().getComponent()); } catch (UnsatisfiedDependenciesException e) { moreToBuild.put(name, engine); notSatisfied = notSatisfied.concat(e.getUnsatisfiedDependencies().prepend( SatisfiedQuery.of(Query.byName(name), name))); machines.add(factory.buildAndStore(Query.byName(entry.getKey()), entry.getValue()).get().getComponent()); toBuild.remove(entry.getKey()); } catch (UnsatisfiedDependenciesException e) { notSatisfied = notSatisfied.concat(e.getUnsatisfiedDependencies().prepend( SatisfiedQuery.of(Query.byName(entry.getKey()), entry.getKey())));
private <T> MachineEngine<T> getMachineEngineFor(Name<T> name) { Optional<MachineEngine<T>> engineFor = findMachineEngineFor(name); if (!engineFor.isPresent()) { throw UnsatisfiedDependency.on(Query.byName(name)).causedBy(machineNotFoundMessage(name)).raise(); } return engineFor.get(); }
@Override public AutoCloseable recordIn(Map<String, Given> givens) { final Tape tape = new Tape(givens); final Factory.Query<Mapper> mapperQuery = Factory.Query.byName(Name.of(Mapper.class, "Mapper")); Factory.LocalMachines.threadLocal().addMachine( new SingleNameFactoryMachine<>(0, new StdMachineEngine<ComponentCustomizerEngine>( Name.of(ComponentCustomizerEngine.class, "JongoCollectionSequenceSupplier"), BoundlessComponentBox.FACTORY) { @Override protected ComponentCustomizerEngine doNewComponent(SatisfiedBOM satisfiedBOM) { final Mapper mapper = satisfiedBOM.getOne(mapperQuery).get().getComponent(); final ObjectIdUpdater objectIdUpdater = mapper.getObjectIdUpdater(); return new SingleComponentClassCustomizerEngine<JongoCollection>(0, JongoCollection.class) { @Override public NamedComponent<JongoCollection> customize(NamedComponent<JongoCollection> namedComponent) { final JongoCollection collection = namedComponent.getComponent(); return new NamedComponent<>(namedComponent.getName(), new SequencingJongoCollection(tape, collection, mapper, objectIdUpdater)); } }; } @Override public BillOfMaterials getBillOfMaterial() { return BillOfMaterials.of(mapperQuery); } })); return tape; }
@Override public AutoCloseable recordIn(Map<String, Given> givens) { final Tape tape = new Tape(givens); final Factory.Query<Mapper> mapperQuery = Factory.Query.byName(Name.of(Mapper.class, "Mapper")); Factory.LocalMachines.threadLocal().addMachine( new SingleNameFactoryMachine<>(0, new StdMachineEngine<ComponentCustomizerEngine>( Name.of(ComponentCustomizerEngine.class, "JongoCollectionSequenceSupplier"), BoundlessComponentBox.FACTORY) { @Override protected ComponentCustomizerEngine doNewComponent(SatisfiedBOM satisfiedBOM) { final Mapper mapper = satisfiedBOM.getOne(mapperQuery).get().getComponent(); final ObjectIdUpdater objectIdUpdater = mapper.getObjectIdUpdater(); return new SingleComponentClassCustomizerEngine<JongoCollection>(0, JongoCollection.class) { @Override public NamedComponent<JongoCollection> customize(NamedComponent<JongoCollection> namedComponent) { final JongoCollection collection = namedComponent.getComponent(); return new NamedComponent<>(namedComponent.getName(), new SequencingJongoCollection(tape, collection, mapper, objectIdUpdater)); } }; } @Override public BillOfMaterials getBillOfMaterial() { return BillOfMaterials.of(mapperQuery); } })); return tape; }
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); } }); } }
public ConfigLoaderFactoryMachine() { super(0, new StdMachineEngine<ConfigLoader>(NAME, 0, BoundlessComponentBox.FACTORY) { private final Factory.Query<String> env = Factory.Query.byName(Name.of(String.class, "env")).optional(); @Override public BillOfMaterials getBillOfMaterial() { return new BillOfMaterials(ImmutableSet.<Factory.Query<?>>of( env )); } @Override protected ConfigLoader doNewComponent(SatisfiedBOM satisfiedBOM) { return new ConfigLoader( satisfiedBOM.getOneAsComponent(env) ); } }); } }
private <T> void checkSatisfy(Name<T> name) { BillOfMaterials billOfMaterial = getBillOfMaterialsFor(name); UnsatisfiedDependencies notSatisfied = UnsatisfiedDependencies.of(); for (Query<?> query : billOfMaterial.getQueries()) { try { query.bind(this).checkSatisfy(); } catch (UnsatisfiedDependenciesException e) { notSatisfied = notSatisfied.concat(e.getUnsatisfiedDependencies().prepend(SatisfiedQuery.of(Query.byName(name), name))); } } if (!notSatisfied.isEmpty()) { throw notSatisfied.raise(); } }