samples/openfixed/src/org/apidesign/openfixed/PostEventSupport.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.HashSet;
jtulach@374
     4
import java.util.List;
jtulach@374
     5
import java.util.Set;
jtulach@374
     6
import java.util.concurrent.CopyOnWriteArrayList;
jtulach@374
     7
import java.util.concurrent.Executor;
jtulach@374
     8
import java.util.concurrent.Executors;
jtulach@395
     9
import org.apidesign.openfixed.Calculator.EventSupport;
jtulach@374
    10
jtulach@374
    11
/**
jtulach@374
    12
 *
jtulach@374
    13
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jtulach@374
    14
 */
jtulach@374
    15
final class PostEventSupport implements EventSupport, Runnable {
jtulach@374
    16
    private final List<ModificationListener> listeners = new CopyOnWriteArrayList<ModificationListener>();
jtulach@374
    17
    private final List<Deliverable> deliverables = new CopyOnWriteArrayList<Deliverable>();
jtulach@374
    18
    private static final Executor EXEC = Executors.newSingleThreadExecutor();
jtulach@374
    19
    
jtulach@374
    20
    PostEventSupport() {
jtulach@374
    21
    }
jtulach@374
    22
jtulach@374
    23
    @Override
jtulach@374
    24
    public void fireModificationEvent(ModificationEvent ev) {
jtulach@374
    25
        synchronized (deliverables) {
jtulach@374
    26
            final Deliverable d = new Deliverable(ev, listeners.toArray(new ModificationListener[0]));
jtulach@374
    27
            deliverables.add(d);
jtulach@374
    28
            EXEC.execute(this);
jtulach@374
    29
        }
jtulach@374
    30
    }
jtulach@374
    31
jtulach@374
    32
    @Override
jtulach@374
    33
    public void add(ModificationListener l) {
jtulach@374
    34
        listeners.add(l);
jtulach@374
    35
    }
jtulach@374
    36
jtulach@374
    37
    @Override
jtulach@374
    38
    public void remove(ModificationListener l) {
jtulach@374
    39
        listeners.remove(l);
jtulach@374
    40
    }
jtulach@374
    41
jtulach@374
    42
    @Override
jtulach@374
    43
    public void run() {
jtulach@374
    44
        Deliverable[] pending;
jtulach@374
    45
        synchronized (deliverables) {
jtulach@374
    46
            if (deliverables.isEmpty()) {
jtulach@374
    47
                return;
jtulach@374
    48
            }
jtulach@374
    49
            pending = deliverables.toArray(new Deliverable[0]);
jtulach@374
    50
            deliverables.clear();
jtulach@374
    51
        }
jtulach@375
    52
        // BEGIN: openfixed.postimpl
jtulach@374
    53
        Calculator calc = null;
jtulach@375
    54
        Set<PostModificationListener> notify;
jtulach@375
    55
        notify = new HashSet<PostModificationListener>();
jtulach@374
    56
        int pendingCount = pending.length;
jtulach@374
    57
        for (Deliverable d : pending) {
jtulach@374
    58
            calc = (Calculator)d.ev.getSource();
jtulach@374
    59
            d.ev.pending = --pendingCount;
jtulach@374
    60
            d.ev.posts = notify;
jtulach@374
    61
            for (ModificationListener l : d.listeners) {
jtulach@374
    62
                l.modification(d.ev);
jtulach@374
    63
            }
jtulach@374
    64
            d.ev.posts = null;
jtulach@374
    65
        }
jtulach@374
    66
        for (PostModificationListener pml : notify) {
jtulach@374
    67
            pml.postProcess(new PostModificationEvent(calc));
jtulach@374
    68
        }
jtulach@375
    69
        // END: openfixed.postimpl
jtulach@374
    70
    }
jtulach@374
    71
    
jtulach@374
    72
    private static class Deliverable {
jtulach@374
    73
        final ModificationEvent ev;
jtulach@374
    74
        final ModificationListener[] listeners;
jtulach@374
    75
jtulach@374
    76
        public Deliverable(ModificationEvent ev, ModificationListener[] listeners) {
jtulach@374
    77
            this.ev = ev;
jtulach@374
    78
            this.listeners = listeners;
jtulach@374
    79
        }
jtulach@374
    80
    }
jtulach@374
    81
}