package restx.specs;
import com.google.common.collect.ImmutableList;
import restx.CoreModule;
import restx.RestxContext;
import restx.common.UUIDGenerator;
import restx.factory.*;
import java.util.*;
/**
* @author fcamblor
*/
@Component
public class GivenUUIDGeneratorRecorder implements RestxSpecRecorder.GivenRecorder {
@Override
public AutoCloseable recordIn(final Map<String, Given> givens) {
final Tape tape = new Tape(givens);
Factory.LocalMachines.threadLocal().addMachine(
new SingleNameFactoryMachine<>(0, new NoDepsMachineEngine<ComponentCustomizerEngine>(
Name.of(ComponentCustomizerEngine.class, "UUIDGeneratorSequenceSupplier"),
BoundlessComponentBox.FACTORY) {
@Override
protected ComponentCustomizerEngine doNewComponent(SatisfiedBOM satisfiedBOM) {
return new SingleComponentClassCustomizerEngine<UUIDGenerator>(0, UUIDGenerator.class) {
@Override
public NamedComponent<UUIDGenerator> customize(final NamedComponent<UUIDGenerator> namedComponent) {
return new NamedComponent<>(namedComponent.getName(), new UUIDGenerator() {
@Override
public String doGenerate() {
String uuid = namedComponent.getComponent().doGenerate();
tape.recordGeneratedId(uuid);
return uuid;
}
});
}
};
}
}));
return tape;
}
private static class Tape implements AutoCloseable {
private final Map<String, Given> givens;
private GivenUUIDGenerator givenUUIDGenerator;
private Tape(Map<String, Given> givens) {
this.givens = givens;
givenUUIDGenerator = new GivenUUIDGenerator(ImmutableList.<String>of());
}
@Override
public void close() throws Exception {
if (!givenUUIDGenerator.getPlaybackUUIDs().isEmpty()) {
givens.put("uuids", givenUUIDGenerator);
}
}
private void recordGeneratedId(String uuid) {
givenUUIDGenerator = givenUUIDGenerator.concat(uuid);
}
}
}