jtulach@374: package org.apidesign.openfixed; jtulach@374: jtulach@374: import java.util.List; jtulach@374: import java.util.concurrent.CopyOnWriteArrayList; jtulach@374: import java.util.concurrent.Executor; jtulach@374: import java.util.concurrent.Executors; jtulach@395: import org.apidesign.openfixed.Calculator.EventSupport; jtulach@374: jtulach@374: /** jtulach@374: * jtulach@374: * @author Jaroslav Tulach jtulach@374: */ jtulach@374: final class AsyncEventSupport implements EventSupport { jtulach@374: private final List listeners = new CopyOnWriteArrayList(); jtulach@374: jtulach@374: AsyncEventSupport() { jtulach@374: } jtulach@374: @Override jtulach@374: public void add(ModificationListener l) { jtulach@374: listeners.add(l); jtulach@374: } jtulach@374: jtulach@374: @Override jtulach@374: public void remove(ModificationListener l) { jtulach@374: listeners.remove(l); jtulach@374: } jtulach@375: jtulach@375: // BEGIN: openfixed.asynch jtulach@375: private static final Executor EXEC = Executors.newSingleThreadExecutor(); jtulach@375: @Override jtulach@375: public void fireModificationEvent(ModificationEvent ev) { jtulach@375: EXEC.execute(new Deliverable( jtulach@375: ev, listeners.toArray(new ModificationListener[0]) jtulach@375: )); jtulach@375: } jtulach@374: jtulach@374: private static class Deliverable implements Runnable { jtulach@374: final ModificationEvent ev; jtulach@374: final ModificationListener[] listeners; jtulach@374: jtulach@375: public Deliverable( jtulach@375: ModificationEvent ev, ModificationListener[] listeners jtulach@375: ) { jtulach@374: this.ev = ev; jtulach@374: this.listeners = listeners; jtulach@374: } jtulach@374: jtulach@374: @Override jtulach@374: public void run() { jtulach@374: for (ModificationListener l : listeners) { jtulach@374: l.modification(ev); jtulach@374: } jtulach@374: } jtulach@374: } jtulach@375: // END: openfixed.asynch jtulach@374: }