@Override public void addListener(Runnable listener, Executor executor, ListenerOptimizationStrategy optimize) { listenerHelper.addListener(listener, executor == executingExecutor && (optimize == ListenerOptimizationStrategy.SingleThreadIfExecutorMatchOrDone | optimize == ListenerOptimizationStrategy.SingleThreadIfExecutorMatch) ? null : executor, optimize == ListenerOptimizationStrategy.SingleThreadIfExecutorMatchOrDone ? null : executor); }
@Override public void addListener(Runnable listener, Executor executor, ListenerOptimizationStrategy optimize) { listenerHelper.addListener(listener, executor == executingExecutor && (optimize == ListenerOptimizationStrategy.SingleThreadIfExecutorMatchOrDone | optimize == ListenerOptimizationStrategy.SingleThreadIfExecutorMatch) ? null : executor, optimize == ListenerOptimizationStrategy.SingleThreadIfExecutorMatchOrDone ? null : executor); }
@Override public void addListener(Runnable listener, Executor executor, ListenerOptimizationStrategy optimize) { listenerHelper.addListener(listener, executor == executingExecutor && (optimize == ListenerOptimizationStrategy.SingleThreadIfExecutorMatchOrDone | optimize == ListenerOptimizationStrategy.SingleThreadIfExecutorMatch) ? null : executor, optimize == ListenerOptimizationStrategy.SingleThreadIfExecutorMatchOrDone ? null : executor); }
/** * Adds a listener to be called. If the {@link RunnableListenerHelper} was constructed with * {@code true} (listeners can only be called once) then this listener will be called * immediately. This just defers to the other addListener call, providing null for the executor. * So when the listener runs, it will be on the same thread as the one invoking * {@link #callListeners()}. * * @param listener runnable to call when trigger event called */ public void addListener(Runnable listener) { addListener(listener, null, null); }
@Override public void addListener(Runnable listener, Executor executor, ListenerOptimizationStrategy optimize) { listenerHelper.addListener(listener, executor == executingExecutor && (optimize == ListenerOptimizationStrategy.SingleThreadIfExecutorMatchOrDone | optimize == ListenerOptimizationStrategy.SingleThreadIfExecutorMatch) ? null : executor, optimize == ListenerOptimizationStrategy.SingleThreadIfExecutorMatchOrDone ? null : executor); }
/** * Adds a listener to be called. If the {@link RunnableListenerHelper} was constructed with * {@code true} (listeners can only be called once) then this listener will be called * immediately. This just defers to the other addListener call, providing null for the executor. * So when the listener runs, it will be on the same thread as the one invoking * {@link #callListeners()}. * * @param listener runnable to call when trigger event called */ public void addListener(Runnable listener) { addListener(listener, null, null); }
@Override public void addListener(Runnable listener, Executor executor) { if (listener == null) { return; } if (executor == null) { executor = taskDistributor.getExecutorForKey(listener); } super.addListener(listener, executor); } }
@Override public void addListener(Runnable listener, Executor executor) { if (listener == null) { return; } if (executor == null) { executor = taskDistributor.getExecutorForKey(listener); } super.addListener(listener, executor); } }
@Override public void handleRunFinish() { repeatedHelper.addListener(addedTR, executor); } };
@Test public void addNullListenerTest() { onceHelper.addListener(null); repeatedHelper.addListener(null); // no exception thrown }
@Test public void getSubscribedListenersMixedExecutionTest() { TestRunnable tr1 = new TestRunnable(); TestRunnable tr2 = new TestRunnable(); onceHelper.addListener(tr1); onceHelper.addListener(tr2, SameThreadSubmitterExecutor.instance()); assertTrue(onceHelper.getSubscribedListeners().contains(tr1)); assertTrue(onceHelper.getSubscribedListeners().contains(tr2)); }
@Test (expected = RuntimeException.class) public void runListenerThrowExecptionTest() { onceHelper.callListeners(); TestRunnable tr = new TestRunnable() { @Override public void handleRunFinish() { throw new SuppressedStackRuntimeException(); } }; onceHelper.addListener(tr); fail("Execption should have thrown"); }
@Test public void getSubscribedListenersInThreadOnlyTest() { TestRunnable tr = new TestRunnable(); onceHelper.addListener(tr); assertTrue(onceHelper.getSubscribedListeners().contains(tr)); }
@Test public void getSubscribedListenersExecutorOnlyTest() { TestRunnable tr = new TestRunnable(); onceHelper.addListener(tr, SameThreadSubmitterExecutor.instance()); assertTrue(onceHelper.getSubscribedListeners().contains(tr)); }
@Test public void runListenerCatchExecptionTest() { TestRunnable tr = new TestRunnable() { @Override public void handleRunFinish() { throw new SuppressedStackRuntimeException(); } }; onceHelper.addListener(tr); onceHelper.callListeners(); assertTrue(tr.ranOnce()); }
@Test public void runListenerNoExecutorTest() { TestRunnable tr = new TestRunnable(); onceHelper.addListener(tr); onceHelper.callListeners(); assertTrue(tr.ranOnce()); assertTrue(Thread.currentThread() == tr.lastRanThread); }
@Test public void getSubscribedListenersTest() { assertTrue(onceHelper.getSubscribedListeners().isEmpty()); TestRunnable tr = new TestRunnable(); onceHelper.addListener(tr); assertTrue(onceHelper.getSubscribedListeners().contains(tr)); onceHelper.removeListener(tr); assertTrue(onceHelper.getSubscribedListeners().isEmpty()); }
@Test public void clearListenersTest() { TestRunnable onceTR = new TestRunnable(); TestRunnable repeatedTR = new TestRunnable(); onceHelper.addListener(onceTR); repeatedHelper.addListener(repeatedTR); onceHelper.clearListeners(); repeatedHelper.clearListeners(); onceHelper.callListeners(); repeatedHelper.callListeners(); assertFalse(onceTR.ranOnce()); assertFalse(repeatedTR.ranOnce()); }
@Test public void listenerExceptionAfterCallTest() { TestRuntimeFailureRunnable listener = new TestRuntimeFailureRunnable(); onceHelper.callListeners(); try { onceHelper.addListener(listener); fail("Exception should have thrown"); } catch (RuntimeException e) { // expected } assertTrue(listener.ranOnce()); }
@Test public void removeListenerAfterCallTest() { TestRunnable onceTR = new TestRunnable(); TestRunnable repeatedTR = new TestRunnable(); assertFalse(onceHelper.removeListener(onceTR)); assertFalse(repeatedHelper.removeListener(repeatedTR)); onceHelper.addListener(onceTR); repeatedHelper.addListener(repeatedTR); onceHelper.callListeners(); repeatedHelper.callListeners(); assertFalse(onceHelper.removeListener(onceTR)); assertTrue(repeatedHelper.removeListener(repeatedTR)); }