samples/openfixed/src/org/apidesign/openfixed/PendingEventSupport.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sun, 20 Mar 2011 18:52:47 +0100
changeset 374 35da2d439e3d
child 375 3abae898011d
permissions -rw-r--r--
Calculator and various ways to deliver changes in its counter to listeners
     1 package org.apidesign.openfixed;
     2 
     3 import java.util.List;
     4 import java.util.concurrent.CopyOnWriteArrayList;
     5 import java.util.concurrent.Executor;
     6 import java.util.concurrent.Executors;
     7 
     8 /**
     9  *
    10  * @author Jaroslav Tulach <jtulach@netbeans.org>
    11  */
    12 final class PendingEventSupport implements EventSupport, Runnable {
    13     private final List<ModificationListener> listeners = new CopyOnWriteArrayList<ModificationListener>();
    14     private final List<Deliverable> deliverables = new CopyOnWriteArrayList<Deliverable>();
    15     private static final Executor EXEC = Executors.newSingleThreadExecutor();
    16     
    17     PendingEventSupport() {
    18     }
    19 
    20     @Override
    21     public void fireModificationEvent(ModificationEvent ev) {
    22         synchronized (deliverables) {
    23             final Deliverable d = new Deliverable(ev, listeners.toArray(new ModificationListener[0]));
    24             deliverables.add(d);
    25             EXEC.execute(this);
    26         }
    27     }
    28 
    29     @Override
    30     public void add(ModificationListener l) {
    31         listeners.add(l);
    32     }
    33 
    34     @Override
    35     public void remove(ModificationListener l) {
    36         listeners.remove(l);
    37     }
    38 
    39     @Override
    40     public void run() {
    41         Deliverable[] pending;
    42         synchronized (deliverables) {
    43             if (deliverables.isEmpty()) {
    44                 return;
    45             }
    46             pending = deliverables.toArray(new Deliverable[0]);
    47             deliverables.clear();
    48         }
    49         int pendingCount = pending.length;
    50         for (Deliverable d : pending) {
    51             d.ev.pending = --pendingCount;
    52             for (ModificationListener l : d.listeners) {
    53                 l.modification(d.ev);
    54             }
    55         }
    56     }
    57     
    58     private static class Deliverable {
    59         final ModificationEvent ev;
    60         final ModificationListener[] listeners;
    61 
    62         public Deliverable(ModificationEvent ev, ModificationListener[] listeners) {
    63             this.ev = ev;
    64             this.listeners = listeners;
    65         }
    66     }
    67 }