|
28 | 28 | import software.amazon.awssdk.core.SdkResponse;
|
29 | 29 | import software.amazon.awssdk.core.SplittingTransformerConfiguration;
|
30 | 30 | import software.amazon.awssdk.core.internal.async.ByteArrayAsyncResponseTransformer;
|
| 31 | +import software.amazon.awssdk.core.internal.async.DefaultAsyncResponseTransformerSplitResult; |
31 | 32 | import software.amazon.awssdk.core.internal.async.FileAsyncResponseTransformer;
|
32 | 33 | import software.amazon.awssdk.core.internal.async.InputStreamResponseTransformer;
|
33 | 34 | import software.amazon.awssdk.core.internal.async.PublisherAsyncResponseTransformer;
|
34 | 35 | import software.amazon.awssdk.core.internal.async.SplittingTransformer;
|
35 | 36 | import software.amazon.awssdk.utils.Validate;
|
| 37 | +import software.amazon.awssdk.utils.builder.CopyableBuilder; |
| 38 | +import software.amazon.awssdk.utils.builder.ToCopyableBuilder; |
36 | 39 |
|
37 | 40 | /**
|
38 | 41 | * Callback interface to handle a streaming asynchronous response.
|
@@ -116,25 +119,26 @@ public interface AsyncResponseTransformer<ResponseT, ResultT> {
|
116 | 119 | void exceptionOccurred(Throwable error);
|
117 | 120 |
|
118 | 121 | /**
|
119 |
| - * Creates an {@link SplitAsyncResponseTransformer} which contains an {@link SplittingTransformer} that splits the |
| 122 | + * Creates an {@link SplitResult} which contains an {@link SplittingTransformer} that splits the |
120 | 123 | * {@link AsyncResponseTransformer} into multiple ones, publishing them as a {@link SdkPublisher}.
|
121 | 124 | *
|
122 | 125 | * @param splitConfig configuration for the split transformer
|
123 | 126 | * @return SplitAsyncResponseTransformer instance.
|
124 | 127 | * @see SplittingTransformer
|
125 |
| - * @see SplitAsyncResponseTransformer |
| 128 | + * @see SplitResult |
126 | 129 | */
|
127 |
| - default SplitAsyncResponseTransformer<ResponseT, ResultT> split(SplittingTransformerConfiguration splitConfig) { |
| 130 | + default SplitResult<ResponseT, ResultT> split(SplittingTransformerConfiguration splitConfig) { |
| 131 | + Validate.notNull(splitConfig, "splitConfig must not be null"); |
128 | 132 | CompletableFuture<ResultT> future = new CompletableFuture<>();
|
129 | 133 | SdkPublisher<AsyncResponseTransformer<ResponseT, ResponseT>> transformer = SplittingTransformer
|
130 | 134 | .<ResponseT, ResultT>builder()
|
131 | 135 | .upstreamResponseTransformer(this)
|
132 |
| - .maximumBufferSize(splitConfig.bufferSize()) |
133 |
| - .returnFuture(future) |
| 136 | + .maximumBufferSizeInBytes(splitConfig.bufferSizeInBytes()) |
| 137 | + .resultFuture(future) |
134 | 138 | .build();
|
135 |
| - return SplitAsyncResponseTransformer.<ResponseT, ResultT>builder() |
136 |
| - .asyncResponseTransformerPublisher(transformer) |
137 |
| - .future(future) |
| 139 | + return AsyncResponseTransformer.SplitResult.<ResponseT, ResultT>builder() |
| 140 | + .publisher(transformer) |
| 141 | + .resultFuture(future) |
138 | 142 | .build();
|
139 | 143 | }
|
140 | 144 |
|
@@ -285,4 +289,68 @@ static <ResponseT extends SdkResponse> AsyncResponseTransformer<ResponseT, Respo
|
285 | 289 | AsyncResponseTransformer<ResponseT, ResponseInputStream<ResponseT>> toBlockingInputStream() {
|
286 | 290 | return new InputStreamResponseTransformer<>();
|
287 | 291 | }
|
| 292 | + |
| 293 | + /** |
| 294 | + * Helper interface containing the result of {@link AsyncResponseTransformer#split(SplittingTransformerConfiguration) |
| 295 | + * splitting} an AsyncResponseTransformer. This class holds both the publisher of the individual |
| 296 | + * {@code AsyncResponseTransformer<ResponseT, ResponseT>} and the {@code CompletableFuture <ResultT>} which will |
| 297 | + * complete when the {@code AsyncResponseTransformer} that was split itself would complete. |
| 298 | + * |
| 299 | + * @param <ResponseT> ResponseT of the original AsyncResponseTransformer that was split. |
| 300 | + * @param <ResultT> ResultT of the original AsyncResponseTransformer that was split. |
| 301 | + * @see AsyncResponseTransformer#split(SplittingTransformerConfiguration) |
| 302 | + */ |
| 303 | + interface SplitResult<ResponseT, ResultT> |
| 304 | + extends ToCopyableBuilder<AsyncResponseTransformer.SplitResult.Builder<ResponseT, ResultT>, |
| 305 | + AsyncResponseTransformer.SplitResult<ResponseT, ResultT>> { |
| 306 | + |
| 307 | + /** |
| 308 | + * The individual {@link AsyncResponseTransformer} will be available through the publisher returned by this method. |
| 309 | + * |
| 310 | + * @return the publisher which publishes the individual {@link AsyncResponseTransformer} |
| 311 | + */ |
| 312 | + SdkPublisher<AsyncResponseTransformer<ResponseT, ResponseT>> publisher(); |
| 313 | + |
| 314 | + /** |
| 315 | + * The future returned by this method will be completed when the future returned by calling the |
| 316 | + * {@link AsyncResponseTransformer#prepare()} method on the AsyncResponseTransformer which was split completes. |
| 317 | + * |
| 318 | + * @return The future |
| 319 | + */ |
| 320 | + CompletableFuture<ResultT> resultFuture(); |
| 321 | + |
| 322 | + static <ResponseT, ResultT> Builder<ResponseT, ResultT> builder() { |
| 323 | + return DefaultAsyncResponseTransformerSplitResult.builder(); |
| 324 | + } |
| 325 | + |
| 326 | + interface Builder<ResponseT, ResultT> |
| 327 | + extends CopyableBuilder<AsyncResponseTransformer.SplitResult.Builder<ResponseT, ResultT>, |
| 328 | + AsyncResponseTransformer.SplitResult<ResponseT, ResultT>> { |
| 329 | + |
| 330 | + /** |
| 331 | + * @return the publisher which was configured on this Builder instance. |
| 332 | + */ |
| 333 | + SdkPublisher<AsyncResponseTransformer<ResponseT, ResponseT>> publisher(); |
| 334 | + |
| 335 | + /** |
| 336 | + * Sets the publisher publishing the individual {@link AsyncResponseTransformer} |
| 337 | + * @param publisher the publisher |
| 338 | + * @return an instance of this Builder |
| 339 | + */ |
| 340 | + Builder<ResponseT, ResultT> publisher(SdkPublisher<AsyncResponseTransformer<ResponseT, ResponseT>> publisher); |
| 341 | + |
| 342 | + /** |
| 343 | + * @return The future which was configured an this Builder instance. |
| 344 | + */ |
| 345 | + CompletableFuture<ResultT> resultFuture(); |
| 346 | + |
| 347 | + /** |
| 348 | + * Sets the future that will be completed when the future returned by calling the |
| 349 | + * {@link AsyncResponseTransformer#prepare()} method on the AsyncResponseTransformer which was split completes. |
| 350 | + * @param future the future |
| 351 | + * @return an instance of this Builder |
| 352 | + */ |
| 353 | + Builder<ResponseT, ResultT> resultFuture(CompletableFuture<ResultT> future); |
| 354 | + } |
| 355 | + } |
288 | 356 | }
|
0 commit comments