1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/samples/openfixed/src/org/apidesign/openfixed/PendingEventSupport.java Sun Mar 20 18:52:47 2011 +0100
1.3 @@ -0,0 +1,67 @@
1.4 +package org.apidesign.openfixed;
1.5 +
1.6 +import java.util.List;
1.7 +import java.util.concurrent.CopyOnWriteArrayList;
1.8 +import java.util.concurrent.Executor;
1.9 +import java.util.concurrent.Executors;
1.10 +
1.11 +/**
1.12 + *
1.13 + * @author Jaroslav Tulach <jtulach@netbeans.org>
1.14 + */
1.15 +final class PendingEventSupport implements EventSupport, Runnable {
1.16 + private final List<ModificationListener> listeners = new CopyOnWriteArrayList<ModificationListener>();
1.17 + private final List<Deliverable> deliverables = new CopyOnWriteArrayList<Deliverable>();
1.18 + private static final Executor EXEC = Executors.newSingleThreadExecutor();
1.19 +
1.20 + PendingEventSupport() {
1.21 + }
1.22 +
1.23 + @Override
1.24 + public void fireModificationEvent(ModificationEvent ev) {
1.25 + synchronized (deliverables) {
1.26 + final Deliverable d = new Deliverable(ev, listeners.toArray(new ModificationListener[0]));
1.27 + deliverables.add(d);
1.28 + EXEC.execute(this);
1.29 + }
1.30 + }
1.31 +
1.32 + @Override
1.33 + public void add(ModificationListener l) {
1.34 + listeners.add(l);
1.35 + }
1.36 +
1.37 + @Override
1.38 + public void remove(ModificationListener l) {
1.39 + listeners.remove(l);
1.40 + }
1.41 +
1.42 + @Override
1.43 + public void run() {
1.44 + Deliverable[] pending;
1.45 + synchronized (deliverables) {
1.46 + if (deliverables.isEmpty()) {
1.47 + return;
1.48 + }
1.49 + pending = deliverables.toArray(new Deliverable[0]);
1.50 + deliverables.clear();
1.51 + }
1.52 + int pendingCount = pending.length;
1.53 + for (Deliverable d : pending) {
1.54 + d.ev.pending = --pendingCount;
1.55 + for (ModificationListener l : d.listeners) {
1.56 + l.modification(d.ev);
1.57 + }
1.58 + }
1.59 + }
1.60 +
1.61 + private static class Deliverable {
1.62 + final ModificationEvent ev;
1.63 + final ModificationListener[] listeners;
1.64 +
1.65 + public Deliverable(ModificationEvent ev, ModificationListener[] listeners) {
1.66 + this.ev = ev;
1.67 + this.listeners = listeners;
1.68 + }
1.69 + }
1.70 +}