diff --git a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceCallableFactoryClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceCallableFactoryClassComposer.java index d643c9726b..ea3898051c 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceCallableFactoryClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceCallableFactoryClassComposer.java @@ -41,7 +41,6 @@ import com.google.api.generator.gapic.model.GapicClass; import com.google.api.generator.gapic.model.GapicClass.Kind; import com.google.api.generator.gapic.model.GapicContext; -import com.google.api.generator.gapic.model.Method; import com.google.api.generator.gapic.model.Service; import java.util.ArrayList; import java.util.Arrays; @@ -63,19 +62,13 @@ protected TransportContext getTransportContext() { @Override public GapicClass generate(GapicContext context, Service service) { - TypeStore typeStore = createTypes(); + TypeStore typeStore = createTypes(service); + String className = getTransportContext().classNames().getTransportServiceCallableFactoryClassName(service); GapicClass.Kind kind = Kind.STUB; String pakkage = String.format("%s.stub", service.pakkage()); - String operationService = ""; - for(Method method : service.methods()) { - if(method.operationService() != null) { - operationService = method.operationService(); - } - } - StubCommentComposer commentComposer = new StubCommentComposer(getTransportContext().transportName()); ClassDefinition classDef = @@ -85,9 +78,9 @@ public GapicClass generate(GapicContext context, Service service) { commentComposer.createTransportServiceCallableFactoryClassHeaderComments( service.name(), service.isDeprecated())) .setAnnotations(createClassAnnotations(service, typeStore)) - .setImplementsTypes(createClassImplements(typeStore)) + .setImplementsTypes(createClassImplements(typeStore, service)) .setName(className) - .setMethods(createClassMethods(typeStore, operationService)) + .setMethods(createClassMethods(service, typeStore)) .setScope(ScopeNode.PUBLIC) .build(); return GapicClass.create(kind, classDef); @@ -118,22 +111,23 @@ protected List createClassAnnotations(Service service, TypeStore * @return {@code TypeNode} containing the interface to be implemented by the generated callable * factory class. */ - protected abstract List createClassImplements(TypeStore typeStore); + protected abstract List createClassImplements(TypeStore typeStore, Service service); - protected List createClassMethods(TypeStore typeStore, String operationService) { + protected List createClassMethods(Service service, TypeStore typeStore) { return Arrays.asList( - createUnaryCallableMethod(typeStore), - createPagedCallableMethod(typeStore), - createBatchingCallableMethod(typeStore), - createOperationCallableMethod(typeStore, operationService)); + createUnaryCallableMethod(service, typeStore), + createPagedCallableMethod(service, typeStore), + createBatchingCallableMethod(service, typeStore), + createOperationCallableMethod(service, typeStore)); } - protected MethodDefinition createUnaryCallableMethod(TypeStore typeStore) { + protected MethodDefinition createUnaryCallableMethod(Service service, TypeStore typeStore) { String methodVariantName = "Unary"; String requestTemplateName = "RequestT"; String responseTemplateName = "ResponseT"; List methodTemplateNames = Arrays.asList(requestTemplateName, responseTemplateName); return createGenericCallableMethod( + service, typeStore, /*methodTemplateNames=*/ methodTemplateNames, /*returnCallableKindName=*/ methodVariantName, @@ -148,7 +142,7 @@ protected MethodDefinition createUnaryCallableMethod(TypeStore typeStore) { .collect(Collectors.toList())); } - protected MethodDefinition createPagedCallableMethod(TypeStore typeStore) { + protected MethodDefinition createPagedCallableMethod(Service service, TypeStore typeStore) { String methodVariantName = "Paged"; String requestTemplateName = "RequestT"; String pagedResponseTemplateName = "PagedListResponseT"; @@ -156,6 +150,7 @@ protected MethodDefinition createPagedCallableMethod(TypeStore typeStore) { List methodTemplateNames = Arrays.asList(requestTemplateName, responseTemplateName, pagedResponseTemplateName); return createGenericCallableMethod( + service, typeStore, /*methodTemplateNames=*/ methodTemplateNames, /*returnCallableKindName=*/ "Unary", @@ -170,12 +165,13 @@ protected MethodDefinition createPagedCallableMethod(TypeStore typeStore) { .collect(Collectors.toList())); } - protected MethodDefinition createBatchingCallableMethod(TypeStore typeStore) { + protected MethodDefinition createBatchingCallableMethod(Service service, TypeStore typeStore) { String methodVariantName = "Batching"; String requestTemplateName = "RequestT"; String responseTemplateName = "ResponseT"; List methodTemplateNames = Arrays.asList(requestTemplateName, responseTemplateName); return createGenericCallableMethod( + service, typeStore, /*methodTemplateNames=*/ methodTemplateNames, /*returnCallableKindName=*/ "Unary", @@ -190,9 +186,11 @@ protected MethodDefinition createBatchingCallableMethod(TypeStore typeStore) { .collect(Collectors.toList())); } - protected abstract MethodDefinition createOperationCallableMethod(TypeStore typeStore, String operationService); + protected abstract MethodDefinition createOperationCallableMethod( + Service service, TypeStore typeStore); protected MethodDefinition createGenericCallableMethod( + Service service, TypeStore typeStore, List methodTemplateNames, String returnCallableKindName, @@ -202,6 +200,7 @@ protected MethodDefinition createGenericCallableMethod( String callSettingsVariantName, List callSettingsTemplateObjects) { return createGenericCallableMethod( + service, typeStore, methodTemplateNames, returnCallableKindName, @@ -214,6 +213,7 @@ protected MethodDefinition createGenericCallableMethod( } protected MethodDefinition createGenericCallableMethod( + Service service, TypeStore typeStore, List methodTemplateNames, String returnCallableKindName, @@ -265,7 +265,7 @@ protected MethodDefinition createGenericCallableMethod( .setVariable( Variable.builder() .setName("operationsStub") - .setType(getTransportContext().operationsStubType()) + .setType(getOperationsStubType(service)) .build()) .setIsDecl(true) .build()); @@ -296,7 +296,16 @@ protected MethodDefinition createGenericCallableMethod( .build(); } - private static TypeStore createTypes() { + protected TypeNode getOperationsStubType(Service service) { + TypeNode opeationsStubType = service.operationServiceStubType(); + if (opeationsStubType == null) { + opeationsStubType = getTransportContext().operationsStubType(); + } + return opeationsStubType; + } + + + private TypeStore createTypes(Service service) { List concreteClazzes = Arrays.asList( // Gax-java classes. diff --git a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubClassComposer.java index 3202684691..8935e0b00c 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubClassComposer.java @@ -44,6 +44,7 @@ import com.google.api.generator.engine.ast.TryCatchStatement; import com.google.api.generator.engine.ast.TypeNode; import com.google.api.generator.engine.ast.ValueExpr; +import com.google.api.generator.engine.ast.VaporReference; import com.google.api.generator.engine.ast.Variable; import com.google.api.generator.engine.ast.VariableExpr; import com.google.api.generator.gapic.composer.comment.StubCommentComposer; @@ -63,6 +64,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -144,19 +146,25 @@ public GapicClass generate(GapicContext context, Service service) { .setName(BACKGROUND_RESOURCES_MEMBER_NAME) .setType(FIXED_TYPESTORE.get("BackgroundResource")) .build())); - if (getTransportContext().transportOperationsStubType() != null) { + + + TypeNode opeationsStubType = getTransportOperationsStubType(service); + if (opeationsStubType != null) { classMemberVarExprs.put( OPERATIONS_STUB_MEMBER_NAME, VariableExpr.withVariable( Variable.builder() .setName(OPERATIONS_STUB_MEMBER_NAME) - .setType(getTransportContext().transportOperationsStubType()) + .setType(opeationsStubType) .build())); } boolean operationPollingMethod = checkOperationPollingMethod(service); if(operationPollingMethod) { - declareLongRunningClient(classMemberVarExprs); + VariableExpr longRunningVarExpr = declareLongRunningClient(); + if (longRunningVarExpr != null) { + classMemberVarExprs.put("longRunningClient", longRunningVarExpr); + } } classMemberVarExprs.put( @@ -554,14 +562,16 @@ protected List createConstructorMethods( .setValueExpr(callableFactoryVarExpr) .build()); VariableExpr operationsStubClassVarExpr = classMemberVarExprs.get(OPERATIONS_STUB_MEMBER_NAME); - if (getTransportContext().transportOperationsStubType() != null) { + + TypeNode opeationsStubType = getTransportOperationsStubType(service); + if (opeationsStubType != null) { secondCtorExprs.add( AssignmentExpr.builder() .setVariableExpr( operationsStubClassVarExpr.toBuilder().setExprReferenceExpr(thisExpr).build()) .setValueExpr( MethodInvocationExpr.builder() - .setStaticReferenceType(getTransportContext().transportOperationsStubType()) + .setStaticReferenceType(opeationsStubType) .setMethodName("create") .setArguments(Arrays.asList(clientContextVarExpr, callableFactoryVarExpr)) .setReturnType(operationsStubClassVarExpr.type()) @@ -670,8 +680,8 @@ protected List createLongRunningClient(Service service, TypeStore typ return ImmutableList.of(); } - protected void declareLongRunningClient(Map classMemberVarExprs) { - + protected VariableExpr declareLongRunningClient() { + return null; } private static Expr createCallableInitExpr( @@ -845,10 +855,8 @@ private List createStubOverrideMethods( .build()) .build(); List javaMethods = new ArrayList<>(); - //TODO: check for operation polling method - boolean operationPollingMethod = checkOperationPollingMethod(service); - if (operationPollingMethod) { - getterLongRunningClient(javaMethods); + if (service.operationPollingMethod() != null) { + javaMethods.addAll(createLongRunningClientGetter()); } javaMethods.add( methodMakerStarterFn @@ -931,8 +939,8 @@ private boolean checkOperationPollingMethod(Service service) { return false; } - protected void getterLongRunningClient(List javaMethods) { - + protected List createLongRunningClientGetter() { + return Collections.emptyList(); } private TypeStore createDynamicTypes(Service service, String stubPakkage) { @@ -1002,4 +1010,20 @@ protected String getProtoRpcFullMethodName(Service protoService, Method protoMet return String.format( "%s.%s/%s", protoService.protoPakkage(), protoService.name(), protoMethod.name()); } + + protected TypeNode getTransportOperationsStubType(Service service) { + TypeNode transportOpeationsStubType = service.operationServiceStubType(); + if (transportOpeationsStubType == null) { + transportOpeationsStubType = getTransportContext().transportOperationsStubType(); + } + else { + transportOpeationsStubType = TypeNode.withReference( + VaporReference.builder() + .setName("HttpJson" + transportOpeationsStubType.reference().simpleName()) + .setPakkage(transportOpeationsStubType.reference().pakkage()) + .build()); + } + + return transportOpeationsStubType; + } } diff --git a/src/main/java/com/google/api/generator/gapic/composer/common/ServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/common/ServiceClientClassComposer.java index 5a38db0562..4f804822f1 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/common/ServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/common/ServiceClientClassComposer.java @@ -129,7 +129,7 @@ public GapicClass generate(GapicContext context, Service service) { String className = ClassNames.getServiceClientClassName(service); GapicClass.Kind kind = Kind.MAIN; String pakkage = service.pakkage(); - boolean hasLroClient = hasLroMethods(service); + boolean hasLroClient = exposeOperationsClient(service); Map> grpcRpcsToJavaMethodNames = new HashMap<>(); @@ -216,9 +216,9 @@ private static List createClassMethods( return methods; } - private static boolean hasLroMethods(Service service) { + private static boolean exposeOperationsClient(Service service) { for (Method method : service.methods()) { - if (method.hasLro()) { + if (method.hasLro() && method.lro().operationServiceStubType() == null) { return true; } } diff --git a/src/main/java/com/google/api/generator/gapic/composer/common/ServiceStubClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/common/ServiceStubClassComposer.java index 9d16f98f88..1c8bed3ccb 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/common/ServiceStubClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/common/ServiceStubClassComposer.java @@ -112,7 +112,11 @@ private static List createClassMethods( boolean hasLroClient = hasLroMethods(service); List methods = new ArrayList<>(); if (hasLroClient) { - methods.add(createOperationsStubGetter(typeStore)); + TypeNode operationsStubType = service.operationServiceStubType(); + if (operationsStubType == null) { + operationsStubType = typeStore.get("OperationsStub"); + } + methods.add(createOperationsStubGetter(typeStore, operationsStubType)); } methods.addAll(createCallableGetters(service, messageTypes, typeStore)); methods.addAll(createBackgroundResourceMethodOverrides()); @@ -203,11 +207,11 @@ private static MethodDefinition createCallableGetterHelper( .build(); } - private static MethodDefinition createOperationsStubGetter(TypeStore typeStore) { + private static MethodDefinition createOperationsStubGetter(TypeStore typeStore, TypeNode operationsStubType) { String methodName = "getOperationsStub"; return MethodDefinition.builder() .setScope(ScopeNode.PUBLIC) - .setReturnType(typeStore.get("OperationsStub")) + .setReturnType(operationsStubType) .setName(methodName) .setBody(createThrowUOEBody(methodName, typeStore)) .build(); diff --git a/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceCallableFactoryClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceCallableFactoryClassComposer.java index 06bb6695b2..38446187e8 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceCallableFactoryClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceCallableFactoryClassComposer.java @@ -19,6 +19,7 @@ import com.google.api.generator.engine.ast.TypeNode; import com.google.api.generator.gapic.composer.common.AbstractServiceCallableFactoryClassComposer; import com.google.api.generator.gapic.composer.store.TypeStore; +import com.google.api.generator.gapic.model.Service; import com.google.longrunning.Operation; import java.util.ArrayList; import java.util.Arrays; @@ -41,28 +42,30 @@ public static GrpcServiceCallableFactoryClassComposer instance() { } @Override - protected List createClassImplements(TypeStore typeStore) { + protected List createClassImplements(TypeStore typeStore, Service service) { return Arrays.asList(getTransportContext().stubCallableFactoryType()); } - protected List createClassMethods( - TypeStore typeStore, String operationService) { + @Override + protected List createClassMethods(Service service, TypeStore typeStore) { List classMethods = - new ArrayList<>(super.createClassMethods(typeStore, operationService)); + new ArrayList<>(super.createClassMethods(service, typeStore)); classMethods.addAll( Arrays.asList( - createBidiStreamingCallableMethod(typeStore), - createServerStreamingCallableMethod(typeStore), - createClientStreamingCallableMethod(typeStore))); + createBidiStreamingCallableMethod(service, typeStore), + createServerStreamingCallableMethod(service, typeStore), + createClientStreamingCallableMethod(service, typeStore))); return classMethods; } - protected MethodDefinition createUnaryCallableMethod(TypeStore typeStore) { + @Override + protected MethodDefinition createUnaryCallableMethod(Service service, TypeStore typeStore) { String methodVariantName = "Unary"; String requestTemplateName = "RequestT"; String responseTemplateName = "ResponseT"; List methodTemplateNames = Arrays.asList(requestTemplateName, responseTemplateName); return createGenericCallableMethod( + service, typeStore, /*methodTemplateNames=*/ methodTemplateNames, /*returnCallableKindName=*/ methodVariantName, @@ -77,7 +80,8 @@ protected MethodDefinition createUnaryCallableMethod(TypeStore typeStore) { .collect(Collectors.toList())); } - protected MethodDefinition createPagedCallableMethod(TypeStore typeStore) { + @Override + protected MethodDefinition createPagedCallableMethod(Service service, TypeStore typeStore) { String methodVariantName = "Paged"; String requestTemplateName = "RequestT"; String pagedResponseTemplateName = "PagedListResponseT"; @@ -85,6 +89,7 @@ protected MethodDefinition createPagedCallableMethod(TypeStore typeStore) { List methodTemplateNames = Arrays.asList(requestTemplateName, responseTemplateName, pagedResponseTemplateName); return createGenericCallableMethod( + service, typeStore, /*methodTemplateNames=*/ methodTemplateNames, /*returnCallableKindName=*/ "Unary", @@ -100,14 +105,14 @@ protected MethodDefinition createPagedCallableMethod(TypeStore typeStore) { } @Override - protected MethodDefinition createOperationCallableMethod( - TypeStore typeStore, String operationService) { + protected MethodDefinition createOperationCallableMethod(Service service, TypeStore typeStore) { String methodVariantName = "Operation"; String requestTemplateName = "RequestT"; String responseTemplateName = "ResponseT"; List methodTemplateNames = Arrays.asList(requestTemplateName, responseTemplateName, "MetadataT"); return createGenericCallableMethod( + service, typeStore, /*methodTemplateNames=*/ methodTemplateNames, /*returnCallableKindName=*/ methodVariantName, @@ -120,12 +125,13 @@ protected MethodDefinition createOperationCallableMethod( .collect(Collectors.toList())); } - private MethodDefinition createBidiStreamingCallableMethod(TypeStore typeStore) { + private MethodDefinition createBidiStreamingCallableMethod(Service service, TypeStore typeStore) { String methodVariantName = "BidiStreaming"; String requestTemplateName = "RequestT"; String responseTemplateName = "ResponseT"; List methodTemplateNames = Arrays.asList(requestTemplateName, responseTemplateName); return createGenericCallableMethod( + service, typeStore, /*methodTemplateNames=*/ methodTemplateNames, /*returnCallableKindName=*/ methodVariantName, @@ -140,12 +146,14 @@ private MethodDefinition createBidiStreamingCallableMethod(TypeStore typeStore) .collect(Collectors.toList())); } - private MethodDefinition createServerStreamingCallableMethod(TypeStore typeStore) { + private MethodDefinition createServerStreamingCallableMethod( + Service service, TypeStore typeStore) { String methodVariantName = "ServerStreaming"; String requestTemplateName = "RequestT"; String responseTemplateName = "ResponseT"; List methodTemplateNames = Arrays.asList(requestTemplateName, responseTemplateName); return createGenericCallableMethod( + service, typeStore, /*methodTemplateNames=*/ methodTemplateNames, /*returnCallableKindName=*/ methodVariantName, @@ -160,12 +168,14 @@ private MethodDefinition createServerStreamingCallableMethod(TypeStore typeStore .collect(Collectors.toList())); } - private MethodDefinition createClientStreamingCallableMethod(TypeStore typeStore) { + private MethodDefinition createClientStreamingCallableMethod( + Service service, TypeStore typeStore) { String methodVariantName = "ClientStreaming"; String requestTemplateName = "RequestT"; String responseTemplateName = "ResponseT"; List methodTemplateNames = Arrays.asList(requestTemplateName, responseTemplateName); return createGenericCallableMethod( + service, typeStore, /*methodTemplateNames=*/ methodTemplateNames, /*returnCallableKindName=*/ methodVariantName, diff --git a/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceCallableFactoryClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceCallableFactoryClassComposer.java index 919e6c973c..7f8a966859 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceCallableFactoryClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceCallableFactoryClassComposer.java @@ -14,7 +14,6 @@ package com.google.api.generator.gapic.composer.rest; -import com.google.api.gax.core.BackgroundResource; import com.google.api.gax.httpjson.HttpJsonCallableFactory; import com.google.api.gax.httpjson.HttpJsonOperationSnapshotCallable; import com.google.api.gax.rpc.OperationCallable; @@ -45,10 +44,8 @@ public class HttpJsonServiceCallableFactoryClassComposer private static final HttpJsonServiceCallableFactoryClassComposer INSTANCE = new HttpJsonServiceCallableFactoryClassComposer(); - private static final TypeNode MESSAGE_TYPE = + private static final TypeNode DEFAULT_OPERATION_TYPE = TypeNode.withReference(ConcreteReference.withClazz(Operation.class)); - private static final TypeNode BACKGROUND_RESOURCE_TYPE = - TypeNode.withReference(ConcreteReference.withClazz(BackgroundResource.class)); private HttpJsonServiceCallableFactoryClassComposer() { super(RestContext.instance()); @@ -73,23 +70,29 @@ protected List createClassAnnotations(Service service, TypeStore } @Override - protected List createClassImplements(TypeStore typeStore) { + protected List createClassImplements(TypeStore typeStore, Service service) { + TypeNode operationsStubType = getOperationsStubType(service); + + TypeNode operationType = service.operationType(); + if (operationType == null) { + operationType = DEFAULT_OPERATION_TYPE; + } + return Arrays.asList( TypeNode.withReference( getTransportContext() .stubCallableFactoryType() .reference() .copyAndSetGenerics( - Arrays.asList( - MESSAGE_TYPE.reference(), BACKGROUND_RESOURCE_TYPE.reference())))); + Arrays.asList(operationType.reference(), operationsStubType.reference())))); } @Override - protected MethodDefinition createOperationCallableMethod( - TypeStore typeStore, String operationService) { + protected MethodDefinition createOperationCallableMethod(Service service, TypeStore typeStore) { String methodVariantName = "Operation"; String requestTemplateName = "RequestT"; String responseTemplateName = "ResponseT"; + List methodTemplateNames = Arrays.asList(requestTemplateName, responseTemplateName, "MetadataT"); @@ -104,36 +107,28 @@ protected MethodDefinition createOperationCallableMethod( + " future."); // Generate generic method without the body - // TODO: change static usages to vapor references + TypeNode operationType = service.operationType(); + if (operationType == null) { + operationType = DEFAULT_OPERATION_TYPE; + } MethodDefinition method = createGenericCallableMethod( + service, typeStore, /*methodTemplateNames=*/ methodTemplateNames, /*returnCallableKindName=*/ methodVariantName, /*returnCallableTemplateNames=*/ methodTemplateNames, /*methodVariantName=*/ methodVariantName, /*httpJsonCallSettingsTemplateObjects=*/ Arrays.asList( - requestTemplateName, MESSAGE_TYPE), + requestTemplateName, operationType), /*callSettingsVariantName=*/ methodVariantName, /*callSettingsTemplateObjects=*/ methodTemplateNames.stream() .map(n -> (Object) n) .collect(Collectors.toList()), Arrays.asList(betaAnnotation)); - // if (operationService.equals("")) { - // return method.toBuilder().setReturnExpr(ValueExpr.createNullExpr()).build(); - // } - List createOperationCallableBody = new ArrayList(2); - List arguments = new ArrayList<>(method.arguments()); - // Variable stubVar = arguments.get(3).variable(); - // stubVar = Variable.builder() - // .setName(stubVar.identifier().name()) - // .setType(typeStore.get(operationService+"Stub")) - // .build(); - // arguments.set(3,VariableExpr.withVariable(stubVar)); - // method = method.toBuilder().setArguments(arguments).build(); Variable httpJsonCallSettingsVar = arguments.get(0).variable(); Variable operationCallSettingsVar = arguments.get(1).variable(); @@ -177,14 +172,14 @@ protected MethodDefinition createOperationCallableMethod( VaporReference requestT = VaporReference.builder() .setName("RequestT") - .setPakkage("com.google.cloud.compute.v1.stub") + .setPakkage(service.pakkage() + ".stub") .build(); TypeNode initialCallableType = TypeNode.withReference( ConcreteReference.builder() .setClazz(HttpJsonOperationSnapshotCallable.class) - .setGenerics(requestT, ConcreteReference.withClazz(Operation.class)) + .setGenerics(requestT, operationType.reference()) .build()); // Generate initialCallable @@ -213,7 +208,7 @@ protected MethodDefinition createOperationCallableMethod( TypeNode.withReference( ConcreteReference.builder() .setClazz(HttpJsonOperationSnapshotCallable.class) - .setGenerics(requestT, ConcreteReference.withClazz(Operation.class)) + .setGenerics(requestT, operationType.reference()) .build()); NewObjectExpr initialCallableObject = NewObjectExpr.builder() diff --git a/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java index d00e23c5fc..39974fe44a 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java @@ -131,7 +131,7 @@ protected Statement createMethodDescriptorVariableDecl( methodMaker.apply("setRequestFormatter", getRequestFormatterExpr(protoMethod)).apply(expr); expr = methodMaker.apply("setResponseParser", setResponseParserExpr(protoMethod)).apply(expr); - if (protoMethod.isOperationPollingMethod() || protoMethod.operationService() != null) { + if (protoMethod.isOperationPollingMethod() || protoMethod.hasLro()) { expr = methodMaker .apply( @@ -139,6 +139,7 @@ protected Statement createMethodDescriptorVariableDecl( setOperationSnapshotFactoryExpr(protoMethod, messageTypes)) .apply(expr); } + if (protoMethod.isOperationPollingMethod()) { expr = methodMaker @@ -470,7 +471,7 @@ private List setOperationSnapshotFactoryExpr( MethodInvocationExpr getId = MethodInvocationExpr.builder() .setExprReferenceExpr(responseVarExpr) - .setMethodName(getMethodFormat(operationResponse.getNameFieldName())) + .setMethodName(getMethodFormat(operationResponse.nameFieldName())) .build(); Expr opNameObjectExpr = NewObjectExpr.builder().setType(stringBuilderType).setArguments(getId).build(); @@ -496,19 +497,17 @@ private List setOperationSnapshotFactoryExpr( MethodInvocationExpr getStatusExpr = MethodInvocationExpr.builder() .setExprReferenceExpr(responseVarExpr) - .setMethodName(getMethodFormat(operationResponse.getStatusFieldName())) + .setMethodName(getMethodFormat(operationResponse.statusFieldName())) .build(); - String statusTypeName = operationResponse.getStatusFieldTypeName(); + String statusTypeName = operationResponse.statusFieldTypeName(); String statusClassName = statusTypeName.substring(statusTypeName.lastIndexOf('.') + 1); - String statusPackage = protoMethod.servicePackage(); // "com" + - // statusTypeName.substring(0,statusTypeName.lastIndexOf('.')); TypeNode statusType = TypeNode.withReference( VaporReference.builder() .setName(statusClassName) - .setPakkage(statusPackage + "." + protoMethod.outputType().reference().simpleName()) + .setPakkage(protoMethod.outputType().reference().fullName()) .setIsStaticImport(false) .build()); VariableExpr statusDoneExpr = @@ -536,12 +535,12 @@ private List setOperationSnapshotFactoryExpr( MethodInvocationExpr getHttpErrorStatusCodeExpr = MethodInvocationExpr.builder() .setExprReferenceExpr(responseVarExpr) - .setMethodName(getMethodFormat(operationResponse.getErrorCodeFieldName())) + .setMethodName(getMethodFormat(operationResponse.errorCodeFieldName())) .build(); MethodInvocationExpr getHttpErrorMessageExpr = MethodInvocationExpr.builder() .setExprReferenceExpr(responseVarExpr) - .setMethodName(getMethodFormat(operationResponse.getErrorMessageFieldName())) + .setMethodName(getMethodFormat(operationResponse.errorMessageFieldName())) .build(); MethodInvocationExpr newBuilderExpr = MethodInvocationExpr.builder() @@ -861,16 +860,8 @@ private List getHttpMethodTypeExpr(Method protoMethod) { @Override protected List createLongRunningClient(Service service, TypeStore typeStore) { - boolean operation_polling_method = false; - Method protoMethod = null; - for (Method method : service.methods()) { - if (method.isOperationPollingMethod()) { - protoMethod = method; - operation_polling_method = true; - break; - } - } - if (operation_polling_method) { + Method pollingMethod = service.operationPollingMethod(); + if (pollingMethod != null) { Expr thisExpr = ValueExpr.withValue( ThisObjectValue.withType( @@ -882,13 +873,13 @@ protected List createLongRunningClient(Service service, TypeStore typ VariableExpr callable = VariableExpr.withVariable( Variable.builder() - .setName(protoMethod.name().toLowerCase() + "Callable") + .setName(pollingMethod.name().toLowerCase() + "Callable") .setType(TypeNode.withReference(ConcreteReference.withClazz(UnaryCallable.class))) .build()); VariableExpr methodDescriptor = VariableExpr.withVariable( Variable.builder() - .setName(protoMethod.name().toLowerCase() + "MethodDescriptor") + .setName(pollingMethod.name().toLowerCase() + "MethodDescriptor") .setType( TypeNode.withReference( ConcreteReference.withClazz(ApiMethodDescriptor.class))) @@ -900,8 +891,8 @@ protected List createLongRunningClient(Service service, TypeStore typ .setClazz(HttpJsonLongRunningClient.class) .setGenerics( Arrays.asList( - protoMethod.inputType().reference(), - protoMethod.outputType().reference())) + pollingMethod.inputType().reference(), + pollingMethod.outputType().reference())) .build()); NewObjectExpr HttpJsonLongRunningClient = @@ -943,19 +934,16 @@ protected List createLongRunningClient(Service service, TypeStore typ } @Override - protected void declareLongRunningClient(Map classMemberVarExprs) { - classMemberVarExprs.put( - "longRunningClient", - VariableExpr.withVariable( - Variable.builder() - .setName("longRunningClient") - .setType( - TypeNode.withReference(ConcreteReference.withClazz(LongRunningClient.class))) - .build())); + protected VariableExpr declareLongRunningClient() { + return VariableExpr.withVariable( + Variable.builder() + .setName("longRunningClient") + .setType(TypeNode.withReference(ConcreteReference.withClazz(LongRunningClient.class))) + .build()); } @Override - protected void getterLongRunningClient(List javaMethods) { + protected List createLongRunningClientGetter() { VariableExpr longRunningClient = VariableExpr.withVariable( Variable.builder() @@ -964,7 +952,7 @@ protected void getterLongRunningClient(List javaMethods) { TypeNode.withReference(ConcreteReference.withClazz(LongRunningClient.class))) .build()); - javaMethods.add( + return ImmutableList.of( MethodDefinition.builder() .setName("longRunningClient") .setScope(ScopeNode.PUBLIC) diff --git a/src/main/java/com/google/api/generator/gapic/model/LongrunningOperation.java b/src/main/java/com/google/api/generator/gapic/model/LongrunningOperation.java index c2b425e2f8..e23e8a6ee3 100644 --- a/src/main/java/com/google/api/generator/gapic/model/LongrunningOperation.java +++ b/src/main/java/com/google/api/generator/gapic/model/LongrunningOperation.java @@ -16,6 +16,7 @@ import com.google.api.generator.engine.ast.TypeNode; import com.google.auto.value.AutoValue; +import javax.annotation.Nullable; @AutoValue public abstract class LongrunningOperation { @@ -23,22 +24,21 @@ public abstract class LongrunningOperation { public abstract TypeNode metadataType(); - public static LongrunningOperation withTypes(TypeNode responseType, TypeNode metadataType) { - return builder().setResponseType(responseType).setMetadataType(metadataType).build(); - } + @Nullable + public abstract TypeNode operationServiceStubType(); - // Private. - static Builder builder() { + public static Builder builder() { return new AutoValue_LongrunningOperation.Builder(); } - // Private. @AutoValue.Builder - abstract static class Builder { - abstract Builder setResponseType(TypeNode responseType); + public abstract static class Builder { + public abstract Builder setResponseType(TypeNode responseType); + + public abstract Builder setMetadataType(TypeNode metadataType); - abstract Builder setMetadataType(TypeNode metadataType); + public abstract Builder setOperationServiceStubType(TypeNode operationServiceType); - abstract LongrunningOperation build(); + public abstract LongrunningOperation build(); } } diff --git a/src/main/java/com/google/api/generator/gapic/model/Method.java b/src/main/java/com/google/api/generator/gapic/model/Method.java index aaf3f4a596..286bd8c84e 100644 --- a/src/main/java/com/google/api/generator/gapic/model/Method.java +++ b/src/main/java/com/google/api/generator/gapic/model/Method.java @@ -68,12 +68,6 @@ public boolean isPaged() { public abstract boolean operationPollingMethod(); - @Nullable - public abstract String operationService(); - - @Nullable - public abstract String servicePackage(); - public boolean hasLro() { return lro() != null; } @@ -146,10 +140,6 @@ public abstract static class Builder { public abstract Builder setOperationPollingMethod(boolean operationPollingMethod); - public abstract Builder setOperationService(String operationService); - - public abstract Builder setServicePackage(String servicePackage); - public abstract Method build(); } } diff --git a/src/main/java/com/google/api/generator/gapic/model/OperationResponse.java b/src/main/java/com/google/api/generator/gapic/model/OperationResponse.java index 1a141479ac..20543d3fc8 100644 --- a/src/main/java/com/google/api/generator/gapic/model/OperationResponse.java +++ b/src/main/java/com/google/api/generator/gapic/model/OperationResponse.java @@ -21,19 +21,19 @@ @AutoValue public abstract class OperationResponse { @Nullable - public abstract String getNameFieldName(); + public abstract String nameFieldName(); @Nullable - public abstract String getStatusFieldName(); + public abstract String statusFieldName(); @Nullable - public abstract String getErrorCodeFieldName(); + public abstract String errorCodeFieldName(); @Nullable - public abstract String getErrorMessageFieldName(); + public abstract String errorMessageFieldName(); @Nullable - public abstract String getStatusFieldTypeName(); + public abstract String statusFieldTypeName(); public static Builder builder() { return new AutoValue_OperationResponse.Builder(); diff --git a/src/main/java/com/google/api/generator/gapic/model/Service.java b/src/main/java/com/google/api/generator/gapic/model/Service.java index f21125fb54..ace91051bc 100644 --- a/src/main/java/com/google/api/generator/gapic/model/Service.java +++ b/src/main/java/com/google/api/generator/gapic/model/Service.java @@ -14,6 +14,7 @@ package com.google.api.generator.gapic.model; +import com.google.api.generator.engine.ast.TypeNode; import com.google.auto.value.AutoValue; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; @@ -49,6 +50,35 @@ public boolean hasDescription() { return !Strings.isNullOrEmpty(description()); } + public Method operationPollingMethod() { + for (Method method : methods()) { + if (method.isOperationPollingMethod()) { + return method; + } + } + return null; + } + + public TypeNode operationServiceStubType() { + for (Method method : methods()) { + if (method.hasLro() && method.lro().operationServiceStubType() != null) { + // All methods within the same service must have the same operationServiceTypeName if + // present + return method.lro().operationServiceStubType(); + } + } + return null; + } + + public TypeNode operationType() { + for (Method method : methods()) { + if (method.hasLro() && method.lro().operationServiceStubType() != null) { + return method.outputType(); + } + } + return null; + } + public abstract Builder toBuilder(); public static Builder builder() { diff --git a/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java b/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java index 0fdbb86c2b..a5f227a3d7 100644 --- a/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java +++ b/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java @@ -20,6 +20,7 @@ import com.google.api.ResourceDescriptor; import com.google.api.ResourceProto; import com.google.api.generator.engine.ast.TypeNode; +import com.google.api.generator.engine.ast.VaporReference; import com.google.api.generator.gapic.model.Field; import com.google.api.generator.gapic.model.GapicBatchingSettings; import com.google.api.generator.gapic.model.GapicContext; @@ -707,11 +708,6 @@ static List parseMethods( .getOptions() .getExtension(ExtendedOperationsProto.operationPollingMethod) : false; - String operationService = - protoMethod.getOptions().hasExtension(ExtendedOperationsProto.operationService) - ? protoMethod.getOptions().getExtension(ExtendedOperationsProto.operationService) - : null; - methods.add( methodBuilder .setName(protoMethod.getName()) @@ -719,7 +715,7 @@ static List parseMethods( .setOutputType(TypeParser.parseType(protoMethod.getOutputType())) .setStream( Method.toStream(protoMethod.isClientStreaming(), protoMethod.isServerStreaming())) - .setLro(parseLro(protoMethod, messageTypes)) + .setLro(parseLro(servicePackage, protoMethod, messageTypes)) .setMethodSignatures( MethodSignatureParser.parseMethodSignatures( protoMethod, @@ -733,8 +729,6 @@ static List parseMethods( .setPageSizeFieldName(parsePageSizeFieldName(protoMethod, messageTypes, transport)) .setIsDeprecated(isDeprecated) .setOperationPollingMethod(operationPollingMethod) - .setOperationService(operationService) - .setServicePackage(servicePackage) .build()); // Any input type that has a resource reference will need a resource name helper class. @@ -776,18 +770,43 @@ static List parseMethods( @VisibleForTesting static LongrunningOperation parseLro( - MethodDescriptor methodDescriptor, Map messageTypes) { + String servicePackage, MethodDescriptor methodDescriptor, Map messageTypes) { MethodOptions methodOptions = methodDescriptor.getOptions(); - if (!methodOptions.hasExtension(OperationsProto.operationInfo)) { - return null; + + TypeNode operationServiceStubType = null; + String responseTypeName = null; + String metadataTypeName = null; + + if (methodOptions.hasExtension(OperationsProto.operationInfo)) { + OperationInfo lroInfo = + methodDescriptor.getOptions().getExtension(OperationsProto.operationInfo); + responseTypeName = lroInfo.getResponseType(); + metadataTypeName = lroInfo.getMetadataType(); + } + if (methodOptions.hasExtension(ExtendedOperationsProto.operationService)) { + // TODO: support full package name for operations_service annotation value + String opServiceName = methodOptions.getExtension(ExtendedOperationsProto.operationService); + operationServiceStubType = + TypeNode.withReference( + VaporReference.builder() + .setName(opServiceName + "Stub") + .setPakkage(servicePackage + ".stub") + .build()); + + if (responseTypeName == null) { + responseTypeName = methodDescriptor.getOutputType().getFullName(); + } + if (metadataTypeName == null) { + metadataTypeName = methodDescriptor.getOutputType().getFullName(); + } } - OperationInfo lroInfo = - methodDescriptor.getOptions().getExtension(OperationsProto.operationInfo); + if (responseTypeName == null || metadataTypeName == null) { + return null; + } - // These can be short names (e.g. FooMessage) or fully-qualified names with the *proto* package. - String responseTypeName = lroInfo.getResponseType(); - String metadataTypeName = lroInfo.getMetadataType(); + Message responseMessage = null; + Message metadataMessage = null; int lastDotIndex = responseTypeName.lastIndexOf('.'); boolean isResponseTypeNameShortOnly = lastDotIndex < 0; @@ -799,9 +818,6 @@ static LongrunningOperation parseLro( String metadataTypeShortName = lastDotIndex >= 0 ? metadataTypeName.substring(lastDotIndex + 1) : metadataTypeName; - Message responseMessage = null; - Message metadataMessage = null; - // The messageTypes map keys to the Java fully-qualified name. for (Map.Entry messageEntry : messageTypes.entrySet()) { String messageKey = messageEntry.getKey(); @@ -844,7 +860,11 @@ static LongrunningOperation parseLro( "LRO metadata message %s not found in method %s", metadataTypeName, methodDescriptor.getName())); - return LongrunningOperation.withTypes(responseMessage.type(), metadataMessage.type()); + return LongrunningOperation.builder() + .setResponseType(responseMessage.type()) + .setMetadataType(metadataMessage.type()) + .setOperationServiceStubType(operationServiceStubType) + .build(); } @VisibleForTesting diff --git a/src/test/java/com/google/api/generator/gapic/composer/rest/goldens/HttpJsonComplianceCallableFactory.golden b/src/test/java/com/google/api/generator/gapic/composer/rest/goldens/HttpJsonComplianceCallableFactory.golden index f2b65c4025..8db61290e0 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/rest/goldens/HttpJsonComplianceCallableFactory.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/rest/goldens/HttpJsonComplianceCallableFactory.golden @@ -13,7 +13,6 @@ import com.google.api.gax.rpc.OperationCallable; import com.google.api.gax.rpc.PagedCallSettings; import com.google.api.gax.rpc.UnaryCallSettings; import com.google.api.gax.rpc.UnaryCallable; -import com.google.cloud.compute.v1.stub.RequestT; import com.google.longrunning.Operation; import javax.annotation.Generated; diff --git a/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposerTest.java index 4031df1c0a..e3ca743d8d 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposerTest.java +++ b/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposerTest.java @@ -104,7 +104,11 @@ public void composeClassHeaderMethodSampleCode_firstMethodIsNotUnaryRpc() { .setName("WaitMetadata") .setPakkage(SHOWCASE_PACKAGE_NAME) .build()); - LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType); + LongrunningOperation lro = + LongrunningOperation.builder() + .setResponseType(responseType) + .setMetadataType(metadataType) + .build(); TypeNode ttlTypeNode = TypeNode.withReference( VaporReference.builder().setName("Duration").setPakkage(PROTO_PACKAGE_NAME).build()); @@ -1252,7 +1256,11 @@ public void validComposeRpcMethodHeaderSampleCode_lroUnaryRpcWithNoMethodArgumen .setName("WaitMetadata") .setPakkage(SHOWCASE_PACKAGE_NAME) .build()); - LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType); + LongrunningOperation lro = + LongrunningOperation.builder() + .setResponseType(responseType) + .setMetadataType(metadataType) + .build(); Method method = Method.builder() .setName("Wait") @@ -1305,7 +1313,11 @@ public void validComposeRpcMethodHeaderSampleCode_lroRpcWithReturnResponseType() .setName("WaitMetadata") .setPakkage(SHOWCASE_PACKAGE_NAME) .build()); - LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType); + LongrunningOperation lro = + LongrunningOperation.builder() + .setResponseType(responseType) + .setMetadataType(metadataType) + .build(); TypeNode ttlTypeNode = TypeNode.withReference( VaporReference.builder().setName("Duration").setPakkage(PROTO_PACKAGE_NAME).build()); @@ -1372,7 +1384,11 @@ public void validComposeRpcMethodHeaderSampleCode_lroRpcWithReturnVoid() { .setName("WaitMetadata") .setPakkage(SHOWCASE_PACKAGE_NAME) .build()); - LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType); + LongrunningOperation lro = + LongrunningOperation.builder() + .setResponseType(responseType) + .setMetadataType(metadataType) + .build(); TypeNode ttlTypeNode = TypeNode.withReference( VaporReference.builder().setName("Duration").setPakkage(PROTO_PACKAGE_NAME).build()); @@ -1528,7 +1544,11 @@ public void validComposeRpcDefaultMethodHeaderSampleCode_hasLroMethodWithReturnR .setName("WaitMetadata") .setPakkage(SHOWCASE_PACKAGE_NAME) .build()); - LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType); + LongrunningOperation lro = + LongrunningOperation.builder() + .setResponseType(responseType) + .setMetadataType(metadataType) + .build(); Method method = Method.builder() .setName("Wait") @@ -1581,7 +1601,11 @@ public void validComposeRpcDefaultMethodHeaderSampleCode_hasLroMethodWithReturnV .setName("WaitMetadata") .setPakkage(SHOWCASE_PACKAGE_NAME) .build()); - LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType); + LongrunningOperation lro = + LongrunningOperation.builder() + .setResponseType(responseType) + .setMetadataType(metadataType) + .build(); Method method = Method.builder() .setName("Wait") @@ -1732,7 +1756,11 @@ public void validComposeLroCallableMethodHeaderSampleCode_withReturnResponse() { .setName("WaitMetadata") .setPakkage(SHOWCASE_PACKAGE_NAME) .build()); - LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType); + LongrunningOperation lro = + LongrunningOperation.builder() + .setResponseType(responseType) + .setMetadataType(metadataType) + .build(); Method method = Method.builder() .setName("Wait") @@ -1784,7 +1812,11 @@ public void validComposeLroCallableMethodHeaderSampleCode_withReturnVoid() { .setName("WaitMetadata") .setPakkage(SHOWCASE_PACKAGE_NAME) .build()); - LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType); + LongrunningOperation lro = + LongrunningOperation.builder() + .setResponseType(responseType) + .setMetadataType(metadataType) + .build(); Method method = Method.builder() .setName("Wait") @@ -2348,7 +2380,11 @@ public void validComposeRegularCallableMethodHeaderSampleCode_lroRpc() { .setName("WaitMetadata") .setPakkage(SHOWCASE_PACKAGE_NAME) .build()); - LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType); + LongrunningOperation lro = + LongrunningOperation.builder() + .setResponseType(responseType) + .setMetadataType(metadataType) + .build(); Method method = Method.builder() .setName("Wait") @@ -2399,7 +2435,11 @@ public void validComposeRegularCallableMethodHeaderSampleCode_lroRpcWithReturnVo .setName("WaitMetadata") .setPakkage(SHOWCASE_PACKAGE_NAME) .build()); - LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType); + LongrunningOperation lro = + LongrunningOperation.builder() + .setResponseType(responseType) + .setMetadataType(metadataType) + .build(); Method method = Method.builder() .setName("Wait") diff --git a/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java b/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java index d9a31c9fd4..c9e6dbd3e2 100644 --- a/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java +++ b/src/test/java/com/google/api/generator/gapic/protoparser/ParserTest.java @@ -201,7 +201,7 @@ public void parseLro_missingResponseType() { assertEquals("Wait", waitMethodDescriptor.getName()); messageTypes.remove("com.google.showcase.v1beta1.WaitResponse"); assertThrows( - NullPointerException.class, () -> Parser.parseLro(waitMethodDescriptor, messageTypes)); + NullPointerException.class, () -> Parser.parseLro("", waitMethodDescriptor, messageTypes)); } @Test @@ -211,7 +211,7 @@ public void parseLro_missingMetadataType() { assertEquals("Wait", waitMethodDescriptor.getName()); messageTypes.remove("com.google.showcase.v1beta1.WaitMetadata"); assertThrows( - NullPointerException.class, () -> Parser.parseLro(waitMethodDescriptor, messageTypes)); + NullPointerException.class, () -> Parser.parseLro("", waitMethodDescriptor, messageTypes)); } @Test diff --git a/test/integration/goldens/compute/com/google/cloud/compute/v1/AddressesClient.java b/test/integration/goldens/compute/com/google/cloud/compute/v1/AddressesClient.java index eb9db7ce24..7173f3bce5 100644 --- a/test/integration/goldens/compute/com/google/cloud/compute/v1/AddressesClient.java +++ b/test/integration/goldens/compute/com/google/cloud/compute/v1/AddressesClient.java @@ -20,9 +20,11 @@ import com.google.api.core.ApiFutures; import com.google.api.core.BetaApi; import com.google.api.gax.core.BackgroundResource; +import com.google.api.gax.longrunning.OperationFuture; import com.google.api.gax.paging.AbstractFixedSizeCollection; import com.google.api.gax.paging.AbstractPage; import com.google.api.gax.paging.AbstractPagedListResponse; +import com.google.api.gax.rpc.OperationCallable; import com.google.api.gax.rpc.PageContext; import com.google.api.gax.rpc.UnaryCallable; import com.google.cloud.compute.v1.stub.AddressesStub; @@ -46,9 +48,10 @@ *
{@code
  * try (AddressesClient addressesClient = AddressesClient.create()) {
  *   String project = "project-309310695";
- *   String region = "region-934795532";
- *   String address = "address-1147692044";
- *   Operation response = addressesClient.delete(project, region, address);
+ *   for (Map.Entry element :
+ *       addressesClient.aggregatedList(project).iterateAll()) {
+ *     // doThingsWith(element);
+ *   }
  * }
  * }
* @@ -284,7 +287,7 @@ public final AggregatedListPagedResponse aggregatedList(AggregatedListAddressesR * String project = "project-309310695"; * String region = "region-934795532"; * String address = "address-1147692044"; - * Operation response = addressesClient.delete(project, region, address); + * Operation response = addressesClient.deleteAsync(project, region, address).get(); * } * } * @@ -293,14 +296,15 @@ public final AggregatedListPagedResponse aggregatedList(AggregatedListAddressesR * @param address Name of the address resource to delete. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ - public final Operation delete(String project, String region, String address) { + public final OperationFuture deleteAsync( + String project, String region, String address) { DeleteAddressRequest request = DeleteAddressRequest.newBuilder() .setProject(project) .setRegion(region) .setAddress(address) .build(); - return delete(request); + return deleteAsync(request); } // AUTO-GENERATED DOCUMENTATION AND METHOD. @@ -318,15 +322,42 @@ public final Operation delete(String project, String region, String address) { * .setRegion("region-934795532") * .setRequestId("requestId693933066") * .build(); - * Operation response = addressesClient.delete(request); + * Operation response = addressesClient.deleteAsync(request).get(); * } * } * * @param request The request object containing all of the parameters for the API call. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ - public final Operation delete(DeleteAddressRequest request) { - return deleteCallable().call(request); + public final OperationFuture deleteAsync(DeleteAddressRequest request) { + return deleteOperationCallable().futureCall(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Deletes the specified address resource. + * + *

Sample code: + * + *

{@code
+   * try (AddressesClient addressesClient = AddressesClient.create()) {
+   *   DeleteAddressRequest request =
+   *       DeleteAddressRequest.newBuilder()
+   *           .setAddress("address-1147692044")
+   *           .setProject("project-309310695")
+   *           .setRegion("region-934795532")
+   *           .setRequestId("requestId693933066")
+   *           .build();
+   *   OperationFuture future =
+   *       addressesClient.deleteOperationCallable().futureCall(request);
+   *   // Do something.
+   *   Operation response = future.get();
+   * }
+   * }
+ */ + public final OperationCallable + deleteOperationCallable() { + return stub.deleteOperationCallable(); } // AUTO-GENERATED DOCUMENTATION AND METHOD. @@ -365,7 +396,7 @@ public final UnaryCallable deleteCallable() { * String project = "project-309310695"; * String region = "region-934795532"; * Address addressResource = Address.newBuilder().build(); - * Operation response = addressesClient.insert(project, region, addressResource); + * Operation response = addressesClient.insertAsync(project, region, addressResource).get(); * } * } * @@ -374,14 +405,15 @@ public final UnaryCallable deleteCallable() { * @param addressResource The body resource for this request * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ - public final Operation insert(String project, String region, Address addressResource) { + public final OperationFuture insertAsync( + String project, String region, Address addressResource) { InsertAddressRequest request = InsertAddressRequest.newBuilder() .setProject(project) .setRegion(region) .setAddressResource(addressResource) .build(); - return insert(request); + return insertAsync(request); } // AUTO-GENERATED DOCUMENTATION AND METHOD. @@ -399,15 +431,42 @@ public final Operation insert(String project, String region, Address addressReso * .setRegion("region-934795532") * .setRequestId("requestId693933066") * .build(); - * Operation response = addressesClient.insert(request); + * Operation response = addressesClient.insertAsync(request).get(); * } * } * * @param request The request object containing all of the parameters for the API call. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ - public final Operation insert(InsertAddressRequest request) { - return insertCallable().call(request); + public final OperationFuture insertAsync(InsertAddressRequest request) { + return insertOperationCallable().futureCall(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Creates an address resource in the specified project by using the data included in the request. + * + *

Sample code: + * + *

{@code
+   * try (AddressesClient addressesClient = AddressesClient.create()) {
+   *   InsertAddressRequest request =
+   *       InsertAddressRequest.newBuilder()
+   *           .setAddressResource(Address.newBuilder().build())
+   *           .setProject("project-309310695")
+   *           .setRegion("region-934795532")
+   *           .setRequestId("requestId693933066")
+   *           .build();
+   *   OperationFuture future =
+   *       addressesClient.insertOperationCallable().futureCall(request);
+   *   // Do something.
+   *   Operation response = future.get();
+   * }
+   * }
+ */ + public final OperationCallable + insertOperationCallable() { + return stub.insertOperationCallable(); } // AUTO-GENERATED DOCUMENTATION AND METHOD. diff --git a/test/integration/goldens/compute/com/google/cloud/compute/v1/AddressesClientTest.java b/test/integration/goldens/compute/com/google/cloud/compute/v1/AddressesClientTest.java index 24d06c2f69..04f3ea46b9 100644 --- a/test/integration/goldens/compute/com/google/cloud/compute/v1/AddressesClientTest.java +++ b/test/integration/goldens/compute/com/google/cloud/compute/v1/AddressesClientTest.java @@ -30,12 +30,15 @@ import com.google.api.gax.rpc.testing.FakeStatusCode; import com.google.cloud.compute.v1.stub.HttpJsonAddressesStub; import com.google.common.collect.Lists; +import com.google.longrunning.Operation; +import com.google.protobuf.Any; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.concurrent.ExecutionException; import javax.annotation.Generated; import org.junit.After; import org.junit.AfterClass; @@ -132,8 +135,8 @@ public void aggregatedListExceptionTest() throws Exception { @Test public void deleteTest() throws Exception { - Operation expectedResponse = - Operation.newBuilder() + com.google.cloud.compute.v1.Operation expectedResponse = + com.google.cloud.compute.v1.Operation.newBuilder() .setClientOperationId("clientOperationId-1230366697") .setCreationTimestamp("creationTimestamp-370203401") .setDescription("description-1724546052") @@ -157,13 +160,20 @@ public void deleteTest() throws Exception { .addAllWarnings(new ArrayList()) .setZone("zone3744684") .build(); - mockService.addResponse(expectedResponse); + Operation resultOperation = + Operation.newBuilder() + .setName("deleteTest") + .setDone(true) + .setResponse(Any.pack(expectedResponse)) + .build(); + mockService.addResponse(resultOperation); String project = "project-309310695"; String region = "region-934795532"; String address = "address-1147692044"; - Operation actualResponse = client.delete(project, region, address); + com.google.cloud.compute.v1.Operation actualResponse = + client.deleteAsync(project, region, address).get(); Assert.assertEquals(expectedResponse, actualResponse); List actualRequests = mockService.getRequestPaths(); @@ -192,17 +202,16 @@ public void deleteExceptionTest() throws Exception { String project = "project-309310695"; String region = "region-934795532"; String address = "address-1147692044"; - client.delete(project, region, address); + client.deleteAsync(project, region, address).get(); Assert.fail("No exception raised"); - } catch (InvalidArgumentException e) { - // Expected exception. + } catch (ExecutionException e) { } } @Test public void insertTest() throws Exception { - Operation expectedResponse = - Operation.newBuilder() + com.google.cloud.compute.v1.Operation expectedResponse = + com.google.cloud.compute.v1.Operation.newBuilder() .setClientOperationId("clientOperationId-1230366697") .setCreationTimestamp("creationTimestamp-370203401") .setDescription("description-1724546052") @@ -226,13 +235,20 @@ public void insertTest() throws Exception { .addAllWarnings(new ArrayList()) .setZone("zone3744684") .build(); - mockService.addResponse(expectedResponse); + Operation resultOperation = + Operation.newBuilder() + .setName("insertTest") + .setDone(true) + .setResponse(Any.pack(expectedResponse)) + .build(); + mockService.addResponse(resultOperation); String project = "project-309310695"; String region = "region-934795532"; Address addressResource = Address.newBuilder().build(); - Operation actualResponse = client.insert(project, region, addressResource); + com.google.cloud.compute.v1.Operation actualResponse = + client.insertAsync(project, region, addressResource).get(); Assert.assertEquals(expectedResponse, actualResponse); List actualRequests = mockService.getRequestPaths(); @@ -261,10 +277,9 @@ public void insertExceptionTest() throws Exception { String project = "project-309310695"; String region = "region-934795532"; Address addressResource = Address.newBuilder().build(); - client.insert(project, region, addressResource); + client.insertAsync(project, region, addressResource).get(); Assert.fail("No exception raised"); - } catch (InvalidArgumentException e) { - // Expected exception. + } catch (ExecutionException e) { } } diff --git a/test/integration/goldens/compute/com/google/cloud/compute/v1/AddressesSettings.java b/test/integration/goldens/compute/com/google/cloud/compute/v1/AddressesSettings.java index d2dc359f73..58fbc804d6 100644 --- a/test/integration/goldens/compute/com/google/cloud/compute/v1/AddressesSettings.java +++ b/test/integration/goldens/compute/com/google/cloud/compute/v1/AddressesSettings.java @@ -27,6 +27,7 @@ import com.google.api.gax.rpc.ApiClientHeaderProvider; import com.google.api.gax.rpc.ClientContext; import com.google.api.gax.rpc.ClientSettings; +import com.google.api.gax.rpc.OperationCallSettings; import com.google.api.gax.rpc.PagedCallSettings; import com.google.api.gax.rpc.StubSettings; import com.google.api.gax.rpc.TransportChannelProvider; @@ -51,15 +52,15 @@ *

The builder of this class is recursive, so contained classes are themselves builders. When * build() is called, the tree of builders is called to create the complete settings object. * - *

For example, to set the total timeout of delete to 30 seconds: + *

For example, to set the total timeout of aggregatedList to 30 seconds: * *

{@code
  * AddressesSettings.Builder addressesSettingsBuilder = AddressesSettings.newBuilder();
  * addressesSettingsBuilder
- *     .deleteSettings()
+ *     .aggregatedListSettings()
  *     .setRetrySettings(
  *         addressesSettingsBuilder
- *             .deleteSettings()
+ *             .aggregatedListSettings()
  *             .getRetrySettings()
  *             .toBuilder()
  *             .setTotalTimeout(Duration.ofSeconds(30))
@@ -82,11 +83,23 @@ public UnaryCallSettings deleteSettings() {
     return ((AddressesStubSettings) getStubSettings()).deleteSettings();
   }
 
+  /** Returns the object with the settings used for calls to delete. */
+  public OperationCallSettings
+      deleteOperationSettings() {
+    return ((AddressesStubSettings) getStubSettings()).deleteOperationSettings();
+  }
+
   /** Returns the object with the settings used for calls to insert. */
   public UnaryCallSettings insertSettings() {
     return ((AddressesStubSettings) getStubSettings()).insertSettings();
   }
 
+  /** Returns the object with the settings used for calls to insert. */
+  public OperationCallSettings
+      insertOperationSettings() {
+    return ((AddressesStubSettings) getStubSettings()).insertOperationSettings();
+  }
+
   /** Returns the object with the settings used for calls to list. */
   public PagedCallSettings listSettings() {
     return ((AddressesStubSettings) getStubSettings()).listSettings();
@@ -201,11 +214,23 @@ public UnaryCallSettings.Builder deleteSettings
       return getStubSettingsBuilder().deleteSettings();
     }
 
+    /** Returns the builder for the settings used for calls to delete. */
+    public OperationCallSettings.Builder
+        deleteOperationSettings() {
+      return getStubSettingsBuilder().deleteOperationSettings();
+    }
+
     /** Returns the builder for the settings used for calls to insert. */
     public UnaryCallSettings.Builder insertSettings() {
       return getStubSettingsBuilder().insertSettings();
     }
 
+    /** Returns the builder for the settings used for calls to insert. */
+    public OperationCallSettings.Builder
+        insertOperationSettings() {
+      return getStubSettingsBuilder().insertOperationSettings();
+    }
+
     /** Returns the builder for the settings used for calls to list. */
     public PagedCallSettings.Builder
         listSettings() {
diff --git a/test/integration/goldens/compute/com/google/cloud/compute/v1/gapic_metadata.json b/test/integration/goldens/compute/com/google/cloud/compute/v1/gapic_metadata.json
index 14eb0320fd..d2f2df6b3d 100644
--- a/test/integration/goldens/compute/com/google/cloud/compute/v1/gapic_metadata.json
+++ b/test/integration/goldens/compute/com/google/cloud/compute/v1/gapic_metadata.json
@@ -14,10 +14,10 @@
               "methods": ["aggregatedList", "aggregatedList", "aggregatedListPagedCallable", "aggregatedListCallable"]
             },
             "Delete": {
-              "methods": ["delete", "delete", "deleteCallable"]
+              "methods": ["deleteAsync", "deleteAsync", "deleteOperationCallable", "deleteCallable"]
             },
             "Insert": {
-              "methods": ["insert", "insert", "insertCallable"]
+              "methods": ["insertAsync", "insertAsync", "insertOperationCallable", "insertCallable"]
             },
             "List": {
               "methods": ["list", "list", "listPagedCallable", "listCallable"]
diff --git a/test/integration/goldens/compute/com/google/cloud/compute/v1/package-info.java b/test/integration/goldens/compute/com/google/cloud/compute/v1/package-info.java
index 941f3ab751..e525d9c7df 100644
--- a/test/integration/goldens/compute/com/google/cloud/compute/v1/package-info.java
+++ b/test/integration/goldens/compute/com/google/cloud/compute/v1/package-info.java
@@ -28,9 +28,10 @@
  * 
{@code
  * try (AddressesClient addressesClient = AddressesClient.create()) {
  *   String project = "project-309310695";
- *   String region = "region-934795532";
- *   String address = "address-1147692044";
- *   Operation response = addressesClient.delete(project, region, address);
+ *   for (Map.Entry element :
+ *       addressesClient.aggregatedList(project).iterateAll()) {
+ *     // doThingsWith(element);
+ *   }
  * }
  * }
* diff --git a/test/integration/goldens/compute/com/google/cloud/compute/v1/stub/AddressesStub.java b/test/integration/goldens/compute/com/google/cloud/compute/v1/stub/AddressesStub.java index b7d7f6e590..551b0ec0eb 100644 --- a/test/integration/goldens/compute/com/google/cloud/compute/v1/stub/AddressesStub.java +++ b/test/integration/goldens/compute/com/google/cloud/compute/v1/stub/AddressesStub.java @@ -20,6 +20,7 @@ import static com.google.cloud.compute.v1.AddressesClient.ListPagedResponse; import com.google.api.gax.core.BackgroundResource; +import com.google.api.gax.rpc.OperationCallable; import com.google.api.gax.rpc.UnaryCallable; import com.google.cloud.compute.v1.AddressAggregatedList; import com.google.cloud.compute.v1.AddressList; @@ -39,6 +40,10 @@ @Generated("by gapic-generator-java") public abstract class AddressesStub implements BackgroundResource { + public RegionOperationsStub getOperationsStub() { + throw new UnsupportedOperationException("Not implemented: getOperationsStub()"); + } + public UnaryCallable aggregatedListPagedCallable() { throw new UnsupportedOperationException("Not implemented: aggregatedListPagedCallable()"); @@ -49,10 +54,18 @@ public abstract class AddressesStub implements BackgroundResource { throw new UnsupportedOperationException("Not implemented: aggregatedListCallable()"); } + public OperationCallable deleteOperationCallable() { + throw new UnsupportedOperationException("Not implemented: deleteOperationCallable()"); + } + public UnaryCallable deleteCallable() { throw new UnsupportedOperationException("Not implemented: deleteCallable()"); } + public OperationCallable insertOperationCallable() { + throw new UnsupportedOperationException("Not implemented: insertOperationCallable()"); + } + public UnaryCallable insertCallable() { throw new UnsupportedOperationException("Not implemented: insertCallable()"); } diff --git a/test/integration/goldens/compute/com/google/cloud/compute/v1/stub/AddressesStubSettings.java b/test/integration/goldens/compute/com/google/cloud/compute/v1/stub/AddressesStubSettings.java index 69e3c4d6c0..55866e3401 100644 --- a/test/integration/goldens/compute/com/google/cloud/compute/v1/stub/AddressesStubSettings.java +++ b/test/integration/goldens/compute/com/google/cloud/compute/v1/stub/AddressesStubSettings.java @@ -25,13 +25,17 @@ import com.google.api.gax.core.GaxProperties; import com.google.api.gax.core.GoogleCredentialsProvider; import com.google.api.gax.core.InstantiatingExecutorProvider; +import com.google.api.gax.grpc.ProtoOperationTransformers; import com.google.api.gax.httpjson.GaxHttpJsonProperties; import com.google.api.gax.httpjson.HttpJsonTransportChannel; import com.google.api.gax.httpjson.InstantiatingHttpJsonChannelProvider; +import com.google.api.gax.longrunning.OperationSnapshot; +import com.google.api.gax.longrunning.OperationTimedPollAlgorithm; import com.google.api.gax.retrying.RetrySettings; import com.google.api.gax.rpc.ApiCallContext; import com.google.api.gax.rpc.ApiClientHeaderProvider; import com.google.api.gax.rpc.ClientContext; +import com.google.api.gax.rpc.OperationCallSettings; import com.google.api.gax.rpc.PageContext; import com.google.api.gax.rpc.PagedCallSettings; import com.google.api.gax.rpc.PagedListDescriptor; @@ -76,15 +80,15 @@ *

The builder of this class is recursive, so contained classes are themselves builders. When * build() is called, the tree of builders is called to create the complete settings object. * - *

For example, to set the total timeout of delete to 30 seconds: + *

For example, to set the total timeout of aggregatedList to 30 seconds: * *

{@code
  * AddressesStubSettings.Builder addressesSettingsBuilder = AddressesStubSettings.newBuilder();
  * addressesSettingsBuilder
- *     .deleteSettings()
+ *     .aggregatedListSettings()
  *     .setRetrySettings(
  *         addressesSettingsBuilder
- *             .deleteSettings()
+ *             .aggregatedListSettings()
  *             .getRetrySettings()
  *             .toBuilder()
  *             .setTotalTimeout(Duration.ofSeconds(30))
@@ -105,7 +109,11 @@ public class AddressesStubSettings extends StubSettings {
           AggregatedListAddressesRequest, AddressAggregatedList, AggregatedListPagedResponse>
       aggregatedListSettings;
   private final UnaryCallSettings deleteSettings;
+  private final OperationCallSettings
+      deleteOperationSettings;
   private final UnaryCallSettings insertSettings;
+  private final OperationCallSettings
+      insertOperationSettings;
   private final PagedCallSettings
       listSettings;
 
@@ -243,11 +251,23 @@ public UnaryCallSettings deleteSettings() {
     return deleteSettings;
   }
 
+  /** Returns the object with the settings used for calls to delete. */
+  public OperationCallSettings
+      deleteOperationSettings() {
+    return deleteOperationSettings;
+  }
+
   /** Returns the object with the settings used for calls to insert. */
   public UnaryCallSettings insertSettings() {
     return insertSettings;
   }
 
+  /** Returns the object with the settings used for calls to insert. */
+  public OperationCallSettings
+      insertOperationSettings() {
+    return insertOperationSettings;
+  }
+
   /** Returns the object with the settings used for calls to list. */
   public PagedCallSettings listSettings() {
     return listSettings;
@@ -329,7 +349,9 @@ protected AddressesStubSettings(Builder settingsBuilder) throws IOException {
 
     aggregatedListSettings = settingsBuilder.aggregatedListSettings().build();
     deleteSettings = settingsBuilder.deleteSettings().build();
+    deleteOperationSettings = settingsBuilder.deleteOperationSettings().build();
     insertSettings = settingsBuilder.insertSettings().build();
+    insertOperationSettings = settingsBuilder.insertOperationSettings().build();
     listSettings = settingsBuilder.listSettings().build();
   }
 
@@ -340,7 +362,11 @@ public static class Builder extends StubSettings.Builder
         aggregatedListSettings;
     private final UnaryCallSettings.Builder deleteSettings;
+    private final OperationCallSettings.Builder
+        deleteOperationSettings;
     private final UnaryCallSettings.Builder insertSettings;
+    private final OperationCallSettings.Builder
+        insertOperationSettings;
     private final PagedCallSettings.Builder
         listSettings;
     private static final ImmutableMap>
@@ -395,7 +421,9 @@ protected Builder(ClientContext clientContext) {
 
       aggregatedListSettings = PagedCallSettings.newBuilder(AGGREGATED_LIST_PAGE_STR_FACT);
       deleteSettings = UnaryCallSettings.newUnaryCallSettingsBuilder();
+      deleteOperationSettings = OperationCallSettings.newBuilder();
       insertSettings = UnaryCallSettings.newUnaryCallSettingsBuilder();
+      insertOperationSettings = OperationCallSettings.newBuilder();
       listSettings = PagedCallSettings.newBuilder(LIST_PAGE_STR_FACT);
 
       unaryMethodSettingsBuilders =
@@ -409,7 +437,9 @@ protected Builder(AddressesStubSettings settings) {
 
       aggregatedListSettings = settings.aggregatedListSettings.toBuilder();
       deleteSettings = settings.deleteSettings.toBuilder();
+      deleteOperationSettings = settings.deleteOperationSettings.toBuilder();
       insertSettings = settings.insertSettings.toBuilder();
+      insertOperationSettings = settings.insertOperationSettings.toBuilder();
       listSettings = settings.listSettings.toBuilder();
 
       unaryMethodSettingsBuilders =
@@ -451,6 +481,54 @@ private static Builder initDefaults(Builder builder) {
           .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("retry_policy_0_codes"))
           .setRetrySettings(RETRY_PARAM_DEFINITIONS.get("retry_policy_0_params"));
 
+      builder
+          .deleteOperationSettings()
+          .setInitialCallSettings(
+              UnaryCallSettings
+                  .newUnaryCallSettingsBuilder()
+                  .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("no_retry_1_codes"))
+                  .setRetrySettings(RETRY_PARAM_DEFINITIONS.get("no_retry_1_params"))
+                  .build())
+          .setResponseTransformer(
+              ProtoOperationTransformers.ResponseTransformer.create(Operation.class))
+          .setMetadataTransformer(
+              ProtoOperationTransformers.MetadataTransformer.create(Operation.class))
+          .setPollingAlgorithm(
+              OperationTimedPollAlgorithm.create(
+                  RetrySettings.newBuilder()
+                      .setInitialRetryDelay(Duration.ofMillis(5000L))
+                      .setRetryDelayMultiplier(1.5)
+                      .setMaxRetryDelay(Duration.ofMillis(45000L))
+                      .setInitialRpcTimeout(Duration.ZERO)
+                      .setRpcTimeoutMultiplier(1.0)
+                      .setMaxRpcTimeout(Duration.ZERO)
+                      .setTotalTimeout(Duration.ofMillis(300000L))
+                      .build()));
+
+      builder
+          .insertOperationSettings()
+          .setInitialCallSettings(
+              UnaryCallSettings
+                  .newUnaryCallSettingsBuilder()
+                  .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("no_retry_1_codes"))
+                  .setRetrySettings(RETRY_PARAM_DEFINITIONS.get("no_retry_1_params"))
+                  .build())
+          .setResponseTransformer(
+              ProtoOperationTransformers.ResponseTransformer.create(Operation.class))
+          .setMetadataTransformer(
+              ProtoOperationTransformers.MetadataTransformer.create(Operation.class))
+          .setPollingAlgorithm(
+              OperationTimedPollAlgorithm.create(
+                  RetrySettings.newBuilder()
+                      .setInitialRetryDelay(Duration.ofMillis(5000L))
+                      .setRetryDelayMultiplier(1.5)
+                      .setMaxRetryDelay(Duration.ofMillis(45000L))
+                      .setInitialRpcTimeout(Duration.ZERO)
+                      .setRpcTimeoutMultiplier(1.0)
+                      .setMaxRpcTimeout(Duration.ZERO)
+                      .setTotalTimeout(Duration.ofMillis(300000L))
+                      .build()));
+
       return builder;
     }
 
@@ -481,11 +559,27 @@ public UnaryCallSettings.Builder deleteSettings
       return deleteSettings;
     }
 
+    /** Returns the builder for the settings used for calls to delete. */
+    @BetaApi(
+        "The surface for use by generated code is not stable yet and may change in the future.")
+    public OperationCallSettings.Builder
+        deleteOperationSettings() {
+      return deleteOperationSettings;
+    }
+
     /** Returns the builder for the settings used for calls to insert. */
     public UnaryCallSettings.Builder insertSettings() {
       return insertSettings;
     }
 
+    /** Returns the builder for the settings used for calls to insert. */
+    @BetaApi(
+        "The surface for use by generated code is not stable yet and may change in the future.")
+    public OperationCallSettings.Builder
+        insertOperationSettings() {
+      return insertOperationSettings;
+    }
+
     /** Returns the builder for the settings used for calls to list. */
     public PagedCallSettings.Builder
         listSettings() {
diff --git a/test/integration/goldens/compute/com/google/cloud/compute/v1/stub/HttpJsonAddressesCallableFactory.java b/test/integration/goldens/compute/com/google/cloud/compute/v1/stub/HttpJsonAddressesCallableFactory.java
index b9e0385e12..2290fc6952 100644
--- a/test/integration/goldens/compute/com/google/cloud/compute/v1/stub/HttpJsonAddressesCallableFactory.java
+++ b/test/integration/goldens/compute/com/google/cloud/compute/v1/stub/HttpJsonAddressesCallableFactory.java
@@ -17,7 +17,6 @@
 package com.google.cloud.compute.v1.stub;
 
 import com.google.api.core.BetaApi;
-import com.google.api.gax.core.BackgroundResource;
 import com.google.api.gax.httpjson.HttpJsonCallSettings;
 import com.google.api.gax.httpjson.HttpJsonCallableFactory;
 import com.google.api.gax.httpjson.HttpJsonOperationSnapshotCallable;
@@ -29,7 +28,7 @@
 import com.google.api.gax.rpc.PagedCallSettings;
 import com.google.api.gax.rpc.UnaryCallSettings;
 import com.google.api.gax.rpc.UnaryCallable;
-import com.google.longrunning.Operation;
+import com.google.cloud.compute.v1.Operation;
 import javax.annotation.Generated;
 
 // AUTO-GENERATED DOCUMENTATION AND CLASS.
@@ -41,7 +40,7 @@
 @Generated("by gapic-generator-java")
 @BetaApi
 public class HttpJsonAddressesCallableFactory
-    implements HttpJsonStubCallableFactory {
+    implements HttpJsonStubCallableFactory {
 
   @Override
   public  UnaryCallable createUnaryCallable(
@@ -79,7 +78,7 @@ OperationCallable createOperationCallable(
           HttpJsonCallSettings httpJsonCallSettings,
           OperationCallSettings callSettings,
           ClientContext clientContext,
-          BackgroundResource operationsStub) {
+          RegionOperationsStub operationsStub) {
     UnaryCallable innerCallable =
         HttpJsonCallableFactory.createBaseUnaryCallable(
             httpJsonCallSettings, callSettings.getInitialCallSettings(), clientContext);
diff --git a/test/integration/goldens/compute/com/google/cloud/compute/v1/stub/HttpJsonAddressesStub.java b/test/integration/goldens/compute/com/google/cloud/compute/v1/stub/HttpJsonAddressesStub.java
index d79d2cc64a..943580e59b 100644
--- a/test/integration/goldens/compute/com/google/cloud/compute/v1/stub/HttpJsonAddressesStub.java
+++ b/test/integration/goldens/compute/com/google/cloud/compute/v1/stub/HttpJsonAddressesStub.java
@@ -33,6 +33,7 @@
 import com.google.api.gax.httpjson.ProtoRestSerializer;
 import com.google.api.gax.longrunning.OperationSnapshot;
 import com.google.api.gax.rpc.ClientContext;
+import com.google.api.gax.rpc.OperationCallable;
 import com.google.api.gax.rpc.UnaryCallable;
 import com.google.cloud.compute.v1.AddressAggregatedList;
 import com.google.cloud.compute.v1.AddressList;
@@ -251,11 +252,16 @@ public class HttpJsonAddressesStub extends AddressesStub {
   private final UnaryCallable
       aggregatedListPagedCallable;
   private final UnaryCallable deleteCallable;
+  private final OperationCallable
+      deleteOperationCallable;
   private final UnaryCallable insertCallable;
+  private final OperationCallable
+      insertOperationCallable;
   private final UnaryCallable listCallable;
   private final UnaryCallable listPagedCallable;
 
   private final BackgroundResource backgroundResources;
+  private final HttpJsonRegionOperationsStub operationsStub;
   private final HttpJsonStubCallableFactory callableFactory;
 
   public static final HttpJsonAddressesStub create(AddressesStubSettings settings)
@@ -294,6 +300,7 @@ protected HttpJsonAddressesStub(
       HttpJsonStubCallableFactory callableFactory)
       throws IOException {
     this.callableFactory = callableFactory;
+    this.operationsStub = HttpJsonRegionOperationsStub.create(clientContext, callableFactory);
 
     HttpJsonCallSettings
         aggregatedListTransportSettings =
@@ -322,9 +329,21 @@ protected HttpJsonAddressesStub(
     this.deleteCallable =
         callableFactory.createUnaryCallable(
             deleteTransportSettings, settings.deleteSettings(), clientContext);
+    this.deleteOperationCallable =
+        callableFactory.createOperationCallable(
+            deleteTransportSettings,
+            settings.deleteOperationSettings(),
+            clientContext,
+            operationsStub);
     this.insertCallable =
         callableFactory.createUnaryCallable(
             insertTransportSettings, settings.insertSettings(), clientContext);
+    this.insertOperationCallable =
+        callableFactory.createOperationCallable(
+            insertTransportSettings,
+            settings.insertOperationSettings(),
+            clientContext,
+            operationsStub);
     this.listCallable =
         callableFactory.createUnaryCallable(
             listTransportSettings, settings.listSettings(), clientContext);
@@ -363,11 +382,21 @@ public UnaryCallable deleteCallable() {
     return deleteCallable;
   }
 
+  @Override
+  public OperationCallable deleteOperationCallable() {
+    return deleteOperationCallable;
+  }
+
   @Override
   public UnaryCallable insertCallable() {
     return insertCallable;
   }
 
+  @Override
+  public OperationCallable insertOperationCallable() {
+    return insertOperationCallable;
+  }
+
   @Override
   public UnaryCallable listCallable() {
     return listCallable;