package com.tinkerpop.blueprints.util.wrappers.event; import com.tinkerpop.blueprints.util.wrappers.event.listener.Event; import java.util.ArrayDeque; import java.util.Deque; public class EventTrigger { /** * A queue of events that are triggered by change to the graph. The queue builds up until the EventTrigger fires them in the * order they were received. */ private final ThreadLocal<Deque<Event>> eventQueue = new ThreadLocal<Deque<Event>>() { protected Deque<Event> initialValue() { return new ArrayDeque<Event>(); } }; /** * When set to true, events in the event queue will only be fired when a transaction is committed. */ private final boolean enqueEvents; private final EventGraph graph; public EventTrigger(final EventGraph graph, final boolean enqueEvents) { this.enqueEvents = enqueEvents; this.graph = graph; } /** * Add an event to the event queue. * * If the enqueEvents is false, then the queue fires and resets after each event is added. */ public void addEvent(Event evt) { this.eventQueue.get().add(evt); if (!this.enqueEvents) { this.fireEventQueue(); this.resetEventQueue(); } } public void resetEventQueue() { eventQueue.set(new ArrayDeque<Event>()); } public void fireEventQueue() { Deque<Event> deque = eventQueue.get(); // This array for (Event event = deque.pollFirst(); event != null; event = deque.pollFirst()) { event.fireEvent(this.graph.getListenerIterator()); } } }