samples/openfixed/src/org/apidesign/openfixed/PendingEventSupport.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 30 Oct 2014 21:30:10 +0100
changeset 409 40cabcdcd2be
parent 375 3abae898011d
permissions -rw-r--r--
Updating to NBMs from NetBeans 8.0.1 as some of them are required to run on JDK8
     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 import org.apidesign.openfixed.Calculator.EventSupport;
     8 
     9 /**
    10  *
    11  * @author Jaroslav Tulach <jtulach@netbeans.org>
    12  */
    13 final class PendingEventSupport implements EventSupport, Runnable {
    14     private final List<ModificationListener> listeners = new CopyOnWriteArrayList<ModificationListener>();
    15     private final List<Deliverable> deliverables = new CopyOnWriteArrayList<Deliverable>();
    16     private static final Executor EXEC = Executors.newSingleThreadExecutor();
    17     
    18     PendingEventSupport() {
    19     }
    20 
    21     @Override
    22     public void fireModificationEvent(ModificationEvent ev) {
    23         synchronized (deliverables) {
    24             final Deliverable d = new Deliverable(ev, listeners.toArray(new ModificationListener[0]));
    25             deliverables.add(d);
    26             EXEC.execute(this);
    27         }
    28     }
    29 
    30     @Override
    31     public void add(ModificationListener l) {
    32         listeners.add(l);
    33     }
    34 
    35     @Override
    36     public void remove(ModificationListener l) {
    37         listeners.remove(l);
    38     }
    39 
    40     @Override
    41     public void run() {
    42         Deliverable[] pending;
    43         synchronized (deliverables) {
    44             if (deliverables.isEmpty()) {
    45                 return;
    46             }
    47             pending = deliverables.toArray(new Deliverable[0]);
    48             deliverables.clear();
    49         }
    50         // BEGIN: openfixed.pendingCount
    51         int pendingCount = pending.length;
    52         for (Deliverable d : pending) {
    53             d.ev.pending = --pendingCount;
    54             for (ModificationListener l : d.listeners) {
    55                 l.modification(d.ev);
    56             }
    57         }
    58         // END: openfixed.pendingCount
    59     }
    60     
    61     private static class Deliverable {
    62         final ModificationEvent ev;
    63         final ModificationListener[] listeners;
    64 
    65         public Deliverable(ModificationEvent ev, ModificationListener[] listeners) {
    66             this.ev = ev;
    67             this.listeners = listeners;
    68         }
    69     }
    70 }