2727import java .util .Queue ;
2828import java .util .concurrent .Callable ;
2929import java .util .concurrent .Executor ;
30+ import java .util .concurrent .RejectedExecutionException ;
31+ import java .util .function .Consumer ;
3032import java .util .function .Function ;
3133
3234class CallbackRegistry <T > {
@@ -37,7 +39,7 @@ class CallbackRegistry<T> {
3739 /**
3840 * Adds the given callbacks to this registry.
3941 */
40- <U > void addCallbacks (Function <? super Callable <U >, ? extends Runnable > targetSetup ,
42+ <U > void addCallbacks (Consumer <? super Callable <U >> stageTransition ,
4143 Function <? super T , ? extends U > successCallback ,
4244 Function <Throwable , ? extends U > failureCallback ,
4345 Executor executor ) {
@@ -47,11 +49,10 @@ <U> void addCallbacks(Function<? super Callable<U>, ? extends Runnable> targetSe
4749 Objects .requireNonNull (executor , "'executor' must not be null" );
4850
4951 @ SuppressWarnings ("unchecked" )
50- Function <? super Callable <?>, ? extends Runnable > typedTargetSetup =
51- (Function <? super Callable <?>, ? extends Runnable >) targetSetup ;
52+ Consumer <? super Callable <?>> typedTransition = (Consumer <? super Callable <?>>)stageTransition ;
5253
5354 synchronized (mutex ) {
54- state = state .addCallbacks (typedTargetSetup , successCallback , failureCallback , executor );
55+ state = state .addCallbacks (typedTransition , successCallback , failureCallback , executor );
5556 }
5657 }
5758
@@ -101,7 +102,7 @@ boolean failure(Throwable failure) {
101102 * synchronized block and are NOT thread safe on their own.
102103 */
103104 private static abstract class State <S > {
104- protected abstract State <S > addCallbacks (Function <? super Callable <?>, ? extends Runnable > targetSetup ,
105+ protected abstract State <S > addCallbacks (Consumer <? super Callable <?>> stageTransition ,
105106 Function <? super S , ?> successCallback ,
106107 Function <Throwable , ?> failureCallback ,
107108 Executor executor );
@@ -133,13 +134,13 @@ private static class InitialState<S> extends State<S> {
133134 private static final InitialState <Object > instance = new InitialState <>();
134135
135136 @ Override
136- protected State <S > addCallbacks (Function <? super Callable <?>, ? extends Runnable > targetSetup ,
137+ protected State <S > addCallbacks (Consumer <? super Callable <?>> stageTransition ,
137138 Function <? super S , ?> successCallback ,
138139 Function <Throwable , ?> failureCallback ,
139140 Executor executor ) {
140141
141142 IntermediateState <S > intermediateState = new IntermediateState <>();
142- intermediateState .addCallbacks (targetSetup , successCallback , failureCallback , executor );
143+ intermediateState .addCallbacks (stageTransition , successCallback , failureCallback , executor );
143144 return intermediateState ;
144145 }
145146
@@ -171,12 +172,12 @@ private static class IntermediateState<S> extends State<S> {
171172 private final Queue <CallbackHolder <? super S >> callbacks = new LinkedList <>();
172173
173174 @ Override
174- protected State <S > addCallbacks (Function <? super Callable <?>, ? extends Runnable > targetSetup ,
175+ protected State <S > addCallbacks (Consumer <? super Callable <?>> stageTransition ,
175176 Function <? super S , ?> successCallback ,
176177 Function <Throwable , ?> failureCallback ,
177178 Executor executor ) {
178179
179- callbacks .add (new CallbackHolder <>(targetSetup , successCallback , failureCallback , executor ));
180+ callbacks .add (new CallbackHolder <>(stageTransition , successCallback , failureCallback , executor ));
180181 return this ;
181182 }
182183
@@ -225,12 +226,12 @@ private SuccessState(S result) {
225226 }
226227
227228 @ Override
228- protected State <S > addCallbacks (Function <? super Callable <?>, ? extends Runnable > targetSetup ,
229+ protected State <S > addCallbacks (Consumer <? super Callable <?>> stageTransition ,
229230 Function <? super S , ?> successCallback ,
230231 Function <Throwable , ?> failureCallback ,
231232 Executor executor ) {
232233
233- callCallback (targetSetup , successCallback , result , executor );
234+ callCallback (stageTransition , successCallback , result , executor );
234235 return this ;
235236 }
236237 }
@@ -246,49 +247,55 @@ private FailureState(Throwable failure) {
246247 }
247248
248249 @ Override
249- protected State <S > addCallbacks (Function <? super Callable <?>, ? extends Runnable > targetSetup ,
250+ protected State <S > addCallbacks (Consumer <? super Callable <?>> stageTransition ,
250251 Function <? super S , ?> successCallback ,
251252 Function <Throwable , ?> failureCallback ,
252253 Executor executor ) {
253254
254- callCallback (targetSetup , failureCallback , failure , executor );
255+ callCallback (stageTransition , failureCallback , failure , executor );
255256 return this ;
256257 }
257258 }
258259
259260 private static final class CallbackHolder <S > {
260- private final Function <? super Callable <?>, ? extends Runnable > targetSetup ;
261+ private final Consumer <? super Callable <?>> stageTransition ;
261262 private final Function <? super S , ?> successCallback ;
262263 private final Function <Throwable , ?> failureCallback ;
263264 private final Executor executor ;
264265
265- private CallbackHolder (Function <? super Callable <?>, ? extends Runnable > targetSetup ,
266+ private CallbackHolder (Consumer <? super Callable <?>> stageTransition ,
266267 Function <? super S , ?> successCallback ,
267268 Function <Throwable , ?> failureCallback ,
268269 Executor executor ) {
269270
270- this .targetSetup = targetSetup ;
271+ this .stageTransition = stageTransition ;
271272 this .successCallback = successCallback ;
272273 this .failureCallback = failureCallback ;
273274 this .executor = executor ;
274275 }
275276
276277 void callSuccessCallback (S result ) {
277- callCallback (targetSetup , successCallback , result , executor );
278+ callCallback (stageTransition , successCallback , result , executor );
278279 }
279280
280281 void callFailureCallback (Throwable failure ) {
281- callCallback (targetSetup , failureCallback , failure , executor );
282+ callCallback (stageTransition , failureCallback , failure , executor );
282283 }
283284 }
284285
285- private static <S , U > void callCallback (Function <? super Callable <U >, ? extends Runnable > targetSetup ,
286+ private static <S , U > void callCallback (Consumer <? super Callable <?>> stageTransition ,
286287 Function <? super S , ? extends U > callback ,
287288 S value ,
288289 Executor executor ) {
289290
290291 Callable <U > callable = () -> callback .apply (value );
291- executor .execute (targetSetup .apply (callable ));
292+ try {
293+ executor .execute ( () -> stageTransition .accept (callable ) );
294+ } catch (RejectedExecutionException ex ) {
295+ // Propagate error in-place
296+ Callable <U > propagateError = () -> { throw ex ; };
297+ stageTransition .accept (propagateError );
298+ }
292299 }
293300
294301}
0 commit comments