package se.l4.vibe.internal.builder; import se.l4.vibe.event.Events; import se.l4.vibe.probes.Probe; import se.l4.vibe.probes.Sampler; import se.l4.vibe.trigger.Condition; import se.l4.vibe.trigger.Trigger; import se.l4.vibe.trigger.TriggerEvent; import se.l4.vibe.trigger.TriggerListener; /** * Holds information about a trigger on a time series. * * @author Andreas Holstenson * * @param <Input> * @param <Output> */ public class TriggerHolder<Input, Output> { private final Trigger<Input, Output> trigger; private final Condition<Output> condition; private final long maxEvery; private final boolean sendOnNormal; private final TriggerListener listener; public TriggerHolder( Trigger<Input, Output> trigger, Condition<Output> condition, long maxEvery, boolean sendOnNormal, TriggerListener listener) { this.trigger = trigger; this.condition = condition; this.maxEvery = maxEvery; this.sendOnNormal = sendOnNormal; this.listener = listener; } public Runnable create(final Sampler<Input> series, final Events<TriggerEvent> events) { final Probe<Output> probe = trigger.forSampler(series); return new Runnable() { private long lastEvent; @Override public void run() { Output value = probe.read(); if(condition.matches(value)) { long now = System.currentTimeMillis(); if(lastEvent > 0 && maxEvery > 0) { // Check if we should send an event or not long diff = now - lastEvent; if(diff < maxEvery) { // Within the interval return; } } lastEvent = now; String desc = trigger.toString() + " " + condition.toString() + " (value is " + value + ")"; listener.onEvent(new TriggerEvent(desc, true)); } else if(sendOnNormal && lastEvent > 0) { String desc = "value is now " + value + ", no longer matching: " + trigger.toString() + " " + condition.toString(); listener.onEvent(new TriggerEvent(desc, false)); // Reset last event time lastEvent = 0; } } }; } }