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