16
16
package software .amazon .awssdk .core .internal .waiters ;
17
17
18
18
import java .util .List ;
19
- import java .util .Optional ;
20
19
import java .util .function .Supplier ;
21
20
import software .amazon .awssdk .annotations .SdkInternalApi ;
22
21
import software .amazon .awssdk .annotations .ThreadSafe ;
23
22
import software .amazon .awssdk .core .exception .SdkClientException ;
24
23
import software .amazon .awssdk .core .waiters .WaiterAcceptor ;
25
24
import software .amazon .awssdk .core .waiters .WaiterResponse ;
26
- import software .amazon .awssdk .core .waiters .WaiterState ;
27
25
import software .amazon .awssdk .utils .Either ;
28
26
import software .amazon .awssdk .utils .Validate ;
29
27
@@ -45,45 +43,42 @@ public WaiterExecutor(WaiterConfiguration configuration,
45
43
}
46
44
47
45
WaiterResponse <T > execute (Supplier <T > pollingFunction ) {
48
- return doExecute (pollingFunction , 0 , System .currentTimeMillis ());
49
- }
50
-
51
- WaiterResponse <T > doExecute (Supplier <T > pollingFunction , int attemptNumber , long startTime ) {
52
- attemptNumber ++;
53
- T response ;
54
- try {
55
- response = pollingFunction .get ();
56
- } catch (Exception exception ) {
57
- return evaluate (pollingFunction , Either .right (exception ), attemptNumber , startTime );
58
- }
59
-
60
- return evaluate (pollingFunction , Either .left (response ), attemptNumber , startTime );
61
- }
46
+ int attemptNumber = 0 ;
47
+ long startTime = System .currentTimeMillis ();
62
48
63
- private WaiterResponse <T > evaluate (Supplier <T > pollingFunction ,
64
- Either <T , Throwable > responseOrException ,
65
- int attemptNumber ,
66
- long startTime ) {
67
- Optional <WaiterAcceptor <? super T >> waiterAcceptor = executorHelper .firstWaiterAcceptorIfMatched (responseOrException );
49
+ while (true ) {
50
+ attemptNumber ++;
68
51
69
- if ( waiterAcceptor . isPresent ()) {
70
- WaiterState state = waiterAcceptor . get (). waiterState ( );
71
- switch (state ) {
52
+ Either < T , Throwable > polledResponse = pollResponse ( pollingFunction );
53
+ WaiterAcceptor <? super T > waiterAcceptor = firstWaiterAcceptor ( polledResponse );
54
+ switch (waiterAcceptor . waiterState () ) {
72
55
case SUCCESS :
73
- return executorHelper .createWaiterResponse (responseOrException , attemptNumber );
56
+ return executorHelper .createWaiterResponse (polledResponse , attemptNumber );
74
57
case RETRY :
75
- return maybeRetry (pollingFunction , attemptNumber , startTime );
58
+ waitToRetry (attemptNumber , startTime );
59
+ break ;
76
60
case FAILURE :
77
- throw executorHelper .waiterFailureException (waiterAcceptor . get () );
61
+ throw executorHelper .waiterFailureException (waiterAcceptor );
78
62
default :
79
63
throw new UnsupportedOperationException ();
80
64
}
81
65
}
66
+ }
67
+
68
+ private Either <T , Throwable > pollResponse (Supplier <T > pollingFunction ) {
69
+ try {
70
+ return Either .left (pollingFunction .get ());
71
+ } catch (Exception exception ) {
72
+ return Either .right (exception );
73
+ }
74
+ }
82
75
83
- throw executorHelper .noneMatchException (responseOrException );
76
+ private WaiterAcceptor <? super T > firstWaiterAcceptor (Either <T , Throwable > responseOrException ) {
77
+ return executorHelper .firstWaiterAcceptorIfMatched (responseOrException )
78
+ .orElseThrow (() -> executorHelper .noneMatchException (responseOrException ));
84
79
}
85
80
86
- private WaiterResponse < T > maybeRetry ( Supplier < T > pollingFunction , int attemptNumber , long startTime ) {
81
+ private void waitToRetry ( int attemptNumber , long startTime ) {
87
82
Either <Long , SdkClientException > nextDelayOrUnretryableException =
88
83
executorHelper .nextDelayOrUnretryableException (attemptNumber , startTime );
89
84
@@ -97,6 +92,5 @@ private WaiterResponse<T> maybeRetry(Supplier<T> pollingFunction, int attemptNum
97
92
Thread .currentThread ().interrupt ();
98
93
throw SdkClientException .create ("The thread got interrupted" , e );
99
94
}
100
- return doExecute (pollingFunction , attemptNumber , startTime );
101
95
}
102
96
}
0 commit comments