diff --git a/java-showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonResumableUploadServiceResumableUploadStub.java b/java-showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonResumableUploadServiceResumableUploadStub.java index 7c8e488ef036..2b7c1b7ea2dc 100644 --- a/java-showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonResumableUploadServiceResumableUploadStub.java +++ b/java-showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/stub/HttpJsonResumableUploadServiceResumableUploadStub.java @@ -37,6 +37,7 @@ import com.google.showcase.v1beta1.UploadMediaRequest; import com.google.showcase.v1beta1.UploadMediaResponse; import java.io.IOException; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -97,16 +98,36 @@ class HttpJsonResumableUploadServiceResumableUploadStub implements BackgroundRes uploadMediaCallable; public static HttpJsonResumableUploadServiceResumableUploadStub create( - ResumableUploadServiceStubSettings settings) throws IOException { - if (settings - .getTransportChannelProvider() - .getTransportName() - .equals(HttpJsonTransportChannel.getHttpJsonTransportName())) { + ResumableUploadServiceStubSettings settings) { + if (!HttpJsonCallableFactory.isResumableUploadSupported(settings)) { return new HttpJsonResumableUploadServiceResumableUploadStub( - ClientContext.create(settings), settings); + HttpJsonCallableFactory.createFailingResumableUploadCallable(), + new BackgroundResourceAggregation(Collections.emptyList())); } + ClientContext clientContext; + try { + if (settings + .getTransportChannelProvider() + .getTransportName() + .equals(HttpJsonTransportChannel.getHttpJsonTransportName())) { + clientContext = ClientContext.create(settings); + } else { + clientContext = deriveHttpJsonClientContext(settings); + } + } catch (IOException e) { + return new HttpJsonResumableUploadServiceResumableUploadStub( + HttpJsonCallableFactory.createFailingResumableUploadCallable(e), + new BackgroundResourceAggregation(Collections.emptyList())); + } + HttpJsonCallSettings uploadMediaTransportSettings = + HttpJsonCallSettings.newBuilder() + .setMethodDescriptor(uploadMediaMethodDescriptor) + .setTypeRegistry(typeRegistry) + .build(); return new HttpJsonResumableUploadServiceResumableUploadStub( - deriveHttpJsonClientContext(settings), settings); + HttpJsonCallableFactory.createResumableUploadCallable( + uploadMediaTransportSettings, settings.uploadMediaSettings(), clientContext), + new BackgroundResourceAggregation(clientContext.getBackgroundResources())); } private static ClientContext deriveHttpJsonClientContext( @@ -127,18 +148,10 @@ private static ClientContext deriveHttpJsonClientContext( } private HttpJsonResumableUploadServiceResumableUploadStub( - ClientContext clientContext, ResumableUploadServiceStubSettings settings) { - HttpJsonCallSettings uploadMediaTransportSettings = - HttpJsonCallSettings.newBuilder() - .setMethodDescriptor(uploadMediaMethodDescriptor) - .setTypeRegistry(typeRegistry) - .build(); - this.uploadMediaCallable = - HttpJsonCallableFactory.createResumableUploadCallable( - uploadMediaTransportSettings, settings.uploadMediaSettings(), clientContext); - - this.backgroundResources = - new BackgroundResourceAggregation(clientContext.getBackgroundResources()); + ResumableUploadCallable uploadMediaCallable, + BackgroundResource backgroundResources) { + this.uploadMediaCallable = uploadMediaCallable; + this.backgroundResources = backgroundResources; } public ResumableUploadCallable uploadMediaCallable() { diff --git a/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITResumableUpload.java b/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITResumableUpload.java index 871374fbc565..b59887dd7bf8 100644 --- a/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITResumableUpload.java +++ b/java-showcase/gapic-showcase/src/test/java/com/google/showcase/v1beta1/it/ITResumableUpload.java @@ -17,8 +17,10 @@ package com.google.showcase.v1beta1.it; import static com.google.common.truth.Truth.assertThat; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertThrows; +import com.google.api.gax.core.NoCredentialsProvider; import com.google.api.gax.httpjson.HttpJsonCallContext; import com.google.api.gax.rpc.ApiCallContext; import com.google.api.gax.rpc.DeadlineExceededException; @@ -30,6 +32,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.showcase.v1beta1.ResumableUploadServiceClient; +import com.google.showcase.v1beta1.ResumableUploadServiceSettings; import com.google.showcase.v1beta1.UploadMediaRequest; import com.google.showcase.v1beta1.UploadMediaResponse; import com.google.showcase.v1beta1.it.util.TestClientInitializer; @@ -140,24 +143,22 @@ void testGrpcClientDelegation(@TempDir Path tempDir) throws Exception { UploadMediaRequest request = UploadMediaRequest.newBuilder().setName("it-grpc-delegation.txt").build(); - try (ResumableUploadServiceClient grpcClient = - TestClientInitializer.createGrpcResumableUploadClient(SHOWCASE_CHUNK_SIZE)) { - UploadMediaResponse syncResponse = - grpcClient.uploadMedia(request, () -> Files.newInputStream(file), DEFAULT_TEST_OPTIONS); - assertThat(syncResponse.getName()).isEqualTo("it-grpc-delegation.txt"); - assertThat(syncResponse.getSize()).isEqualTo(Files.size(file)); - + ResumableUploadServiceSettings settings = + ResumableUploadServiceSettings.newBuilder() + .setCredentialsProvider(NoCredentialsProvider.create()) + .setEndpoint(TestClientInitializer.DEFAULT_GRPC_ENDPOINT) + .build(); + try (ResumableUploadServiceClient grpcClient = ResumableUploadServiceClient.create(settings)) { ResumableUploadFuture future = - grpcClient - .uploadMediaCallable() - .futureCall(request, () -> Files.newInputStream(file), null); - UploadMediaResponse asyncResponse = future.get(10, TimeUnit.SECONDS); - assertThat(future.isDone()).isTrue(); - assertThat(future.isCancelled()).isFalse(); - assertThat(future.getUploadSessionUrl()).isNotNull(); - assertThat(future.getUploadSessionUrl()).contains("/resumable/upload"); - assertThat(asyncResponse.getName()).isEqualTo("it-grpc-delegation.txt"); - assertThat(asyncResponse.getSize()).isEqualTo(Files.size(file)); + assertDoesNotThrow( + () -> + grpcClient + .uploadMediaCallable() + .futureCall(request, () -> Files.newInputStream(file), null)); + // Only verify that the bridged callable accepts the call: gRPC settings require + // "localhost:7469" (no scheme), which causes the HTTP/JSON bridge to default to "https://" + // against plaintext Showcase. + future.cancel(true); } } @@ -359,6 +360,33 @@ void testProgressListener(@TempDir Path tempDir) throws Exception { } } + @Test + void testGrpcClientCustomTransportRejected(@TempDir Path tempDir) throws Exception { + Path file = + createTempFile( + tempDir, + "it-grpc-rejected.txt", + "Payload that should not be uploaded".getBytes(StandardCharsets.UTF_8)); + UploadMediaRequest request = + UploadMediaRequest.newBuilder().setName("it-grpc-rejected.txt").build(); + + try (ResumableUploadServiceClient grpcClient = + TestClientInitializer.createGrpcResumableUploadClient(SHOWCASE_CHUNK_SIZE)) { + assertThat(grpcClient.uploadMediaCallable()).isNotNull(); + assertThrows( + IllegalStateException.class, + () -> + grpcClient.uploadMedia( + request, () -> Files.newInputStream(file), DEFAULT_TEST_OPTIONS)); + assertThrows( + IllegalStateException.class, + () -> + grpcClient + .uploadMediaCallable() + .futureCall(request, () -> Files.newInputStream(file), null)); + } + } + private static Path createTempFile(Path dir, String fileName, byte[] data) throws IOException { Path path = dir.resolve(fileName); Files.write(path, data); diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceResumableUploadStubClassComposer.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceResumableUploadStubClassComposer.java index ef8fa0696e15..3d52e5793065 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceResumableUploadStubClassComposer.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceResumableUploadStubClassComposer.java @@ -49,7 +49,9 @@ import com.google.api.generator.engine.ast.Statement; import com.google.api.generator.engine.ast.StringObjectValue; import com.google.api.generator.engine.ast.ThisObjectValue; +import com.google.api.generator.engine.ast.TryCatchStatement; import com.google.api.generator.engine.ast.TypeNode; +import com.google.api.generator.engine.ast.UnaryOperationExpr; import com.google.api.generator.engine.ast.ValueExpr; import com.google.api.generator.engine.ast.Variable; import com.google.api.generator.engine.ast.VariableExpr; @@ -68,6 +70,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; @@ -95,6 +98,7 @@ public class HttpJsonServiceResumableUploadStubClassComposer implements ClassCom BackgroundResourceAggregation.class, BetaApi.class, ClientContext.class, + Collections.class, GaxHttpJsonProperties.class, GaxProperties.class, Generated.class, @@ -252,16 +256,17 @@ public GapicClass generate(GapicContext context, Service service) { // Methods List methodDefinitions = new ArrayList<>(); - methodDefinitions.addAll(createStaticCreatorMethods(service, typeStore, className)); methodDefinitions.addAll( - createConstructorMethods( + createStaticCreatorMethods( service, typeStore, className, - backgroundResourcesVarExpr, callableClassMembers, protoMethodNameToDescriptorVarExprs, resumableUploadMethods)); + methodDefinitions.addAll( + createConstructorMethods( + typeStore, className, backgroundResourcesVarExpr, callableClassMembers)); methodDefinitions.addAll(createCallableGetterMethods(callableClassMembers)); methodDefinitions.addAll(createBackgroundResourceMethods(backgroundResourcesVarExpr)); @@ -282,7 +287,12 @@ public GapicClass generate(GapicContext context, Service service) { } private static List createStaticCreatorMethods( - Service service, TypeStore typeStore, String className) { + Service service, + TypeStore typeStore, + String className, + Map callableClassMembers, + Map protoMethodNameToDescriptorVarExprs, + List resumableUploadMethods) { TypeNode thisClassType = typeStore.get(className); TypeNode clientContextType = FIXED_TYPESTORE.get(ClientContext.class.getSimpleName()); TypeNode transportChannelType = @@ -293,6 +303,73 @@ private static List createStaticCreatorMethods( VariableExpr.withVariable( Variable.builder().setName("settings").setType(stubSettingsType).build()); + VariableExpr catchIoExceptionVarExpr = + VariableExpr.withVariable( + Variable.builder() + .setName("e") + .setType(FIXED_TYPESTORE.get(IOException.class.getSimpleName())) + .build()); + + List failingCtorArgs = new ArrayList<>(); + List contextFailureCtorArgs = new ArrayList<>(); + for (Method method : resumableUploadMethods) { + String javaStyleName = JavaStyle.toLowerCamelCase(method.name()); + VariableExpr callableVarExpr = + callableClassMembers.get(String.format("%sCallable", javaStyleName)); + failingCtorArgs.add( + MethodInvocationExpr.builder() + .setStaticReferenceType( + FIXED_TYPESTORE.get(HttpJsonCallableFactory.class.getSimpleName())) + .setMethodName("createFailingResumableUploadCallable") + .setReturnType(callableVarExpr.type()) + .build()); + contextFailureCtorArgs.add( + MethodInvocationExpr.builder() + .setStaticReferenceType( + FIXED_TYPESTORE.get(HttpJsonCallableFactory.class.getSimpleName())) + .setMethodName("createFailingResumableUploadCallable") + .setArguments(Arrays.asList(catchIoExceptionVarExpr)) + .setReturnType(callableVarExpr.type()) + .build()); + } + MethodInvocationExpr emptyListExpr = + MethodInvocationExpr.builder() + .setStaticReferenceType(FIXED_TYPESTORE.get(Collections.class.getSimpleName())) + .setMethodName("emptyList") + .build(); + Expr emptyBackgroundResourcesExpr = + NewObjectExpr.builder() + .setType(FIXED_TYPESTORE.get(BackgroundResourceAggregation.class.getSimpleName())) + .setArguments(Arrays.asList(emptyListExpr)) + .build(); + failingCtorArgs.add(emptyBackgroundResourcesExpr); + contextFailureCtorArgs.add(emptyBackgroundResourcesExpr); + + Statement checkSupportedStmt = + IfStatement.builder() + .setConditionExpr( + UnaryOperationExpr.logicalNotWithExpr( + MethodInvocationExpr.builder() + .setStaticReferenceType( + FIXED_TYPESTORE.get(HttpJsonCallableFactory.class.getSimpleName())) + .setMethodName("isResumableUploadSupported") + .setArguments(Arrays.asList(settingsVarExpr)) + .setReturnType(TypeNode.BOOLEAN) + .build())) + .setBody( + Arrays.asList( + ExprStatement.withExpr( + ReturnExpr.withExpr( + NewObjectExpr.builder() + .setType(thisClassType) + .setArguments(failingCtorArgs) + .build())))) + .build(); + + VariableExpr clientContextVarExpr = + VariableExpr.withVariable( + Variable.builder().setName("clientContext").setType(clientContextType).build()); + Expr getTransportNameExpr = MethodInvocationExpr.builder() .setExprReferenceExpr(settingsVarExpr) @@ -320,22 +397,148 @@ private static List createStaticCreatorMethods( IfStatement.builder() .setConditionExpr(isHttpJsonConditionExpr) .setBody( + Arrays.asList( + ExprStatement.withExpr( + AssignmentExpr.builder() + .setVariableExpr(clientContextVarExpr) + .setValueExpr( + MethodInvocationExpr.builder() + .setStaticReferenceType(clientContextType) + .setMethodName("create") + .setArguments(Arrays.asList(settingsVarExpr)) + .setReturnType(clientContextType) + .build()) + .build()))) + .setElseBody( + Arrays.asList( + ExprStatement.withExpr( + AssignmentExpr.builder() + .setVariableExpr(clientContextVarExpr) + .setValueExpr( + MethodInvocationExpr.builder() + .setMethodName(DERIVE_CLIENT_CONTEXT_METHOD_NAME) + .setArguments(Arrays.asList(settingsVarExpr)) + .setReturnType(clientContextType) + .build()) + .build()))) + .build(); + + List createBodyStatements = new ArrayList<>(); + createBodyStatements.add(checkSupportedStmt); + createBodyStatements.add( + ExprStatement.withExpr(clientContextVarExpr.toBuilder().setIsDecl(true).build())); + createBodyStatements.add( + TryCatchStatement.builder() + .setTryBody(Arrays.asList(createHttpJsonContextStmt)) + .addCatch( + catchIoExceptionVarExpr.toBuilder().setIsDecl(true).build(), Arrays.asList( ExprStatement.withExpr( ReturnExpr.withExpr( NewObjectExpr.builder() .setType(thisClassType) - .setArguments( - Arrays.asList( - MethodInvocationExpr.builder() - .setStaticReferenceType(clientContextType) - .setMethodName("create") - .setArguments(Arrays.asList(settingsVarExpr)) - .setReturnType(clientContextType) - .build(), - settingsVarExpr)) + .setArguments(contextFailureCtorArgs) .build())))) + .build()); + + List ctorArgs = new ArrayList<>(); + for (Method method : resumableUploadMethods) { + String javaStyleName = JavaStyle.toLowerCamelCase(method.name()); + VariableExpr descriptorVarExpr = protoMethodNameToDescriptorVarExprs.get(method.name()); + VariableExpr callableVarExpr = + callableClassMembers.get(String.format("%sCallable", javaStyleName)); + + TypeNode httpJsonCallSettingsType = + TypeNode.withReference( + ConcreteReference.builder() + .setClazz(HttpJsonCallSettings.class) + .setGenerics( + Arrays.asList( + method.inputType().reference(), method.outputType().reference())) + .build()); + + VariableExpr transportSettingsVarExpr = + VariableExpr.builder() + .setVariable( + Variable.builder() + .setName(String.format("%sTransportSettings", javaStyleName)) + .setType(httpJsonCallSettingsType) + .build()) + .setIsDecl(true) + .build(); + + MethodInvocationExpr callSettingsBuilderExpr = + MethodInvocationExpr.builder() + .setStaticReferenceType( + FIXED_TYPESTORE.get(HttpJsonCallSettings.class.getSimpleName())) + .setGenerics( + Arrays.asList(method.inputType().reference(), method.outputType().reference())) + .setMethodName(NEW_BUILDER_METHOD_NAME) + .build(); + callSettingsBuilderExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(callSettingsBuilderExpr) + .setMethodName("setMethodDescriptor") + .setArguments(Arrays.asList(descriptorVarExpr)) + .build(); + callSettingsBuilderExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(callSettingsBuilderExpr) + .setMethodName("setTypeRegistry") + .setArguments( + Arrays.asList( + VariableExpr.builder() + .setVariable( + Variable.builder() + .setName("typeRegistry") + .setType(FIXED_TYPESTORE.get(TypeRegistry.class.getSimpleName())) + .build()) + .build())) + .build(); + callSettingsBuilderExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(callSettingsBuilderExpr) + .setMethodName(BUILD_METHOD_NAME) + .setReturnType(httpJsonCallSettingsType) + .build(); + + createBodyStatements.add( + ExprStatement.withExpr( + AssignmentExpr.builder() + .setVariableExpr(transportSettingsVarExpr) + .setValueExpr(callSettingsBuilderExpr) + .build())); + + MethodInvocationExpr getSettingsExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(settingsVarExpr) + .setMethodName(String.format("%sSettings", javaStyleName)) + .build(); + + ctorArgs.add( + MethodInvocationExpr.builder() + .setStaticReferenceType( + FIXED_TYPESTORE.get(HttpJsonCallableFactory.class.getSimpleName())) + .setMethodName("createResumableUploadCallable") + .setArguments( + Arrays.asList( + transportSettingsVarExpr.toBuilder().setIsDecl(false).build(), + getSettingsExpr, + clientContextVarExpr)) + .setReturnType(callableVarExpr.type()) + .build()); + } + + MethodInvocationExpr getBackgroundResourcesExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr(clientContextVarExpr) + .setMethodName("getBackgroundResources") .build(); + ctorArgs.add( + NewObjectExpr.builder() + .setType(FIXED_TYPESTORE.get(BackgroundResourceAggregation.class.getSimpleName())) + .setArguments(Arrays.asList(getBackgroundResourcesExpr)) + .build()); MethodDefinition createMethod = MethodDefinition.builder() @@ -343,22 +546,10 @@ private static List createStaticCreatorMethods( .setIsStatic(true) .setReturnType(thisClassType) .setName("create") - .setThrowsExceptions( - Arrays.asList(FIXED_TYPESTORE.get(IOException.class.getSimpleName()))) .setArguments(Arrays.asList(settingsVarExpr.toBuilder().setIsDecl(true).build())) - .setBody(Arrays.asList(createHttpJsonContextStmt)) + .setBody(createBodyStatements) .setReturnExpr( - NewObjectExpr.builder() - .setType(thisClassType) - .setArguments( - Arrays.asList( - MethodInvocationExpr.builder() - .setMethodName(DERIVE_CLIENT_CONTEXT_METHOD_NAME) - .setArguments(Arrays.asList(settingsVarExpr)) - .setReturnType(clientContextType) - .build(), - settingsVarExpr)) - .build()) + NewObjectExpr.builder().setType(thisClassType).setArguments(ctorArgs).build()) .build(); return Arrays.asList( @@ -483,151 +674,41 @@ private static MethodDefinition createDeriveHttpJsonClientContextMethod( } private static List createConstructorMethods( - Service service, TypeStore typeStore, String className, VariableExpr backgroundResourcesVarExpr, - Map callableClassMembers, - Map protoMethodNameToDescriptorVarExprs, - List resumableUploadMethods) { + Map callableClassMembers) { TypeNode thisClassType = typeStore.get(className); - TypeNode clientContextType = FIXED_TYPESTORE.get(ClientContext.class.getSimpleName()); - TypeNode stubSettingsType = typeStore.get(String.format(STUB_SETTINGS_PATTERN, service.name())); - - VariableExpr clientContextVarExpr = - VariableExpr.withVariable( - Variable.builder().setName("clientContext").setType(clientContextType).build()); - VariableExpr settingsVarExpr = - VariableExpr.withVariable( - Variable.builder().setName("settings").setType(stubSettingsType).build()); - Expr thisExpr = ValueExpr.withValue(ThisObjectValue.withType(thisClassType)); - List ctorStatements = new ArrayList<>(); - for (Method method : resumableUploadMethods) { - String javaStyleName = JavaStyle.toLowerCamelCase(method.name()); - VariableExpr descriptorVarExpr = protoMethodNameToDescriptorVarExprs.get(method.name()); - VariableExpr callableVarExpr = - callableClassMembers.get(String.format("%sCallable", javaStyleName)); - - TypeNode httpJsonCallSettingsType = - TypeNode.withReference( - ConcreteReference.builder() - .setClazz(HttpJsonCallSettings.class) - .setGenerics( - Arrays.asList( - method.inputType().reference(), method.outputType().reference())) - .build()); - - VariableExpr transportSettingsVarExpr = - VariableExpr.builder() - .setVariable( - Variable.builder() - .setName(String.format("%sTransportSettings", javaStyleName)) - .setType(httpJsonCallSettingsType) - .build()) - .setIsDecl(true) - .build(); - - MethodInvocationExpr callSettingsBuilderExpr = - MethodInvocationExpr.builder() - .setStaticReferenceType( - FIXED_TYPESTORE.get(HttpJsonCallSettings.class.getSimpleName())) - .setGenerics( - Arrays.asList(method.inputType().reference(), method.outputType().reference())) - .setMethodName(NEW_BUILDER_METHOD_NAME) - .build(); - callSettingsBuilderExpr = - MethodInvocationExpr.builder() - .setExprReferenceExpr(callSettingsBuilderExpr) - .setMethodName("setMethodDescriptor") - .setArguments(Arrays.asList(descriptorVarExpr)) - .build(); - callSettingsBuilderExpr = - MethodInvocationExpr.builder() - .setExprReferenceExpr(callSettingsBuilderExpr) - .setMethodName("setTypeRegistry") - .setArguments( - Arrays.asList( - VariableExpr.builder() - .setVariable( - Variable.builder() - .setName("typeRegistry") - .setType(FIXED_TYPESTORE.get(TypeRegistry.class.getSimpleName())) - .build()) - .build())) - .build(); - callSettingsBuilderExpr = - MethodInvocationExpr.builder() - .setExprReferenceExpr(callSettingsBuilderExpr) - .setMethodName(BUILD_METHOD_NAME) - .setReturnType(httpJsonCallSettingsType) - .build(); - - ctorStatements.add( - ExprStatement.withExpr( - AssignmentExpr.builder() - .setVariableExpr(transportSettingsVarExpr) - .setValueExpr(callSettingsBuilderExpr) - .build())); - - MethodInvocationExpr getSettingsExpr = - MethodInvocationExpr.builder() - .setExprReferenceExpr(settingsVarExpr) - .setMethodName(String.format("%sSettings", javaStyleName)) - .build(); - - MethodInvocationExpr createCallableExpr = - MethodInvocationExpr.builder() - .setStaticReferenceType( - FIXED_TYPESTORE.get(HttpJsonCallableFactory.class.getSimpleName())) - .setMethodName("createResumableUploadCallable") - .setArguments( - Arrays.asList( - transportSettingsVarExpr.toBuilder().setIsDecl(false).build(), - getSettingsExpr, - clientContextVarExpr)) - .setReturnType(callableVarExpr.type()) - .build(); + List ctorArgs = new ArrayList<>(); + List ctorStatements = new ArrayList<>(); + for (VariableExpr callableVarExpr : callableClassMembers.values()) { + ctorArgs.add(callableVarExpr.toBuilder().setIsDecl(true).build()); ctorStatements.add( ExprStatement.withExpr( AssignmentExpr.builder() .setVariableExpr( callableVarExpr.toBuilder().setExprReferenceExpr(thisExpr).build()) - .setValueExpr(createCallableExpr) + .setValueExpr(callableVarExpr) .build())); - ctorStatements.add(EMPTY_LINE_STATEMENT); } - MethodInvocationExpr getBackgroundResourcesExpr = - MethodInvocationExpr.builder() - .setExprReferenceExpr(clientContextVarExpr) - .setMethodName("getBackgroundResources") - .build(); - - Expr newBackgroundResourceExpr = - NewObjectExpr.builder() - .setType(FIXED_TYPESTORE.get(BackgroundResourceAggregation.class.getSimpleName())) - .setArguments(Arrays.asList(getBackgroundResourcesExpr)) - .build(); - + ctorArgs.add(backgroundResourcesVarExpr.toBuilder().setIsDecl(true).build()); ctorStatements.add( ExprStatement.withExpr( AssignmentExpr.builder() .setVariableExpr( backgroundResourcesVarExpr.toBuilder().setExprReferenceExpr(thisExpr).build()) - .setValueExpr(newBackgroundResourceExpr) + .setValueExpr(backgroundResourcesVarExpr) .build())); return Arrays.asList( MethodDefinition.constructorBuilder() .setScope(ScopeNode.PRIVATE) .setReturnType(thisClassType) - .setArguments( - Arrays.asList( - clientContextVarExpr.toBuilder().setIsDecl(true).build(), - settingsVarExpr.toBuilder().setIsDecl(true).build())) + .setArguments(ctorArgs) .setBody(ctorStatements) .build()); } diff --git a/sdk-platform-java/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/rest/goldens/HttpJsonMediaServiceResumableUploadStub.golden b/sdk-platform-java/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/rest/goldens/HttpJsonMediaServiceResumableUploadStub.golden index 93ae96f8a81f..e740b42df93a 100644 --- a/sdk-platform-java/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/rest/goldens/HttpJsonMediaServiceResumableUploadStub.golden +++ b/sdk-platform-java/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/rest/goldens/HttpJsonMediaServiceResumableUploadStub.golden @@ -21,6 +21,7 @@ import com.google.protobuf.TypeRegistry; import com.google.showcase.v1beta1.UploadMediaRequest; import com.google.showcase.v1beta1.UploadMediaResponse; import java.io.IOException; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -80,16 +81,36 @@ class HttpJsonMediaServiceResumableUploadStub implements BackgroundResource { private final ResumableUploadCallable uploadMediaCallable; - public static HttpJsonMediaServiceResumableUploadStub create(MediaServiceStubSettings settings) - throws IOException { - if (settings - .getTransportChannelProvider() - .getTransportName() - .equals(HttpJsonTransportChannel.getHttpJsonTransportName())) { - return new HttpJsonMediaServiceResumableUploadStub(ClientContext.create(settings), settings); + public static HttpJsonMediaServiceResumableUploadStub create(MediaServiceStubSettings settings) { + if (!HttpJsonCallableFactory.isResumableUploadSupported(settings)) { + return new HttpJsonMediaServiceResumableUploadStub( + HttpJsonCallableFactory.createFailingResumableUploadCallable(), + new BackgroundResourceAggregation(Collections.emptyList())); + } + ClientContext clientContext; + try { + if (settings + .getTransportChannelProvider() + .getTransportName() + .equals(HttpJsonTransportChannel.getHttpJsonTransportName())) { + clientContext = ClientContext.create(settings); + } else { + clientContext = deriveHttpJsonClientContext(settings); + } + } catch (IOException e) { + return new HttpJsonMediaServiceResumableUploadStub( + HttpJsonCallableFactory.createFailingResumableUploadCallable(e), + new BackgroundResourceAggregation(Collections.emptyList())); } + HttpJsonCallSettings uploadMediaTransportSettings = + HttpJsonCallSettings.newBuilder() + .setMethodDescriptor(uploadMediaMethodDescriptor) + .setTypeRegistry(typeRegistry) + .build(); return new HttpJsonMediaServiceResumableUploadStub( - deriveHttpJsonClientContext(settings), settings); + HttpJsonCallableFactory.createResumableUploadCallable( + uploadMediaTransportSettings, settings.uploadMediaSettings(), clientContext), + new BackgroundResourceAggregation(clientContext.getBackgroundResources())); } private static ClientContext deriveHttpJsonClientContext(MediaServiceStubSettings settings) @@ -110,18 +131,10 @@ class HttpJsonMediaServiceResumableUploadStub implements BackgroundResource { } private HttpJsonMediaServiceResumableUploadStub( - ClientContext clientContext, MediaServiceStubSettings settings) { - HttpJsonCallSettings uploadMediaTransportSettings = - HttpJsonCallSettings.newBuilder() - .setMethodDescriptor(uploadMediaMethodDescriptor) - .setTypeRegistry(typeRegistry) - .build(); - this.uploadMediaCallable = - HttpJsonCallableFactory.createResumableUploadCallable( - uploadMediaTransportSettings, settings.uploadMediaSettings(), clientContext); - - this.backgroundResources = - new BackgroundResourceAggregation(clientContext.getBackgroundResources()); + ResumableUploadCallable uploadMediaCallable, + BackgroundResource backgroundResources) { + this.uploadMediaCallable = uploadMediaCallable; + this.backgroundResources = backgroundResources; } public ResumableUploadCallable uploadMediaCallable() {