package org.magenta.core; import java.util.concurrent.Callable; import org.magenta.CycleDetectedInGenerationException; import org.magenta.DataKey; import org.magenta.DataSpecification; import org.magenta.Fixture; import org.magenta.core.injection.FixtureContext; public class LoopCycleDetector<S extends DataSpecification> implements FixtureContext<S> { private boolean active; private FixtureContext<S> context; private DataKey<?> key; public LoopCycleDetector(FixtureContext<S> context, DataKey<?> key) { this.context = context; this.key = key; } @Override public <D> D execute(Callable<D> callable, Fixture<? extends S> fixture) { try { if (active) { throw new CycleDetectedInGenerationException("Infinite loop detected for generation of key " + key); } active = true; return context.execute(callable, fixture); } finally { active = false; } } @Override public Fixture<S> get() { return context.get(); } @Override public void post(Object event) { context.post(event); } }