samples/openfixed/src/org/apidesign/openfixed/AsyncEventSupport.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
jtulach@374
     1
package org.apidesign.openfixed;
jtulach@374
     2
jtulach@374
     3
import java.util.List;
jtulach@374
     4
import java.util.concurrent.CopyOnWriteArrayList;
jtulach@374
     5
import java.util.concurrent.Executor;
jtulach@374
     6
import java.util.concurrent.Executors;
jtulach@395
     7
import org.apidesign.openfixed.Calculator.EventSupport;
jtulach@374
     8
jtulach@374
     9
/**
jtulach@374
    10
 *
jtulach@374
    11
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jtulach@374
    12
 */
jtulach@374
    13
final class AsyncEventSupport implements EventSupport {
jtulach@374
    14
    private final List<ModificationListener> listeners = new CopyOnWriteArrayList<ModificationListener>();
jtulach@374
    15
    
jtulach@374
    16
    AsyncEventSupport() {
jtulach@374
    17
    }
jtulach@374
    18
    @Override
jtulach@374
    19
    public void add(ModificationListener l) {
jtulach@374
    20
        listeners.add(l);
jtulach@374
    21
    }
jtulach@374
    22
jtulach@374
    23
    @Override
jtulach@374
    24
    public void remove(ModificationListener l) {
jtulach@374
    25
        listeners.remove(l);
jtulach@374
    26
    }
jtulach@375
    27
jtulach@375
    28
    // BEGIN: openfixed.asynch
jtulach@375
    29
    private static final Executor EXEC = Executors.newSingleThreadExecutor();
jtulach@375
    30
    @Override
jtulach@375
    31
    public void fireModificationEvent(ModificationEvent ev) {
jtulach@375
    32
        EXEC.execute(new Deliverable(
jtulach@375
    33
            ev, listeners.toArray(new ModificationListener[0])
jtulach@375
    34
        ));
jtulach@375
    35
    }
jtulach@374
    36
    
jtulach@374
    37
    private static class Deliverable implements Runnable {
jtulach@374
    38
        final ModificationEvent ev;
jtulach@374
    39
        final ModificationListener[] listeners;
jtulach@374
    40
jtulach@375
    41
        public Deliverable(
jtulach@375
    42
            ModificationEvent ev, ModificationListener[] listeners
jtulach@375
    43
        ) {
jtulach@374
    44
            this.ev = ev;
jtulach@374
    45
            this.listeners = listeners;
jtulach@374
    46
        }
jtulach@374
    47
jtulach@374
    48
        @Override
jtulach@374
    49
        public void run() {
jtulach@374
    50
            for (ModificationListener l : listeners) {
jtulach@374
    51
                l.modification(ev);
jtulach@374
    52
            }
jtulach@374
    53
        }
jtulach@374
    54
    }
jtulach@375
    55
    // END: openfixed.asynch
jtulach@374
    56
}