samples/openfixed/src/org/apidesign/openfixed/AsyncEventSupport.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sun, 20 Mar 2011 20:52:33 +0100
changeset 375 3abae898011d
parent 374 35da2d439e3d
child 395 837ae5b09036
permissions -rw-r--r--
More code snippets for openfixed project
     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 AsyncEventSupport implements EventSupport {
    13     private final List<ModificationListener> listeners = new CopyOnWriteArrayList<ModificationListener>();
    14     
    15     AsyncEventSupport() {
    16     }
    17     @Override
    18     public void add(ModificationListener l) {
    19         listeners.add(l);
    20     }
    21 
    22     @Override
    23     public void remove(ModificationListener l) {
    24         listeners.remove(l);
    25     }
    26 
    27     // BEGIN: openfixed.asynch
    28     private static final Executor EXEC = Executors.newSingleThreadExecutor();
    29     @Override
    30     public void fireModificationEvent(ModificationEvent ev) {
    31         EXEC.execute(new Deliverable(
    32             ev, listeners.toArray(new ModificationListener[0])
    33         ));
    34     }
    35     
    36     private static class Deliverable implements Runnable {
    37         final ModificationEvent ev;
    38         final ModificationListener[] listeners;
    39 
    40         public Deliverable(
    41             ModificationEvent ev, ModificationListener[] listeners
    42         ) {
    43             this.ev = ev;
    44             this.listeners = listeners;
    45         }
    46 
    47         @Override
    48         public void run() {
    49             for (ModificationListener l : listeners) {
    50                 l.modification(ev);
    51             }
    52         }
    53     }
    54     // END: openfixed.asynch
    55 }