Skip to content

Commit c36a2ad

Browse files
committed
feat(gax): add ResumableUploadCallable creation to Callables and HttpJsonCallableFactory
1 parent 6845669 commit c36a2ad

4 files changed

Lines changed: 98 additions & 0 deletions

File tree

sdk-platform-java/gax-java/gax-httpjson/src/main/java/com/google/api/gax/httpjson/HttpJsonCallableFactory.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@
2929
*/
3030
package com.google.api.gax.httpjson;
3131

32+
import com.google.api.core.BetaApi;
3233
import com.google.api.core.ObsoleteApi;
3334
import com.google.api.gax.longrunning.OperationSnapshot;
35+
import com.google.api.gax.resumable.ResumableUploadClient;
3436
import com.google.api.gax.rpc.BatchingCallSettings;
3537
import com.google.api.gax.rpc.Callables;
3638
import com.google.api.gax.rpc.ClientContext;
@@ -39,6 +41,8 @@
3941
import com.google.api.gax.rpc.OperationCallSettings;
4042
import com.google.api.gax.rpc.OperationCallable;
4143
import com.google.api.gax.rpc.PagedCallSettings;
44+
import com.google.api.gax.rpc.ResumableUploadCallSettings;
45+
import com.google.api.gax.rpc.ResumableUploadCallable;
4246
import com.google.api.gax.rpc.ServerStreamingCallSettings;
4347
import com.google.api.gax.rpc.ServerStreamingCallable;
4448
import com.google.api.gax.rpc.UnaryCallSettings;
@@ -221,6 +225,27 @@ ServerStreamingCallable<RequestT, ResponseT> createServerStreamingCallable(
221225
return callable.withDefaultCallContext(clientContext.getDefaultCallContext());
222226
}
223227

228+
/**
229+
* Creates a {@link ResumableUploadCallable} to execute resumable uploads. Designed for use by
230+
* generated code.
231+
*
232+
* @param httpJsonCallSettings the http/json call settings
233+
* @param callSettings settings configuring chunk size
234+
* @param clientContext client context providing default call context
235+
* @return {@link ResumableUploadCallable} callable object
236+
*/
237+
@BetaApi
238+
public static <RequestT, ResponseT>
239+
ResumableUploadCallable<RequestT, ResponseT> createResumableUploadCallable(
240+
HttpJsonCallSettings<RequestT, ResponseT> httpJsonCallSettings,
241+
ResumableUploadCallSettings callSettings,
242+
ClientContext clientContext) {
243+
ResumableUploadClient<RequestT, ResponseT> uploadClient =
244+
HttpJsonResumableUploadClient.create(
245+
clientContext, httpJsonCallSettings.getMethodDescriptor());
246+
return Callables.resumableUpload(uploadClient, callSettings, clientContext);
247+
}
248+
224249
static ApiTracerContext getApiTracerContext(ApiMethodDescriptor<?, ?> methodDescriptor) {
225250
return ApiTracerContext.newBuilder()
226251
.setFullMethodName(methodDescriptor.getFullMethodName())

sdk-platform-java/gax-java/gax-httpjson/src/test/java/com/google/api/gax/httpjson/HttpJsonCallableFactoryTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434
import static org.mockito.Mockito.mock;
3535

3636
import com.google.api.client.http.HttpMethods;
37+
import com.google.api.gax.rpc.ClientContext;
38+
import com.google.api.gax.rpc.ResumableUploadCallSettings;
39+
import com.google.api.gax.rpc.ResumableUploadCallable;
3740
import com.google.api.gax.tracing.ApiTracerContext;
3841
import com.google.api.gax.tracing.SpanName;
3942
import com.google.api.pathtemplate.PathTemplate;
@@ -107,4 +110,34 @@ void testGetApiTracerContextInvalid() {
107110
assertThat(actualError).isNotNull();
108111
}
109112
}
113+
114+
@Test
115+
void testCreateResumableUploadCallable() {
116+
@SuppressWarnings("unchecked")
117+
ApiMethodDescriptor<String, String> descriptor =
118+
ApiMethodDescriptor.<String, String>newBuilder()
119+
.setFullMethodName("test/upload")
120+
.setHttpMethod(HttpMethods.POST)
121+
.setRequestFormatter(createMockRequestFormatter())
122+
.setResponseParser(
123+
mock(HttpResponseParser.class, Mockito.withSettings().withoutAnnotations()))
124+
.build();
125+
126+
HttpJsonCallSettings<String, String> httpJsonCallSettings =
127+
HttpJsonCallSettings.<String, String>newBuilder().setMethodDescriptor(descriptor).build();
128+
129+
ResumableUploadCallSettings callSettings =
130+
ResumableUploadCallSettings.newBuilder().setChunkSize(256 * 1024).build();
131+
132+
ClientContext clientContext =
133+
ClientContext.newBuilder()
134+
.setDefaultCallContext(HttpJsonCallContext.createDefault())
135+
.build();
136+
137+
ResumableUploadCallable<String, String> callable =
138+
HttpJsonCallableFactory.createResumableUploadCallable(
139+
httpJsonCallSettings, callSettings, clientContext);
140+
141+
assertThat(callable).isNotNull();
142+
}
110143
}

sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/rpc/Callables.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.google.api.gax.batching.BatchingSettings;
3434
import com.google.api.gax.longrunning.OperationResponsePollAlgorithm;
3535
import com.google.api.gax.longrunning.OperationSnapshot;
36+
import com.google.api.gax.resumable.ResumableUploadClient;
3637
import com.google.api.gax.retrying.ExponentialRetryAlgorithm;
3738
import com.google.api.gax.retrying.RetryAlgorithm;
3839
import com.google.api.gax.retrying.RetrySettings;
@@ -270,6 +271,26 @@ OperationCallableImpl<RequestT, ResponseT, MetadataT> longRunningOperationImpl(
270271
initialCallable, scheduler, longRunningClient, operationCallSettings);
271272
}
272273

274+
/**
275+
* Creates a {@link ResumableUploadCallable} to execute resumable uploads. Designed for use by
276+
* generated code.
277+
*
278+
* @param uploadClient client executing the wire-level upload protocol
279+
* @param callSettings settings configuring chunk size
280+
* @param clientContext client context providing default call context and executor
281+
* @return {@link ResumableUploadCallable} callable object
282+
*/
283+
public static <RequestT, ResponseT> ResumableUploadCallable<RequestT, ResponseT> resumableUpload(
284+
ResumableUploadClient<RequestT, ResponseT> uploadClient,
285+
ResumableUploadCallSettings callSettings,
286+
ClientContext clientContext) {
287+
return new ResumableUploadCallableImpl<>(
288+
uploadClient,
289+
callSettings,
290+
clientContext.getDefaultCallContext(),
291+
clientContext.getExecutor());
292+
}
293+
273294
private static boolean areRetriesDisabled(
274295
Collection<StatusCode.Code> retryableCodes, RetrySettings retrySettings) {
275296
return retrySettings.getMaxAttempts() == 1

sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/rpc/CallableTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
package com.google.api.gax.rpc;
3131

3232
import static org.junit.jupiter.api.Assertions.assertEquals;
33+
import static org.junit.jupiter.api.Assertions.assertNotNull;
3334
import static org.mockito.ArgumentMatchers.any;
3435
import static org.mockito.ArgumentMatchers.anyString;
3536
import static org.mockito.ArgumentMatchers.eq;
@@ -42,6 +43,7 @@
4243
import com.google.api.core.ApiClock;
4344
import com.google.api.core.ApiFuture;
4445
import com.google.api.core.SettableApiFuture;
46+
import com.google.api.gax.resumable.ResumableUploadClient;
4547
import com.google.api.gax.retrying.RetrySettings;
4648
import com.google.api.gax.rpc.testing.FakeCallContext;
4749
import java.util.concurrent.ScheduledExecutorService;
@@ -207,4 +209,21 @@ void testWatched_usesJavaTimeMethods() {
207209
verify(callContext, atLeastOnce()).withStreamIdleTimeoutDuration(eq(timeout));
208210
verify(callContext, atLeastOnce()).withStreamWaitTimeoutDuration(eq(timeout));
209211
}
212+
213+
@Test
214+
void testResumableUploadCallable() {
215+
@SuppressWarnings("unchecked")
216+
ResumableUploadClient<String, String> uploadClient =
217+
mock(ResumableUploadClient.class, Mockito.withSettings().withoutAnnotations());
218+
ResumableUploadCallSettings settings =
219+
ResumableUploadCallSettings.newBuilder().setChunkSize(1024).build();
220+
ScheduledExecutorService executor =
221+
mock(ScheduledExecutorService.class, Mockito.withSettings().withoutAnnotations());
222+
ClientContext context = clientContext.toBuilder().setExecutor(executor).build();
223+
224+
ResumableUploadCallable<String, String> callable =
225+
Callables.resumableUpload(uploadClient, settings, context);
226+
227+
assertNotNull(callable);
228+
}
210229
}

0 commit comments

Comments
 (0)