diff -r 000000000000 -r 35da2d439e3d samples/openfixed/src/org/apidesign/openfixed/PendingEventSupport.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/openfixed/src/org/apidesign/openfixed/PendingEventSupport.java Sun Mar 20 18:52:47 2011 +0100 @@ -0,0 +1,67 @@ +package org.apidesign.openfixed; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +/** + * + * @author Jaroslav Tulach + */ +final class PendingEventSupport implements EventSupport, Runnable { + private final List listeners = new CopyOnWriteArrayList(); + private final List deliverables = new CopyOnWriteArrayList(); + private static final Executor EXEC = Executors.newSingleThreadExecutor(); + + PendingEventSupport() { + } + + @Override + public void fireModificationEvent(ModificationEvent ev) { + synchronized (deliverables) { + final Deliverable d = new Deliverable(ev, listeners.toArray(new ModificationListener[0])); + deliverables.add(d); + EXEC.execute(this); + } + } + + @Override + public void add(ModificationListener l) { + listeners.add(l); + } + + @Override + public void remove(ModificationListener l) { + listeners.remove(l); + } + + @Override + public void run() { + Deliverable[] pending; + synchronized (deliverables) { + if (deliverables.isEmpty()) { + return; + } + pending = deliverables.toArray(new Deliverable[0]); + deliverables.clear(); + } + int pendingCount = pending.length; + for (Deliverable d : pending) { + d.ev.pending = --pendingCount; + for (ModificationListener l : d.listeners) { + l.modification(d.ev); + } + } + } + + private static class Deliverable { + final ModificationEvent ev; + final ModificationListener[] listeners; + + public Deliverable(ModificationEvent ev, ModificationListener[] listeners) { + this.ev = ev; + this.listeners = listeners; + } + } +}