Skip to content

Commit 4d9fb44

Browse files
committed
feat(generator): wire transport stub delegation to resumable upload stubs
Wires the generated transport stubs (GrpcServiceStub and HttpJsonServiceStub) to delegate resumable upload methods to the internal HTTP upload stub. In GrpcServiceStub, credentials, headers, and clocks are forwarded to the underlying HTTP client context. Clients initialize successfully without credentials; an exception results only if use of the HTTP upload stub is attempted. Also declares the stub-side contract that the transports implement: - In AbstractServiceStubClassComposer: emit public ResumableUploadCallable<RequestT, ResponseT> [method]Callable() throwing UnsupportedOperationException.
1 parent f772f86 commit 4d9fb44

12 files changed

Lines changed: 956 additions & 39 deletions

‎sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/Composer.java‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,12 @@
2929
import com.google.api.generator.gapic.composer.grpcrest.HttpJsonServiceClientTestClassComposer;
3030
import com.google.api.generator.gapic.composer.resourcename.ResourceNameHelperClassComposer;
3131
import com.google.api.generator.gapic.composer.rest.HttpJsonServiceCallableFactoryClassComposer;
32+
import com.google.api.generator.gapic.composer.rest.HttpJsonServiceResumableUploadStubClassComposer;
3233
import com.google.api.generator.gapic.composer.rest.HttpJsonServiceStubClassComposer;
3334
import com.google.api.generator.gapic.model.GapicClass;
3435
import com.google.api.generator.gapic.model.GapicContext;
3536
import com.google.api.generator.gapic.model.GapicPackageInfo;
37+
import com.google.api.generator.gapic.model.Method;
3638
import com.google.api.generator.gapic.model.ReflectConfig;
3739
import com.google.api.generator.gapic.model.Sample;
3840
import com.google.api.generator.gapic.model.Service;
@@ -91,6 +93,11 @@ public static List<GapicClass> generateStubClasses(GapicContext context) {
9193
.services()
9294
.forEach(
9395
s -> {
96+
if (s.methods().stream().anyMatch(Method::isResumableUpload)) {
97+
clazzes.add(
98+
HttpJsonServiceResumableUploadStubClassComposer.instance()
99+
.generate(context, s));
100+
}
94101
if (context.transport() == Transport.REST) {
95102
clazzes.add(
96103
com.google.api.generator.gapic.composer.rest.ServiceStubClassComposer.instance()

‎sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubClassComposer.java‎

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.google.api.gax.rpc.ClientStreamingCallable;
2222
import com.google.api.gax.rpc.LongRunningClient;
2323
import com.google.api.gax.rpc.OperationCallable;
24+
import com.google.api.gax.rpc.ResumableUploadCallable;
2425
import com.google.api.gax.rpc.ServerStreamingCallable;
2526
import com.google.api.gax.rpc.UnaryCallable;
2627
import com.google.api.generator.engine.ast.AnnotationNode;
@@ -52,6 +53,7 @@
5253
import java.util.Iterator;
5354
import java.util.List;
5455
import java.util.Map;
56+
import java.util.Optional;
5557
import java.util.stream.Collectors;
5658
import javax.annotation.Generated;
5759
import org.jspecify.annotations.NullMarked;
@@ -162,22 +164,7 @@ private MethodDefinition createCallableGetter(Method method, TypeStore typeStore
162164

163165
private MethodDefinition createCallableGetterHelper(
164166
Method method, TypeStore typeStore, boolean isLroCallable, boolean isPaged) {
165-
TypeNode returnType;
166-
switch (method.stream()) {
167-
case CLIENT:
168-
returnType = typeStore.get("ClientStreamingCallable");
169-
break;
170-
case SERVER:
171-
returnType = typeStore.get("ServerStreamingCallable");
172-
break;
173-
case BIDI:
174-
returnType = typeStore.get("BidiStreamingCallable");
175-
break;
176-
case NONE:
177-
// Fall through.
178-
default:
179-
returnType = typeStore.get(isLroCallable ? "OperationCallable" : "UnaryCallable");
180-
}
167+
TypeNode returnType = getCallableType(method, typeStore, isLroCallable);
181168

182169
String methodName =
183170
String.format(
@@ -270,6 +257,7 @@ private static TypeStore createTypes(Service service, Map<String, Message> messa
270257
Generated.class,
271258
Operation.class,
272259
OperationCallable.class,
260+
ResumableUploadCallable.class,
273261
ServerStreamingCallable.class,
274262
UnaryCallable.class,
275263
UnsupportedOperationException.class,
@@ -328,4 +316,22 @@ protected MethodDefinition createOperationsStubGetterMethodDefinition(
328316
.build())))
329317
.build();
330318
}
319+
320+
private static TypeNode getCallableType(
321+
Method method, TypeStore typeStore, boolean isLroCallable) {
322+
if (method.isResumableUpload()) {
323+
return typeStore.get("ResumableUploadCallable");
324+
}
325+
switch (method.stream()) {
326+
case CLIENT:
327+
return typeStore.get("ClientStreamingCallable");
328+
case SERVER:
329+
return typeStore.get("ServerStreamingCallable");
330+
case BIDI:
331+
return typeStore.get("BidiStreamingCallable");
332+
case NONE:
333+
default:
334+
return typeStore.get(isLroCallable ? "OperationCallable" : "UnaryCallable");
335+
}
336+
}
331337
}

0 commit comments

Comments
 (0)