package se.l4.vibe.internal.builder; import java.util.concurrent.TimeUnit; import se.l4.vibe.builder.SamplerBuilder; import se.l4.vibe.builder.TriggerBuilder; import se.l4.vibe.event.EventSeverity; import se.l4.vibe.event.Events; import se.l4.vibe.trigger.Condition; import se.l4.vibe.trigger.TimedTrigger; import se.l4.vibe.trigger.Trigger; import se.l4.vibe.trigger.TriggerEvent; import se.l4.vibe.trigger.TriggerListener; /** * Actual builder for triggers, stores data in {@link TriggerHolder}. * * @author Andreas Holstenson * * @param <T> * @param <Input> * @param <Output> */ public class SamplerTriggerBuilder<T, Input, Output> implements TriggerBuilder<SamplerBuilder<T>> { private final SamplerBuilderImpl<T> builder; private final Trigger<Input, Output> trigger; private final Condition<Output> condition; private final Events<TriggerEvent> events; private long maxTime; private boolean whenNoLongerMet; public SamplerTriggerBuilder( SamplerBuilderImpl<T> builder, Trigger<Input, Output> trigger, Condition<Output> condition, Events<TriggerEvent> events) { this.builder = builder; this.trigger = trigger; this.condition = condition; this.events = events; maxTime = trigger instanceof TimedTrigger ? ((TimedTrigger) trigger).getDefaultRepeatTime() : 0; } @Override public TriggerBuilder<SamplerBuilder<T>> andWhenNoLongerMet() { whenNoLongerMet = true; return this; } @Override public TriggerBuilder<SamplerBuilder<T>> onlyOnce() { maxTime = Long.MAX_VALUE; return this; } @Override public TriggerBuilder<SamplerBuilder<T>> atMostEvery(long duration, TimeUnit unit) { maxTime = unit.toMillis(duration); return this; } @Override public SamplerBuilder<T> sendEvent(EventSeverity severity) { return handleWith(new EventTriggerListener(events, severity)); } @Override public SamplerBuilder<T> handleWith(TriggerListener listener) { builder.triggers.add(new TriggerHolder<Input, Output>( trigger, condition, maxTime, whenNoLongerMet, listener )); return builder; } private static class EventTriggerListener implements TriggerListener { private final Events<TriggerEvent> events; private final EventSeverity severity; public EventTriggerListener(Events<TriggerEvent> events, EventSeverity severity) { this.events = events; this.severity = severity; } @Override public void onEvent(TriggerEvent event) { events.register(severity, event); } } }